mirror of
https://github.com/wismna/ModernKeePass.git
synced 2025-10-04 16:10:16 -04:00
Compare commits
116 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
aec09a6890 | ||
![]() |
8e557c608e | ||
![]() |
991a678788 | ||
![]() |
b88d6131c5 | ||
![]() |
c25ae2ad0f | ||
![]() |
2abab27d5c | ||
![]() |
a91f8b6c5c | ||
![]() |
83d37d943f | ||
![]() |
81ca11a955 | ||
![]() |
931f79ac16 | ||
![]() |
2ab84ef4af | ||
![]() |
056d1af9d0 | ||
![]() |
34f5f2f6c8 | ||
![]() |
6d32161312 | ||
![]() |
df6914d1e0 | ||
![]() |
6f277e7b33 | ||
![]() |
7ffcf1c82b | ||
![]() |
c6e27c35c8 | ||
![]() |
a6f82b4541 | ||
![]() |
d533abada5 | ||
![]() |
4393aada3e | ||
![]() |
559fbe65c3 | ||
![]() |
803dab0fb5 | ||
![]() |
ca377a6684 | ||
![]() |
188233cc81 | ||
![]() |
408b4eed90 | ||
![]() |
b456e56789 | ||
![]() |
9225732c1a | ||
![]() |
e9601e8d13 | ||
![]() |
b1ded11fa5 | ||
![]() |
978929ba48 | ||
![]() |
7e337c4a40 | ||
![]() |
62c9719a77 | ||
![]() |
2b48b64f2f | ||
![]() |
799b896bfe | ||
![]() |
8a5db88225 | ||
![]() |
cc65c56042 | ||
![]() |
0a4df01354 | ||
![]() |
25945b8b3b | ||
![]() |
9921a4db52 | ||
![]() |
2c6530f3b0 | ||
![]() |
f158191e52 | ||
![]() |
a7f2ae91a7 | ||
![]() |
49e1b709f7 | ||
![]() |
59c903b635 | ||
![]() |
c9d599216d | ||
![]() |
8fa3a75a63 | ||
![]() |
e31d1edb99 | ||
![]() |
915cad8c85 | ||
![]() |
7bd6c0dd09 | ||
![]() |
0aa8e886ce | ||
![]() |
1334b266b9 | ||
![]() |
9566c9a719 | ||
![]() |
0643701c4a | ||
![]() |
4d86c25411 | ||
![]() |
ad02740d8a | ||
![]() |
0b95669db0 | ||
![]() |
4aefbcb8b9 | ||
![]() |
56129253d9 | ||
![]() |
7613629d87 | ||
![]() |
fb0eab00c2 | ||
![]() |
5b8c3b9b11 | ||
![]() |
700f76679a | ||
![]() |
e7d731bb04 | ||
![]() |
49637fcc3b | ||
![]() |
fc25d7ea93 | ||
![]() |
cca6579274 | ||
![]() |
7dbf93fe7b | ||
![]() |
b46ab8db51 | ||
![]() |
a19519fa73 | ||
![]() |
4a3f36d38b | ||
![]() |
4ae02fc07b | ||
![]() |
047fca32bf | ||
![]() |
abbff449c0 | ||
![]() |
fba668860b | ||
![]() |
acb196d9c2 | ||
![]() |
dfa3a21e6b | ||
![]() |
7ff6bccbc4 | ||
![]() |
88e5b80778 | ||
![]() |
d127431396 | ||
![]() |
588703ecd6 | ||
![]() |
223c9b641a | ||
![]() |
7db34d6517 | ||
![]() |
13901d17ab | ||
![]() |
19bc9005e9 | ||
![]() |
7c86a325d9 | ||
![]() |
d203b521c1 | ||
![]() |
0afa59fb66 | ||
![]() |
470a08f4bc | ||
![]() |
50c5940a0a | ||
![]() |
35f64eec1b | ||
![]() |
e25f9f4aae | ||
![]() |
a86dbf9dac | ||
![]() |
026bfcba78 | ||
![]() |
3b66824c58 | ||
![]() |
898a9a0935 | ||
![]() |
7aa342cf9c | ||
![]() |
f173283a66 | ||
![]() |
4f69b5cdcc | ||
![]() |
744858df81 | ||
![]() |
f172e31250 | ||
![]() |
7530cf8006 | ||
![]() |
33223934e3 | ||
![]() |
f2731c49dd | ||
![]() |
227bc30dde | ||
![]() |
7b39fe79c8 | ||
![]() |
fcbda1e33d | ||
![]() |
42ac04b02c | ||
![]() |
7cd05cb1d8 | ||
![]() |
1b2d25e171 | ||
![]() |
675a718107 | ||
![]() |
a8f5897364 | ||
![]() |
5120c8177b | ||
![]() |
f2d97b4e7e | ||
![]() |
197e061bc5 | ||
![]() |
d1a6b418d5 |
52
ModernKeePass.Shared/ModernKeePass.Shared.csproj
Normal file
52
ModernKeePass.Shared/ModernKeePass.Shared.csproj
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<MinimumVisualStudioVersion>14.0</MinimumVisualStudioVersion>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{A3354969-5AAC-4075-8CBF-EA4805B59EFA}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>ModernKeePass.Shared</RootNamespace>
|
||||||
|
<AssemblyName>ModernKeePass.Shared</AssemblyName>
|
||||||
|
<DefaultLanguage>en-US</DefaultLanguage>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||||
|
<TargetFrameworkProfile>
|
||||||
|
</TargetFrameworkProfile>
|
||||||
|
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<!-- A reference to the entire .NET Framework is automatically included -->
|
||||||
|
<None Include="project.json" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
30
ModernKeePass.Shared/Properties/AssemblyInfo.cs
Normal file
30
ModernKeePass.Shared/Properties/AssemblyInfo.cs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
using System.Resources;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("ModernKeePass.Shared")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("ModernKeePass.Shared")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2018")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
[assembly: NeutralResourcesLanguage("en")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
|
// by using the '*' as shown below:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
10
ModernKeePass.Shared/project.json
Normal file
10
ModernKeePass.Shared/project.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"supports": {},
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.NETCore.Portable.Compatibility": "1.0.1",
|
||||||
|
"NETStandard.Library": "1.6.0"
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"netstandard1.2": {}
|
||||||
|
}
|
||||||
|
}
|
@@ -3,13 +3,13 @@ Microsoft Visual Studio Solution File, Format Version 12.00
|
|||||||
# Visual Studio 14
|
# Visual Studio 14
|
||||||
VisualStudioVersion = 14.0.25420.1
|
VisualStudioVersion = 14.0.25420.1
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModernKeePassApp", "ModernKeePass\ModernKeePassApp.csproj", "{A0CFC681-769B-405A-8482-0CDEE595A91F}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModernKeePass.App", "ModernKeePass\ModernKeePass.App.csproj", "{A0CFC681-769B-405A-8482-0CDEE595A91F}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModernKeePassLib", "ModernKeePassLib\ModernKeePassLib.csproj", "{2E710089-9559-4967-846C-E763DD1F3ACB}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModernKeePass.Lib", "ModernKeePassLib\ModernKeePass.Lib.csproj", "{2E710089-9559-4967-846C-E763DD1F3ACB}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModernKeePassLib.Test", "ModernKeePassLib.Test\ModernKeePassLib.Test.csproj", "{0A4279CF-2A67-4868-9906-052E50C25F3B}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModernKeePass.LibTest", "ModernKeePassLib.Test\ModernKeePass.LibTest.csproj", "{0A4279CF-2A67-4868-9906-052E50C25F3B}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{F5034706-568F-408A-B7B3-4D38C6DB8A32}") = "Scripts", "Scripts\Scripts.pssproj", "{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModernKeePass.AppTest", "ModernKeePassApp.Test\ModernKeePass.AppTest.csproj", "{7E80F5E7-724A-4668-9333-B10F5D75C6D0}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
@@ -87,22 +87,30 @@ Global
|
|||||||
{0A4279CF-2A67-4868-9906-052E50C25F3B}.Release|x86.ActiveCfg = Release|x86
|
{0A4279CF-2A67-4868-9906-052E50C25F3B}.Release|x86.ActiveCfg = Release|x86
|
||||||
{0A4279CF-2A67-4868-9906-052E50C25F3B}.Release|x86.Build.0 = Release|x86
|
{0A4279CF-2A67-4868-9906-052E50C25F3B}.Release|x86.Build.0 = Release|x86
|
||||||
{0A4279CF-2A67-4868-9906-052E50C25F3B}.Release|x86.Deploy.0 = Release|x86
|
{0A4279CF-2A67-4868-9906-052E50C25F3B}.Release|x86.Deploy.0 = Release|x86
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Debug|ARM.Build.0 = Debug|Any CPU
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|ARM.ActiveCfg = Debug|ARM
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Debug|x64.ActiveCfg = Debug|Any CPU
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|ARM.Build.0 = Debug|ARM
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Debug|x64.Build.0 = Debug|Any CPU
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|ARM.Deploy.0 = Debug|ARM
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Debug|x86.ActiveCfg = Debug|Any CPU
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Debug|x86.Build.0 = Debug|Any CPU
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|x64.Build.0 = Debug|x64
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|x64.Deploy.0 = Debug|x64
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Release|Any CPU.Build.0 = Release|Any CPU
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Release|ARM.ActiveCfg = Release|Any CPU
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|x86.Build.0 = Debug|x86
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Release|ARM.Build.0 = Release|Any CPU
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Debug|x86.Deploy.0 = Debug|x86
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Release|x64.ActiveCfg = Release|Any CPU
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Release|x64.Build.0 = Release|Any CPU
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Release|x86.ActiveCfg = Release|Any CPU
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|Any CPU.Deploy.0 = Release|Any CPU
|
||||||
{6CAFC0C6-A428-4D30-A9F9-700E829FEA51}.Release|x86.Build.0 = Release|Any CPU
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|ARM.ActiveCfg = Release|ARM
|
||||||
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|ARM.Build.0 = Release|ARM
|
||||||
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|ARM.Deploy.0 = Release|ARM
|
||||||
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|x64.Build.0 = Release|x64
|
||||||
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|x64.Deploy.0 = Release|x64
|
||||||
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|x86.Build.0 = Release|x86
|
||||||
|
{7E80F5E7-724A-4668-9333-B10F5D75C6D0}.Release|x86.Deploy.0 = Release|x86
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
1
ModernKeePass/.sonarqube/conf/0/ProjectOutFolderPath.txt
Normal file
1
ModernKeePass/.sonarqube/conf/0/ProjectOutFolderPath.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\out\0
|
171
ModernKeePass/.sonarqube/conf/SonarQubeAnalysisConfig.xml
Normal file
171
ModernKeePass/.sonarqube/conf/SonarQubeAnalysisConfig.xml
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<AnalysisConfig xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.sonarsource.com/msbuild/integration/2015/1">
|
||||||
|
<SonarConfigDir>C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\conf</SonarConfigDir>
|
||||||
|
<SonarOutputDir>C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\out</SonarOutputDir>
|
||||||
|
<SonarBinDir>C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\bin</SonarBinDir>
|
||||||
|
<SonarScannerWorkingDirectory>C:\Sources\Other\ModernKeePass\ModernKeePass</SonarScannerWorkingDirectory>
|
||||||
|
<HasBeginStepCommandLineCredentials>true</HasBeginStepCommandLineCredentials>
|
||||||
|
<SonarQubeHostUrl>https://sonarcloud.io</SonarQubeHostUrl>
|
||||||
|
<SonarQubeVersion>7.2.0.12953</SonarQubeVersion>
|
||||||
|
<SonarProjectKey>ModernKeePass</SonarProjectKey>
|
||||||
|
<AdditionalConfig>
|
||||||
|
<ConfigSetting Id="BuildUri" />
|
||||||
|
<ConfigSetting Id="TfsUri" />
|
||||||
|
<ConfigSetting Id="settings.file.path" Value="c:\sonar\SonarQube.Analysis.xml" />
|
||||||
|
</AdditionalConfig>
|
||||||
|
<ServerSettings>
|
||||||
|
<Property Name="sonaranalyzer-cs.nuget.packageVersion">7.1.0.5212</Property>
|
||||||
|
<Property Name="sonar.editions.jsonUrl">https://update.sonarsource.org/editions.json</Property>
|
||||||
|
<Property Name="sonar.cs.ignoreHeaderComments">true</Property>
|
||||||
|
<Property Name="sonar.cfamily.useSema">true</Property>
|
||||||
|
<Property Name="sonar.c.file.suffixes">.c,.h</Property>
|
||||||
|
<Property Name="sonar.typescript.file.suffixes">.ts,.tsx</Property>
|
||||||
|
<Property Name="email.fromName">SonarQube</Property>
|
||||||
|
<Property Name="sonar.python.xunit.skipDetails">false</Property>
|
||||||
|
<Property Name="sonar.auth.bitbucket.loginStrategy">Unique</Property>
|
||||||
|
<Property Name="sonar.plsql.jdbc.driver.class">oracle.jdbc.OracleDriver</Property>
|
||||||
|
<Property Name="sonar.go.exclusions">**/vendor/**</Property>
|
||||||
|
<Property Name="sonar.forceAuthentication">false</Property>
|
||||||
|
<Property Name="sonar.notifications.delay">60</Property>
|
||||||
|
<Property Name="sonar.cpp.file.suffixes">.cc,.cpp,.cxx,.c++,.hh,.hpp,.hxx,.h++,.ipp</Property>
|
||||||
|
<Property Name="sonaranalyzer-cs.ruleNamespace">SonarAnalyzer.CSharp</Property>
|
||||||
|
<Property Name="sonar.web.file.suffixes">.html,.xhtml,.rhtml,.shtml</Property>
|
||||||
|
<Property Name="sonar.builtInQualityProfiles.disableNotificationOnUpdate">false</Property>
|
||||||
|
<Property Name="sonar.java.failOnException">false</Property>
|
||||||
|
<Property Name="sonar.organizations.createPersonalOrg">true</Property>
|
||||||
|
<Property Name="sonar.cpd.abap.minimumTokens">100</Property>
|
||||||
|
<Property Name="sonar.jacoco.reportPaths">target/jacoco.exec, target/jacoco-it.exec</Property>
|
||||||
|
<Property Name="sonar.cpd.cross_project">false</Property>
|
||||||
|
<Property Name="sonar.vbnet.ignoreHeaderComments">true</Property>
|
||||||
|
<Property Name="sonar.leak.period">30</Property>
|
||||||
|
<Property Name="sonar.auth.github.groupsSync">false</Property>
|
||||||
|
<Property Name="sonar.dbcleaner.daysBeforeDeletingInactiveShortLivingBranches">30</Property>
|
||||||
|
<Property Name="sonar.auth.github.loginStrategy">Unique</Property>
|
||||||
|
<Property Name="sonar.auth.microsoft.enabled">true</Property>
|
||||||
|
<Property Name="sonaranalyzer-vbnet.ruleNamespace">SonarAnalyzer.VisualBasic</Property>
|
||||||
|
<Property Name="sonar.auth.microsoft.allowsUsersToSignUp">true</Property>
|
||||||
|
<Property Name="sonar.javascript.ignoreHeaderComments">true</Property>
|
||||||
|
<Property Name="sonar.dbcleaner.daysBeforeDeletingClosedIssues">730</Property>
|
||||||
|
<Property Name="sonar.dbcleaner.weeksBeforeKeepingOnlyOneSnapshotByMonth">4</Property>
|
||||||
|
<Property Name="sonar.lf.gravatarServerUrl">https://secure.gravatar.com/avatar/{EMAIL_MD5}.jpg?s={SIZE}&d=identicon</Property>
|
||||||
|
<Property Name="sonar.notifications.runningDelayBeforeReportingStatus">600</Property>
|
||||||
|
<Property Name="sonar.javascript.environments">amd, applescript, atomtest, browser, commonjs, couch, embertest, flow, greasemonkey, jasmine, jest, jquery, meteor, mocha, mongo, nashorn, node, phantomjs, prototypejs, protractor, qunit, rhino, serviceworker, shared-node-browser, shelljs, webextensions, worker, wsh, yui</Property>
|
||||||
|
<Property Name="sonar.scm.disabled">false</Property>
|
||||||
|
<Property Name="sonar.typescript.exclusions">**/node_modules/**,**/bower_components/**</Property>
|
||||||
|
<Property Name="sonar.vbnet.file.suffixes">.vb</Property>
|
||||||
|
<Property Name="sonar.abap.file.suffixes">.abap,.ab4,.flow,.asprog</Property>
|
||||||
|
<Property Name="sonar.cfamily.ignoreHeaderComments">true</Property>
|
||||||
|
<Property Name="sonar.technicalDebt.developmentCost">30</Property>
|
||||||
|
<Property Name="sonar.python.file.suffixes">py</Property>
|
||||||
|
<Property Name="sonar.cs.file.suffixes">.cs</Property>
|
||||||
|
<Property Name="sonar.plsql.file.suffixes">sql,tab,pkb</Property>
|
||||||
|
<Property Name="sonaranalyzer-vbnet.staticResourceName">SonarAnalyzer-7.1.0.5212.zip</Property>
|
||||||
|
<Property Name="sonar.java.file.suffixes">.java,.jav</Property>
|
||||||
|
<Property Name="sonar.php.file.suffixes">php,php3,php4,php5,phtml,inc</Property>
|
||||||
|
<Property Name="sonar.xml.file.suffixes">.xml,.xsd,.xsl</Property>
|
||||||
|
<Property Name="sonar.dbcleaner.weeksBeforeDeletingAllSnapshots">480</Property>
|
||||||
|
<Property Name="sonar.auth.bitbucket.allowUsersToSignUp">true</Property>
|
||||||
|
<Property Name="sonar.auth.github.enabled">true</Property>
|
||||||
|
<Property Name="sonar.javascript.jQueryObjectAliases">$, jQuery</Property>
|
||||||
|
<Property Name="sonaranalyzer-vbnet.nuget.packageVersion">7.1.0.5212</Property>
|
||||||
|
<Property Name="sonar.go.file.suffixes">.go</Property>
|
||||||
|
<Property Name="sonar.dbcleaner.weeksBeforeKeepingOnlyAnalysesWithVersion">104</Property>
|
||||||
|
<Property Name="sonar.swift.file.suffixes">.swift</Property>
|
||||||
|
<Property Name="sonar.github.endpoint">https://api.github.com</Property>
|
||||||
|
<Property Name="sonar.plsql.ignoreHeaderComments">false</Property>
|
||||||
|
<Property Name="sonar.flex.file.suffixes">as</Property>
|
||||||
|
<Property Name="sonar.auth.github.apiUrl">https://api.github.com/</Property>
|
||||||
|
<Property Name="sonar.auth.github.allowUsersToSignUp">true</Property>
|
||||||
|
<Property Name="sonar.python.xunit.reportPath">xunit-reports/xunit-result-*.xml</Property>
|
||||||
|
<Property Name="sonar.javascript.globals">angular,goog,google,OpenLayers,d3,dojo,dojox,dijit,Backbone,moment,casper</Property>
|
||||||
|
<Property Name="sonar.dbcleaner.hoursBeforeKeepingOnlyOneSnapshotByDay">24</Property>
|
||||||
|
<Property Name="sonar.auth.bitbucket.enabled">true</Property>
|
||||||
|
<Property Name="sonar.javascript.exclusions">**/node_modules/**,**/bower_components/**</Property>
|
||||||
|
<Property Name="sonar.auth.github.webUrl">https://github.com/</Property>
|
||||||
|
<Property Name="sonar.dbcleaner.cleanDirectory">true</Property>
|
||||||
|
<Property Name="sonar.onboardingTutorial.showToNewUsers">false</Property>
|
||||||
|
<Property Name="sonaranalyzer-vbnet.nuget.packageId">SonarAnalyzer.VisualBasic</Property>
|
||||||
|
<Property Name="email.from">noreply@sonarcloud.io</Property>
|
||||||
|
<Property Name="sonaranalyzer-vbnet.pluginVersion">7.1.0.5212</Property>
|
||||||
|
<Property Name="sonar.typescript.node">node</Property>
|
||||||
|
<Property Name="sonar.dbcleaner.weeksBeforeKeepingOnlyOneSnapshotByWeek">1</Property>
|
||||||
|
<Property Name="sonaranalyzer-vbnet.analyzerId">SonarAnalyzer.VisualBasic</Property>
|
||||||
|
<Property Name="email.prefix">[SonarCloud]</Property>
|
||||||
|
<Property Name="sonar.c.std">c11</Property>
|
||||||
|
<Property Name="sonaranalyzer-cs.pluginKey">csharp</Property>
|
||||||
|
<Property Name="sonar.cfamily.useCache">true</Property>
|
||||||
|
<Property Name="sonar.branch.longLivedBranches.regex">(branch|release)-.*</Property>
|
||||||
|
<Property Name="sonar.objc.file.suffixes">.m</Property>
|
||||||
|
<Property Name="sonar.go.coverage.reportPaths">coverage.out</Property>
|
||||||
|
<Property Name="sonaranalyzer-cs.staticResourceName">SonarAnalyzer-7.1.0.5212.zip</Property>
|
||||||
|
<Property Name="sonaranalyzer-cs.nuget.packageId">SonarAnalyzer.CSharp</Property>
|
||||||
|
<Property Name="sonar.auth.bitbucket.apiUrl">https://api.bitbucket.org/</Property>
|
||||||
|
<Property Name="sonar.authenticator.downcase">false</Property>
|
||||||
|
<Property Name="sonar.github.disableInlineComments">false</Property>
|
||||||
|
<Property Name="sonar.python.coverage.reportPath">coverage-reports/*coverage-*.xml</Property>
|
||||||
|
<Property Name="sonaranalyzer-cs.analyzerId">SonarAnalyzer.CSharp</Property>
|
||||||
|
<Property Name="sonar.organizations.anyoneCanCreate">true</Property>
|
||||||
|
<Property Name="sonar.technicalDebt.ratingGrid">0.05,0.1,0.2,0.5</Property>
|
||||||
|
<Property Name="sonar.lf.enableGravatar">true</Property>
|
||||||
|
<Property Name="sonar.preview.excludePlugins">devcockpit,pdfreport,governance,ldap,authaad,authgithub,authbitbucket,googleanalytics</Property>
|
||||||
|
<Property Name="sonaranalyzer-cs.pluginVersion">7.1.0.5212</Property>
|
||||||
|
<Property Name="sonar.javascript.file.suffixes">.js,.jsx,.vue</Property>
|
||||||
|
<Property Name="sonar.cpd.abap.minimumLines">20</Property>
|
||||||
|
<Property Name="sonaranalyzer-vbnet.pluginKey">vbnet</Property>
|
||||||
|
<Property Name="sonar.java.collectAnalysisErrors">true</Property>
|
||||||
|
<Property Name="sonar.updatecenter.url">https://update.sonarsource.org/update-center.properties</Property>
|
||||||
|
<Property Name="sonar.tsql.file.suffixes">.tsql</Property>
|
||||||
|
<Property Name="sonar.cpp.std">c++11</Property>
|
||||||
|
<Property Name="sonar.core.serverBaseURL">https://sonarcloud.io</Property>
|
||||||
|
<Property Name="sonar.lf.logoUrl">https://about.sonarcloud.io/images/SonarCloud-white-210px.png</Property>
|
||||||
|
<Property Name="sonar.lf.logoWidthPx">105</Property>
|
||||||
|
<Property Name="sonar.lf.aboutText"><div class="boxed-group" style="border: none; border-radius: 3px;">
|
||||||
|
<div class="boxed-group-inner clearfix" style="padding: 30px; border-radius: 3px; border: #e6e6e6 1px solid; background: #f3f3f3;">
|
||||||
|
<div style="overflow: hidden; line-height: 1.5; font-size: 16px;">
|
||||||
|
<p>
|
||||||
|
Analyze your open source and private projects on SonarCloud.
|
||||||
|
Select your <a href="https://about.sonarcloud.io">plan</a> and start improving.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div></Property>
|
||||||
|
<Property Name="sonar.core.id">AWHW8ct9-T_TB3XqouNu</Property>
|
||||||
|
<Property Name="sonar.core.startTime">07/06/2018 12:32:21</Property>
|
||||||
|
</ServerSettings>
|
||||||
|
<LocalSettings>
|
||||||
|
<Property Name="sonar.organization">geogeob</Property>
|
||||||
|
<Property Name="sonar.host.url">https://sonarcloud.io</Property>
|
||||||
|
</LocalSettings>
|
||||||
|
<AnalyzersSettings>
|
||||||
|
<AnalyzerSettings>
|
||||||
|
<Language>cs</Language>
|
||||||
|
<RuleSetFilePath>C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\conf\SonarQubeRoslyn-cs.ruleset</RuleSetFilePath>
|
||||||
|
<AnalyzerAssemblyPaths>
|
||||||
|
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\0\Google.Protobuf.dll</Path>
|
||||||
|
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\0\SonarAnalyzer.CSharp.dll</Path>
|
||||||
|
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\0\SonarAnalyzer.dll</Path>
|
||||||
|
</AnalyzerAssemblyPaths>
|
||||||
|
<AdditionalFilePaths>
|
||||||
|
<Path>C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\conf\cs\SonarLint.xml</Path>
|
||||||
|
</AdditionalFilePaths>
|
||||||
|
</AnalyzerSettings>
|
||||||
|
<AnalyzerSettings>
|
||||||
|
<Language>vbnet</Language>
|
||||||
|
<RuleSetFilePath>C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\conf\SonarQubeRoslyn-vbnet.ruleset</RuleSetFilePath>
|
||||||
|
<AnalyzerAssemblyPaths>
|
||||||
|
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\1\SonarAnalyzer.VisualBasic.nuspec</Path>
|
||||||
|
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\1\[Content_Types].xml</Path>
|
||||||
|
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\1\analyzers\Google.Protobuf.dll</Path>
|
||||||
|
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\1\analyzers\SonarAnalyzer.dll</Path>
|
||||||
|
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\1\analyzers\SonarAnalyzer.VisualBasic.dll</Path>
|
||||||
|
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\1\package\services\metadata\core-properties\f124441cdae948bb922ac980ea59570c.psmdcp</Path>
|
||||||
|
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\1\tools\install.ps1</Path>
|
||||||
|
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\1\tools\uninstall.ps1</Path>
|
||||||
|
<Path>C:\Users\GBE\AppData\Local\Temp\.sonarqube\resources\1\_rels\.rels</Path>
|
||||||
|
</AnalyzerAssemblyPaths>
|
||||||
|
<AdditionalFilePaths>
|
||||||
|
<Path>C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\conf\vbnet\SonarLint.xml</Path>
|
||||||
|
</AdditionalFilePaths>
|
||||||
|
</AnalyzerSettings>
|
||||||
|
</AnalyzersSettings>
|
||||||
|
</AnalysisConfig>
|
348
ModernKeePass/.sonarqube/conf/SonarQubeRoslyn-cs.ruleset
Normal file
348
ModernKeePass/.sonarqube/conf/SonarQubeRoslyn-cs.ruleset
Normal file
@@ -0,0 +1,348 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RuleSet xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="Rules for SonarQube" Description="This rule set was automatically generated from SonarQube" ToolsVersion="14.0">
|
||||||
|
<Rules AnalyzerId="SonarAnalyzer.CSharp" RuleNamespace="SonarAnalyzer.CSharp">
|
||||||
|
<Rule Id="S2589" Action="Warning" />
|
||||||
|
<Rule Id="S3433" Action="Warning" />
|
||||||
|
<Rule Id="S4061" Action="Warning" />
|
||||||
|
<Rule Id="S1121" Action="Warning" />
|
||||||
|
<Rule Id="S1854" Action="Warning" />
|
||||||
|
<Rule Id="S4457" Action="Warning" />
|
||||||
|
<Rule Id="S4456" Action="Warning" />
|
||||||
|
<Rule Id="S2278" Action="Warning" />
|
||||||
|
<Rule Id="S4211" Action="Warning" />
|
||||||
|
<Rule Id="S3923" Action="Warning" />
|
||||||
|
<Rule Id="S4426" Action="Warning" />
|
||||||
|
<Rule Id="S2486" Action="Warning" />
|
||||||
|
<Rule Id="S4433" Action="Warning" />
|
||||||
|
<Rule Id="S2758" Action="Warning" />
|
||||||
|
<Rule Id="S1751" Action="Warning" />
|
||||||
|
<Rule Id="S1871" Action="Warning" />
|
||||||
|
<Rule Id="S4586" Action="Warning" />
|
||||||
|
<Rule Id="S4581" Action="Warning" />
|
||||||
|
<Rule Id="S2737" Action="Warning" />
|
||||||
|
<Rule Id="S3400" Action="Warning" />
|
||||||
|
<Rule Id="S3649" Action="Warning" />
|
||||||
|
<Rule Id="S1144" Action="Warning" />
|
||||||
|
<Rule Id="S1264" Action="Warning" />
|
||||||
|
<Rule Id="S2201" Action="Warning" />
|
||||||
|
<Rule Id="S1118" Action="Warning" />
|
||||||
|
<Rule Id="S1006" Action="Warning" />
|
||||||
|
<Rule Id="S4214" Action="Warning" />
|
||||||
|
<Rule Id="S4210" Action="Warning" />
|
||||||
|
<Rule Id="S3241" Action="Warning" />
|
||||||
|
<Rule Id="S4428" Action="Warning" />
|
||||||
|
<Rule Id="S1048" Action="Warning" />
|
||||||
|
<Rule Id="S2183" Action="Warning" />
|
||||||
|
<Rule Id="S3168" Action="Warning" />
|
||||||
|
<Rule Id="S4220" Action="Warning" />
|
||||||
|
<Rule Id="S3261" Action="Warning" />
|
||||||
|
<Rule Id="S4260" Action="Warning" />
|
||||||
|
<Rule Id="S4159" Action="Warning" />
|
||||||
|
<Rule Id="S4277" Action="Warning" />
|
||||||
|
<Rule Id="S2583" Action="Warning" />
|
||||||
|
<Rule Id="S3440" Action="Warning" />
|
||||||
|
<Rule Id="S3776" Action="Warning" />
|
||||||
|
<Rule Id="S2326" Action="Warning" />
|
||||||
|
<Rule Id="S1116" Action="Warning" />
|
||||||
|
<Rule Id="S3358" Action="Warning" />
|
||||||
|
<Rule Id="S4200" Action="Warning" />
|
||||||
|
<Rule Id="S1172" Action="Warning" />
|
||||||
|
<Rule Id="S1862" Action="Warning" />
|
||||||
|
<Rule Id="S2275" Action="Warning" />
|
||||||
|
<Rule Id="S3457" Action="Warning" />
|
||||||
|
<Rule Id="S3459" Action="Warning" />
|
||||||
|
<Rule Id="S3464" Action="Warning" />
|
||||||
|
<Rule Id="S3343" Action="Warning" />
|
||||||
|
<Rule Id="S818" Action="Warning" />
|
||||||
|
<Rule Id="S1656" Action="Warning" />
|
||||||
|
<Rule Id="S2184" Action="Warning" />
|
||||||
|
<Rule Id="S1764" Action="Warning" />
|
||||||
|
<Rule Id="S2971" Action="Warning" />
|
||||||
|
<Rule Id="S3060" Action="Warning" />
|
||||||
|
<Rule Id="S101" Action="Warning" />
|
||||||
|
<Rule Id="S1066" Action="Warning" />
|
||||||
|
<Rule Id="S107" Action="Warning" />
|
||||||
|
<Rule Id="S1075" Action="Warning" />
|
||||||
|
<Rule Id="S108" Action="Warning" />
|
||||||
|
<Rule Id="S110" Action="Warning" />
|
||||||
|
<Rule Id="S1104" Action="Warning" />
|
||||||
|
<Rule Id="S1110" Action="Warning" />
|
||||||
|
<Rule Id="S1117" Action="Warning" />
|
||||||
|
<Rule Id="S112" Action="Warning" />
|
||||||
|
<Rule Id="S1123" Action="Warning" />
|
||||||
|
<Rule Id="S1125" Action="Warning" />
|
||||||
|
<Rule Id="S1134" Action="Warning" />
|
||||||
|
<Rule Id="S1135" Action="Warning" />
|
||||||
|
<Rule Id="S1155" Action="Warning" />
|
||||||
|
<Rule Id="S1163" Action="Warning" />
|
||||||
|
<Rule Id="S1168" Action="Warning" />
|
||||||
|
<Rule Id="S1185" Action="Warning" />
|
||||||
|
<Rule Id="S1186" Action="Warning" />
|
||||||
|
<Rule Id="S1206" Action="Warning" />
|
||||||
|
<Rule Id="S1210" Action="Warning" />
|
||||||
|
<Rule Id="S1215" Action="Warning" />
|
||||||
|
<Rule Id="S125" Action="Warning" />
|
||||||
|
<Rule Id="S1450" Action="Warning" />
|
||||||
|
<Rule Id="S1479" Action="Warning" />
|
||||||
|
<Rule Id="S1481" Action="Warning" />
|
||||||
|
<Rule Id="S1607" Action="Warning" />
|
||||||
|
<Rule Id="S1643" Action="Warning" />
|
||||||
|
<Rule Id="S1699" Action="Warning" />
|
||||||
|
<Rule Id="S1848" Action="Warning" />
|
||||||
|
<Rule Id="S1905" Action="Warning" />
|
||||||
|
<Rule Id="S1939" Action="Warning" />
|
||||||
|
<Rule Id="S1940" Action="Warning" />
|
||||||
|
<Rule Id="S1944" Action="Warning" />
|
||||||
|
<Rule Id="S2068" Action="Warning" />
|
||||||
|
<Rule Id="S2114" Action="Warning" />
|
||||||
|
<Rule Id="S2123" Action="Warning" />
|
||||||
|
<Rule Id="S2178" Action="Warning" />
|
||||||
|
<Rule Id="S2187" Action="Warning" />
|
||||||
|
<Rule Id="S2190" Action="Warning" />
|
||||||
|
<Rule Id="S2219" Action="Warning" />
|
||||||
|
<Rule Id="S2223" Action="Warning" />
|
||||||
|
<Rule Id="S2225" Action="Warning" />
|
||||||
|
<Rule Id="S2234" Action="Warning" />
|
||||||
|
<Rule Id="S2259" Action="Warning" />
|
||||||
|
<Rule Id="S2290" Action="Warning" />
|
||||||
|
<Rule Id="S2291" Action="Warning" />
|
||||||
|
<Rule Id="S2292" Action="Warning" />
|
||||||
|
<Rule Id="S2306" Action="Warning" />
|
||||||
|
<Rule Id="S2328" Action="Warning" />
|
||||||
|
<Rule Id="S2342" Action="Warning" />
|
||||||
|
<Rule Id="S2344" Action="Warning" />
|
||||||
|
<Rule Id="S2345" Action="Warning" />
|
||||||
|
<Rule Id="S2346" Action="Warning" />
|
||||||
|
<Rule Id="S2365" Action="Warning" />
|
||||||
|
<Rule Id="S2368" Action="Warning" />
|
||||||
|
<Rule Id="S2372" Action="Warning" />
|
||||||
|
<Rule Id="S2376" Action="Warning" />
|
||||||
|
<Rule Id="S2386" Action="Warning" />
|
||||||
|
<Rule Id="S2436" Action="Warning" />
|
||||||
|
<Rule Id="S2437" Action="Warning" />
|
||||||
|
<Rule Id="S2681" Action="Warning" />
|
||||||
|
<Rule Id="S2688" Action="Warning" />
|
||||||
|
<Rule Id="S2692" Action="Warning" />
|
||||||
|
<Rule Id="S2696" Action="Warning" />
|
||||||
|
<Rule Id="S2743" Action="Warning" />
|
||||||
|
<Rule Id="S2757" Action="Warning" />
|
||||||
|
<Rule Id="S2761" Action="Warning" />
|
||||||
|
<Rule Id="S2930" Action="Warning" />
|
||||||
|
<Rule Id="S2933" Action="Warning" />
|
||||||
|
<Rule Id="S2934" Action="Warning" />
|
||||||
|
<Rule Id="S2953" Action="Warning" />
|
||||||
|
<Rule Id="S2995" Action="Warning" />
|
||||||
|
<Rule Id="S2996" Action="Warning" />
|
||||||
|
<Rule Id="S2997" Action="Warning" />
|
||||||
|
<Rule Id="S3005" Action="Warning" />
|
||||||
|
<Rule Id="S3010" Action="Warning" />
|
||||||
|
<Rule Id="S3169" Action="Warning" />
|
||||||
|
<Rule Id="S3172" Action="Warning" />
|
||||||
|
<Rule Id="S3217" Action="Warning" />
|
||||||
|
<Rule Id="S3218" Action="Warning" />
|
||||||
|
<Rule Id="S3220" Action="Warning" />
|
||||||
|
<Rule Id="S3236" Action="Warning" />
|
||||||
|
<Rule Id="S3237" Action="Warning" />
|
||||||
|
<Rule Id="S3244" Action="Warning" />
|
||||||
|
<Rule Id="S3246" Action="Warning" />
|
||||||
|
<Rule Id="S3247" Action="Warning" />
|
||||||
|
<Rule Id="S3249" Action="Warning" />
|
||||||
|
<Rule Id="S3251" Action="Warning" />
|
||||||
|
<Rule Id="S3256" Action="Warning" />
|
||||||
|
<Rule Id="S3262" Action="Warning" />
|
||||||
|
<Rule Id="S3263" Action="Warning" />
|
||||||
|
<Rule Id="S3264" Action="Warning" />
|
||||||
|
<Rule Id="S3265" Action="Warning" />
|
||||||
|
<Rule Id="S3346" Action="Warning" />
|
||||||
|
<Rule Id="S3376" Action="Warning" />
|
||||||
|
<Rule Id="S3397" Action="Warning" />
|
||||||
|
<Rule Id="S3415" Action="Warning" />
|
||||||
|
<Rule Id="S3427" Action="Warning" />
|
||||||
|
<Rule Id="S3442" Action="Warning" />
|
||||||
|
<Rule Id="S3443" Action="Warning" />
|
||||||
|
<Rule Id="S3444" Action="Warning" />
|
||||||
|
<Rule Id="S3445" Action="Warning" />
|
||||||
|
<Rule Id="S3447" Action="Warning" />
|
||||||
|
<Rule Id="S3449" Action="Warning" />
|
||||||
|
<Rule Id="S3450" Action="Warning" />
|
||||||
|
<Rule Id="S3451" Action="Warning" />
|
||||||
|
<Rule Id="S3453" Action="Warning" />
|
||||||
|
<Rule Id="S3456" Action="Warning" />
|
||||||
|
<Rule Id="S3458" Action="Warning" />
|
||||||
|
<Rule Id="S3466" Action="Warning" />
|
||||||
|
<Rule Id="S3597" Action="Warning" />
|
||||||
|
<Rule Id="S3598" Action="Warning" />
|
||||||
|
<Rule Id="S3600" Action="Warning" />
|
||||||
|
<Rule Id="S3603" Action="Warning" />
|
||||||
|
<Rule Id="S3604" Action="Warning" />
|
||||||
|
<Rule Id="S3610" Action="Warning" />
|
||||||
|
<Rule Id="S3626" Action="Warning" />
|
||||||
|
<Rule Id="S3655" Action="Warning" />
|
||||||
|
<Rule Id="S3693" Action="Warning" />
|
||||||
|
<Rule Id="S3869" Action="Warning" />
|
||||||
|
<Rule Id="S3871" Action="Warning" />
|
||||||
|
<Rule Id="S3875" Action="Warning" />
|
||||||
|
<Rule Id="S3877" Action="Warning" />
|
||||||
|
<Rule Id="S3881" Action="Warning" />
|
||||||
|
<Rule Id="S3884" Action="Warning" />
|
||||||
|
<Rule Id="S3885" Action="Warning" />
|
||||||
|
<Rule Id="S3887" Action="Warning" />
|
||||||
|
<Rule Id="S3889" Action="Warning" />
|
||||||
|
<Rule Id="S3897" Action="Warning" />
|
||||||
|
<Rule Id="S3903" Action="Warning" />
|
||||||
|
<Rule Id="S3904" Action="Warning" />
|
||||||
|
<Rule Id="S3925" Action="Warning" />
|
||||||
|
<Rule Id="S3926" Action="Warning" />
|
||||||
|
<Rule Id="S3927" Action="Warning" />
|
||||||
|
<Rule Id="S3928" Action="Warning" />
|
||||||
|
<Rule Id="S3966" Action="Warning" />
|
||||||
|
<Rule Id="S3971" Action="Warning" />
|
||||||
|
<Rule Id="S3972" Action="Warning" />
|
||||||
|
<Rule Id="S3981" Action="Warning" />
|
||||||
|
<Rule Id="S3984" Action="Warning" />
|
||||||
|
<Rule Id="S3998" Action="Warning" />
|
||||||
|
<Rule Id="S4015" Action="Warning" />
|
||||||
|
<Rule Id="S4016" Action="Warning" />
|
||||||
|
<Rule Id="S4019" Action="Warning" />
|
||||||
|
<Rule Id="S4035" Action="Warning" />
|
||||||
|
<Rule Id="S4144" Action="Warning" />
|
||||||
|
<Rule Id="S4158" Action="Warning" />
|
||||||
|
<Rule Id="S907" Action="Warning" />
|
||||||
|
<Rule Id="S927" Action="Warning" />
|
||||||
|
<Rule Id="S4524" Action="None" />
|
||||||
|
<Rule Id="S2228" Action="None" />
|
||||||
|
<Rule Id="S881" Action="None" />
|
||||||
|
<Rule Id="S4564" Action="None" />
|
||||||
|
<Rule Id="S4212" Action="None" />
|
||||||
|
<Rule Id="S2245" Action="None" />
|
||||||
|
<Rule Id="S131" Action="None" />
|
||||||
|
<Rule Id="S3330" Action="None" />
|
||||||
|
<Rule Id="S2255" Action="None" />
|
||||||
|
<Rule Id="S4432" Action="None" />
|
||||||
|
<Rule Id="S109" Action="None" />
|
||||||
|
<Rule Id="S2070" Action="None" />
|
||||||
|
<Rule Id="S4462" Action="None" />
|
||||||
|
<Rule Id="S1192" Action="None" />
|
||||||
|
<Rule Id="S2302" Action="None" />
|
||||||
|
<Rule Id="S1694" Action="None" />
|
||||||
|
<Rule Id="S4040" Action="None" />
|
||||||
|
<Rule Id="S4142" Action="None" />
|
||||||
|
<Rule Id="S2092" Action="None" />
|
||||||
|
<Rule Id="S3900" Action="None" />
|
||||||
|
<Rule Id="S1821" Action="None" />
|
||||||
|
<Rule Id="S3235" Action="None" />
|
||||||
|
<Rule Id="S3366" Action="None" />
|
||||||
|
<Rule Id="S1151" Action="None" />
|
||||||
|
<Rule Id="S4041" Action="None" />
|
||||||
|
<Rule Id="S4261" Action="None" />
|
||||||
|
<Rule Id="S1147" Action="None" />
|
||||||
|
<Rule Id="S3532" Action="None" />
|
||||||
|
<Rule Id="S3353" Action="None" />
|
||||||
|
<Rule Id="S126" Action="None" />
|
||||||
|
<Rule Id="S138" Action="None" />
|
||||||
|
<Rule Id="S1659" Action="None" />
|
||||||
|
<Rule Id="S2197" Action="None" />
|
||||||
|
<Rule Id="S100" Action="None" />
|
||||||
|
<Rule Id="S103" Action="None" />
|
||||||
|
<Rule Id="S104" Action="None" />
|
||||||
|
<Rule Id="S105" Action="None" />
|
||||||
|
<Rule Id="S1067" Action="None" />
|
||||||
|
<Rule Id="S1109" Action="None" />
|
||||||
|
<Rule Id="S113" Action="None" />
|
||||||
|
<Rule Id="S1145" Action="None" />
|
||||||
|
<Rule Id="S1200" Action="None" />
|
||||||
|
<Rule Id="S121" Action="None" />
|
||||||
|
<Rule Id="S122" Action="None" />
|
||||||
|
<Rule Id="S1226" Action="None" />
|
||||||
|
<Rule Id="S1227" Action="None" />
|
||||||
|
<Rule Id="S1244" Action="None" />
|
||||||
|
<Rule Id="S127" Action="None" />
|
||||||
|
<Rule Id="S1301" Action="None" />
|
||||||
|
<Rule Id="S1309" Action="None" />
|
||||||
|
<Rule Id="S1313" Action="None" />
|
||||||
|
<Rule Id="S134" Action="None" />
|
||||||
|
<Rule Id="S1449" Action="None" />
|
||||||
|
<Rule Id="S1451" Action="None" />
|
||||||
|
<Rule Id="S1541" Action="None" />
|
||||||
|
<Rule Id="S1696" Action="None" />
|
||||||
|
<Rule Id="S1697" Action="None" />
|
||||||
|
<Rule Id="S1698" Action="None" />
|
||||||
|
<Rule Id="S1858" Action="None" />
|
||||||
|
<Rule Id="S1994" Action="None" />
|
||||||
|
<Rule Id="S2156" Action="None" />
|
||||||
|
<Rule Id="S2221" Action="None" />
|
||||||
|
<Rule Id="S2325" Action="None" />
|
||||||
|
<Rule Id="S2330" Action="None" />
|
||||||
|
<Rule Id="S2333" Action="None" />
|
||||||
|
<Rule Id="S2339" Action="None" />
|
||||||
|
<Rule Id="S2357" Action="None" />
|
||||||
|
<Rule Id="S2360" Action="None" />
|
||||||
|
<Rule Id="S2387" Action="None" />
|
||||||
|
<Rule Id="S2551" Action="None" />
|
||||||
|
<Rule Id="S2674" Action="None" />
|
||||||
|
<Rule Id="S2699" Action="None" />
|
||||||
|
<Rule Id="S2701" Action="None" />
|
||||||
|
<Rule Id="S2760" Action="None" />
|
||||||
|
<Rule Id="S2931" Action="None" />
|
||||||
|
<Rule Id="S2952" Action="None" />
|
||||||
|
<Rule Id="S2955" Action="None" />
|
||||||
|
<Rule Id="S3052" Action="None" />
|
||||||
|
<Rule Id="S3215" Action="None" />
|
||||||
|
<Rule Id="S3216" Action="None" />
|
||||||
|
<Rule Id="S3234" Action="None" />
|
||||||
|
<Rule Id="S3240" Action="None" />
|
||||||
|
<Rule Id="S3242" Action="None" />
|
||||||
|
<Rule Id="S3253" Action="None" />
|
||||||
|
<Rule Id="S3254" Action="None" />
|
||||||
|
<Rule Id="S3257" Action="None" />
|
||||||
|
<Rule Id="S3431" Action="None" />
|
||||||
|
<Rule Id="S3441" Action="None" />
|
||||||
|
<Rule Id="S3717" Action="None" />
|
||||||
|
<Rule Id="S3872" Action="None" />
|
||||||
|
<Rule Id="S3874" Action="None" />
|
||||||
|
<Rule Id="S3876" Action="None" />
|
||||||
|
<Rule Id="S3880" Action="None" />
|
||||||
|
<Rule Id="S3898" Action="None" />
|
||||||
|
<Rule Id="S3902" Action="None" />
|
||||||
|
<Rule Id="S3906" Action="None" />
|
||||||
|
<Rule Id="S3908" Action="None" />
|
||||||
|
<Rule Id="S3909" Action="None" />
|
||||||
|
<Rule Id="S3956" Action="None" />
|
||||||
|
<Rule Id="S3962" Action="None" />
|
||||||
|
<Rule Id="S3963" Action="None" />
|
||||||
|
<Rule Id="S3967" Action="None" />
|
||||||
|
<Rule Id="S3990" Action="None" />
|
||||||
|
<Rule Id="S3992" Action="None" />
|
||||||
|
<Rule Id="S3993" Action="None" />
|
||||||
|
<Rule Id="S3994" Action="None" />
|
||||||
|
<Rule Id="S3995" Action="None" />
|
||||||
|
<Rule Id="S3996" Action="None" />
|
||||||
|
<Rule Id="S3997" Action="None" />
|
||||||
|
<Rule Id="S4000" Action="None" />
|
||||||
|
<Rule Id="S4002" Action="None" />
|
||||||
|
<Rule Id="S4004" Action="None" />
|
||||||
|
<Rule Id="S4005" Action="None" />
|
||||||
|
<Rule Id="S4017" Action="None" />
|
||||||
|
<Rule Id="S4018" Action="None" />
|
||||||
|
<Rule Id="S4022" Action="None" />
|
||||||
|
<Rule Id="S4023" Action="None" />
|
||||||
|
<Rule Id="S4025" Action="None" />
|
||||||
|
<Rule Id="S4026" Action="None" />
|
||||||
|
<Rule Id="S4027" Action="None" />
|
||||||
|
<Rule Id="S4039" Action="None" />
|
||||||
|
<Rule Id="S4047" Action="None" />
|
||||||
|
<Rule Id="S4049" Action="None" />
|
||||||
|
<Rule Id="S4050" Action="None" />
|
||||||
|
<Rule Id="S4052" Action="None" />
|
||||||
|
<Rule Id="S4055" Action="None" />
|
||||||
|
<Rule Id="S4056" Action="None" />
|
||||||
|
<Rule Id="S4057" Action="None" />
|
||||||
|
<Rule Id="S4058" Action="None" />
|
||||||
|
<Rule Id="S4059" Action="None" />
|
||||||
|
<Rule Id="S4060" Action="None" />
|
||||||
|
<Rule Id="S4069" Action="None" />
|
||||||
|
<Rule Id="S4070" Action="None" />
|
||||||
|
<Rule Id="S4225" Action="None" />
|
||||||
|
<Rule Id="S4226" Action="None" />
|
||||||
|
</Rules>
|
||||||
|
</RuleSet>
|
74
ModernKeePass/.sonarqube/conf/SonarQubeRoslyn-vbnet.ruleset
Normal file
74
ModernKeePass/.sonarqube/conf/SonarQubeRoslyn-vbnet.ruleset
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RuleSet xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="Rules for SonarQube" Description="This rule set was automatically generated from SonarQube" ToolsVersion="14.0">
|
||||||
|
<Rules AnalyzerId="SonarAnalyzer.VisualBasic" RuleNamespace="SonarAnalyzer.VisualBasic">
|
||||||
|
<Rule Id="S1751" Action="Warning" />
|
||||||
|
<Rule Id="S1871" Action="Warning" />
|
||||||
|
<Rule Id="S1656" Action="Warning" />
|
||||||
|
<Rule Id="S1862" Action="Warning" />
|
||||||
|
<Rule Id="S1764" Action="Warning" />
|
||||||
|
<Rule Id="S2178" Action="Warning" />
|
||||||
|
<Rule Id="S101" Action="Warning" />
|
||||||
|
<Rule Id="S1075" Action="Warning" />
|
||||||
|
<Rule Id="S112" Action="Warning" />
|
||||||
|
<Rule Id="S114" Action="Warning" />
|
||||||
|
<Rule Id="S117" Action="Warning" />
|
||||||
|
<Rule Id="S1197" Action="Warning" />
|
||||||
|
<Rule Id="S1542" Action="Warning" />
|
||||||
|
<Rule Id="S1643" Action="Warning" />
|
||||||
|
<Rule Id="S1645" Action="Warning" />
|
||||||
|
<Rule Id="S1654" Action="Warning" />
|
||||||
|
<Rule Id="S2304" Action="Warning" />
|
||||||
|
<Rule Id="S2340" Action="Warning" />
|
||||||
|
<Rule Id="S2342" Action="Warning" />
|
||||||
|
<Rule Id="S2344" Action="Warning" />
|
||||||
|
<Rule Id="S2345" Action="Warning" />
|
||||||
|
<Rule Id="S2346" Action="Warning" />
|
||||||
|
<Rule Id="S2347" Action="Warning" />
|
||||||
|
<Rule Id="S2349" Action="Warning" />
|
||||||
|
<Rule Id="S2352" Action="Warning" />
|
||||||
|
<Rule Id="S2355" Action="Warning" />
|
||||||
|
<Rule Id="S2358" Action="Warning" />
|
||||||
|
<Rule Id="S2359" Action="Warning" />
|
||||||
|
<Rule Id="S2365" Action="Warning" />
|
||||||
|
<Rule Id="S2368" Action="Warning" />
|
||||||
|
<Rule Id="S2372" Action="Warning" />
|
||||||
|
<Rule Id="S2375" Action="Warning" />
|
||||||
|
<Rule Id="S2376" Action="Warning" />
|
||||||
|
<Rule Id="S2951" Action="Warning" />
|
||||||
|
<Rule Id="S3385" Action="Warning" />
|
||||||
|
<Rule Id="S3981" Action="Warning" />
|
||||||
|
<Rule Id="S4144" Action="Warning" />
|
||||||
|
<Rule Id="S4142" Action="None" />
|
||||||
|
<Rule Id="S1659" Action="None" />
|
||||||
|
<Rule Id="S131" Action="None" />
|
||||||
|
<Rule Id="S103" Action="None" />
|
||||||
|
<Rule Id="S104" Action="None" />
|
||||||
|
<Rule Id="S105" Action="None" />
|
||||||
|
<Rule Id="S1067" Action="None" />
|
||||||
|
<Rule Id="S1147" Action="None" />
|
||||||
|
<Rule Id="S122" Action="None" />
|
||||||
|
<Rule Id="S1226" Action="None" />
|
||||||
|
<Rule Id="S134" Action="None" />
|
||||||
|
<Rule Id="S139" Action="None" />
|
||||||
|
<Rule Id="S1541" Action="None" />
|
||||||
|
<Rule Id="S2339" Action="None" />
|
||||||
|
<Rule Id="S2343" Action="None" />
|
||||||
|
<Rule Id="S2348" Action="None" />
|
||||||
|
<Rule Id="S2353" Action="None" />
|
||||||
|
<Rule Id="S2354" Action="None" />
|
||||||
|
<Rule Id="S2357" Action="None" />
|
||||||
|
<Rule Id="S2360" Action="None" />
|
||||||
|
<Rule Id="S2362" Action="None" />
|
||||||
|
<Rule Id="S2363" Action="None" />
|
||||||
|
<Rule Id="S2364" Action="None" />
|
||||||
|
<Rule Id="S2366" Action="None" />
|
||||||
|
<Rule Id="S2367" Action="None" />
|
||||||
|
<Rule Id="S2369" Action="None" />
|
||||||
|
<Rule Id="S2370" Action="None" />
|
||||||
|
<Rule Id="S2373" Action="None" />
|
||||||
|
<Rule Id="S2374" Action="None" />
|
||||||
|
<Rule Id="S2429" Action="None" />
|
||||||
|
<Rule Id="S3860" Action="None" />
|
||||||
|
<Rule Id="S3866" Action="None" />
|
||||||
|
</Rules>
|
||||||
|
</RuleSet>
|
695
ModernKeePass/.sonarqube/conf/cs/SonarLint.xml
Normal file
695
ModernKeePass/.sonarqube/conf/cs/SonarLint.xml
Normal file
@@ -0,0 +1,695 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<AnalysisInput>
|
||||||
|
<Settings>
|
||||||
|
<Setting>
|
||||||
|
<Key>sonar.cs.ignoreHeaderComments</Key>
|
||||||
|
<Value>true</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting>
|
||||||
|
<Key>sonar.cs.file.suffixes</Key>
|
||||||
|
<Value>.cs</Value>
|
||||||
|
</Setting>
|
||||||
|
</Settings>
|
||||||
|
<Rules>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2589</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3433</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4061</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1121</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1854</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4457</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4456</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2278</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4211</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3923</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4426</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2486</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4433</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2758</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1751</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1871</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4586</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4581</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2737</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3400</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3649</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1144</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1264</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2201</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1118</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1006</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4214</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4210</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3241</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4428</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1048</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2183</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3168</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4220</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3261</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4260</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4159</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4277</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2583</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3440</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3776</Key>
|
||||||
|
<Parameters>
|
||||||
|
<Parameter>
|
||||||
|
<Key>threshold</Key>
|
||||||
|
<Value>15</Value>
|
||||||
|
</Parameter>
|
||||||
|
<Parameter>
|
||||||
|
<Key>propertyThreshold</Key>
|
||||||
|
<Value>3</Value>
|
||||||
|
</Parameter>
|
||||||
|
</Parameters>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2326</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1116</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3358</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4200</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1172</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1862</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2275</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3457</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3459</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3464</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3343</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S818</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1656</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2184</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1764</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2971</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3060</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S101</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1066</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S107</Key>
|
||||||
|
<Parameters>
|
||||||
|
<Parameter>
|
||||||
|
<Key>max</Key>
|
||||||
|
<Value>7</Value>
|
||||||
|
</Parameter>
|
||||||
|
</Parameters>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1075</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S108</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S110</Key>
|
||||||
|
<Parameters>
|
||||||
|
<Parameter>
|
||||||
|
<Key>max</Key>
|
||||||
|
<Value>5</Value>
|
||||||
|
</Parameter>
|
||||||
|
</Parameters>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1104</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1110</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1117</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S112</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1123</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1125</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1134</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1135</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1155</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1163</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1168</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1185</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1186</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1206</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1210</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1215</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S125</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1450</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1479</Key>
|
||||||
|
<Parameters>
|
||||||
|
<Parameter>
|
||||||
|
<Key>maximum</Key>
|
||||||
|
<Value>30</Value>
|
||||||
|
</Parameter>
|
||||||
|
</Parameters>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1481</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1607</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1643</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1699</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1848</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1905</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1939</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1940</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1944</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2068</Key>
|
||||||
|
<Parameters>
|
||||||
|
<Parameter>
|
||||||
|
<Key>credentialWords</Key>
|
||||||
|
<Value>password, passwd, pwd</Value>
|
||||||
|
</Parameter>
|
||||||
|
</Parameters>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2114</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2123</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2178</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2187</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2190</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2219</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2223</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2225</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2234</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2259</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2290</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2291</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2292</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2306</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2328</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2342</Key>
|
||||||
|
<Parameters>
|
||||||
|
<Parameter>
|
||||||
|
<Key>format</Key>
|
||||||
|
<Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
|
||||||
|
</Parameter>
|
||||||
|
<Parameter>
|
||||||
|
<Key>flagsAttributeFormat</Key>
|
||||||
|
<Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?s$</Value>
|
||||||
|
</Parameter>
|
||||||
|
</Parameters>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2344</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2345</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2346</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2365</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2368</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2372</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2376</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2386</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2436</Key>
|
||||||
|
<Parameters>
|
||||||
|
<Parameter>
|
||||||
|
<Key>max</Key>
|
||||||
|
<Value>2</Value>
|
||||||
|
</Parameter>
|
||||||
|
<Parameter>
|
||||||
|
<Key>maxMethod</Key>
|
||||||
|
<Value>3</Value>
|
||||||
|
</Parameter>
|
||||||
|
</Parameters>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2437</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2681</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2688</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2692</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2696</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2743</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2757</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2761</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2930</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2933</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2934</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2953</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2995</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2996</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2997</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3005</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3010</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3169</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3172</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3217</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3218</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3220</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3236</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3237</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3244</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3246</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3247</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3249</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3251</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3256</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3262</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3263</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3264</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3265</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3346</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3376</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3397</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3415</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3427</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3442</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3443</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3444</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3445</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3447</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3449</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3450</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3451</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3453</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3456</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3458</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3466</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3597</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3598</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3600</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3603</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3604</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3610</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3626</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3655</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3693</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3869</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3871</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3875</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3877</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3881</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3884</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3885</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3887</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3889</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3897</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3903</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3904</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3925</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3926</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3927</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3928</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3966</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3971</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3972</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3981</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3984</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3998</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4015</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4016</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4019</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4035</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4144</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4158</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S907</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S927</Key>
|
||||||
|
</Rule>
|
||||||
|
</Rules>
|
||||||
|
<Files>
|
||||||
|
</Files>
|
||||||
|
</AnalysisInput>
|
186
ModernKeePass/.sonarqube/conf/vbnet/SonarLint.xml
Normal file
186
ModernKeePass/.sonarqube/conf/vbnet/SonarLint.xml
Normal file
@@ -0,0 +1,186 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<AnalysisInput>
|
||||||
|
<Settings>
|
||||||
|
<Setting>
|
||||||
|
<Key>sonar.vbnet.ignoreHeaderComments</Key>
|
||||||
|
<Value>true</Value>
|
||||||
|
</Setting>
|
||||||
|
<Setting>
|
||||||
|
<Key>sonar.vbnet.file.suffixes</Key>
|
||||||
|
<Value>.vb</Value>
|
||||||
|
</Setting>
|
||||||
|
</Settings>
|
||||||
|
<Rules>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1751</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1871</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1656</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1862</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1764</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2178</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S101</Key>
|
||||||
|
<Parameters>
|
||||||
|
<Parameter>
|
||||||
|
<Key>format</Key>
|
||||||
|
<Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
|
||||||
|
</Parameter>
|
||||||
|
</Parameters>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1075</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S112</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S114</Key>
|
||||||
|
<Parameters>
|
||||||
|
<Parameter>
|
||||||
|
<Key>format</Key>
|
||||||
|
<Value>^I([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
|
||||||
|
</Parameter>
|
||||||
|
</Parameters>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S117</Key>
|
||||||
|
<Parameters>
|
||||||
|
<Parameter>
|
||||||
|
<Key>format</Key>
|
||||||
|
<Value>^[a-z][a-z0-9]*([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
|
||||||
|
</Parameter>
|
||||||
|
</Parameters>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1197</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1542</Key>
|
||||||
|
<Parameters>
|
||||||
|
<Parameter>
|
||||||
|
<Key>format</Key>
|
||||||
|
<Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
|
||||||
|
</Parameter>
|
||||||
|
</Parameters>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1643</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1645</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S1654</Key>
|
||||||
|
<Parameters>
|
||||||
|
<Parameter>
|
||||||
|
<Key>format</Key>
|
||||||
|
<Value>^[a-z][a-z0-9]*([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
|
||||||
|
</Parameter>
|
||||||
|
</Parameters>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2304</Key>
|
||||||
|
<Parameters>
|
||||||
|
<Parameter>
|
||||||
|
<Key>format</Key>
|
||||||
|
<Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?(\.([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?)*$</Value>
|
||||||
|
</Parameter>
|
||||||
|
</Parameters>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2340</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2342</Key>
|
||||||
|
<Parameters>
|
||||||
|
<Parameter>
|
||||||
|
<Key>format</Key>
|
||||||
|
<Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
|
||||||
|
</Parameter>
|
||||||
|
<Parameter>
|
||||||
|
<Key>flagsAttributeFormat</Key>
|
||||||
|
<Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?s$</Value>
|
||||||
|
</Parameter>
|
||||||
|
</Parameters>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2344</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2345</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2346</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2347</Key>
|
||||||
|
<Parameters>
|
||||||
|
<Parameter>
|
||||||
|
<Key>format</Key>
|
||||||
|
<Value>^(([a-z][a-z0-9]*)?([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?_)?([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
|
||||||
|
</Parameter>
|
||||||
|
</Parameters>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2349</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2352</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2355</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2358</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2359</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2365</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2368</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2372</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2375</Key>
|
||||||
|
<Parameters>
|
||||||
|
<Parameter>
|
||||||
|
<Key>minimumSeriesLength</Key>
|
||||||
|
<Value>6</Value>
|
||||||
|
</Parameter>
|
||||||
|
</Parameters>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2376</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S2951</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3385</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S3981</Key>
|
||||||
|
</Rule>
|
||||||
|
<Rule>
|
||||||
|
<Key>S4144</Key>
|
||||||
|
</Rule>
|
||||||
|
</Rules>
|
||||||
|
<Files>
|
||||||
|
</Files>
|
||||||
|
</AnalysisInput>
|
0
ModernKeePass/.sonarqube/out/.sonar/.sonar_lock
Normal file
0
ModernKeePass/.sonarqube/out/.sonar/.sonar_lock
Normal file
7
ModernKeePass/.sonarqube/out/.sonar/report-task.txt
Normal file
7
ModernKeePass/.sonarqube/out/.sonar/report-task.txt
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
organization=geogeob
|
||||||
|
projectKey=ModernKeePass
|
||||||
|
serverUrl=https://sonarcloud.io
|
||||||
|
serverVersion=7.2.0.12953
|
||||||
|
dashboardUrl=https://sonarcloud.io/dashboard/index/ModernKeePass
|
||||||
|
ceTaskId=AWQER9hfTzX59Iu7A6N0
|
||||||
|
ceTaskUrl=https://sonarcloud.io/api/ce/task?id=AWQER9hfTzX59Iu7A6N0
|
BIN
ModernKeePass/.sonarqube/out/0/FilesToAnalyze.txt
Normal file
BIN
ModernKeePass/.sonarqube/out/0/FilesToAnalyze.txt
Normal file
Binary file not shown.
18
ModernKeePass/.sonarqube/out/0/ProjectInfo.xml
Normal file
18
ModernKeePass/.sonarqube/out/0/ProjectInfo.xml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<ProjectInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.sonarsource.com/msbuild/integration/2015/1">
|
||||||
|
<ProjectName>ModernKeePass.App</ProjectName>
|
||||||
|
<ProjectLanguage>C#</ProjectLanguage>
|
||||||
|
<ProjectType>Product</ProjectType>
|
||||||
|
<ProjectGuid>a0cfc681-769b-405a-8482-0cdee595a91f</ProjectGuid>
|
||||||
|
<FullPath>C:\Sources\Other\ModernKeePass\ModernKeePass\ModernKeePass.App.csproj</FullPath>
|
||||||
|
<IsExcluded>false</IsExcluded>
|
||||||
|
<AnalysisResults>
|
||||||
|
<AnalysisResult Id="FilesToAnalyze" Location="C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\out\0\FilesToAnalyze.txt" />
|
||||||
|
</AnalysisResults>
|
||||||
|
<AnalysisSettings>
|
||||||
|
<Property Name="sonar.cs.roslyn.reportFilePath">C:\Sources\Other\ModernKeePass\ModernKeePass\bin\Debug\ModernKeePass.exe.RoslynCA.json</Property>
|
||||||
|
<Property Name="sonar.cs.analyzer.projectOutPath">C:\Sources\Other\ModernKeePass\ModernKeePass\.sonarqube\out\0</Property>
|
||||||
|
</AnalysisSettings>
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>AnyCPU</Platform>
|
||||||
|
</ProjectInfo>
|
85
ModernKeePass/.sonarqube/out/0/output-cs/encoding.pb
Normal file
85
ModernKeePass/.sonarqube/out/0/output-cs/encoding.pb
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
P
|
||||||
|
GC:\Sources\Other\ModernKeePass\ModernKeePass\Actions\ClipboardAction.csutf-8T
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\Actions\NavigateToUrlAction.csutf-8Q
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\Actions\SetupFocusAction.csutf-8A
|
||||||
|
8C:\Sources\Other\ModernKeePass\ModernKeePass\App.xaml.csutf-8X
|
||||||
|
OC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\IntToSymbolConverter.csutf-8[
|
||||||
|
RC:\Sources\Other\ModernKeePass\ModernKeePass\Exceptions\DatabaseOpenedException.csutf-8S
|
||||||
|
JC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\ILicenseService.csutf-8[
|
||||||
|
RC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IProxyInvocationHandler.csutf-8R
|
||||||
|
IC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IRecentService.csutf-8O
|
||||||
|
FC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IRecentItem.csutf-8T
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IResourceService.csutf-8V
|
||||||
|
MC:\Sources\Other\ModernKeePass\ModernKeePass\Services\SingletonServiceBase.csutf-8i
|
||||||
|
`C:\Sources\Other\ModernKeePass\ModernKeePass\TemplateSelectors\SelectableDataTemplateSelector.csutf-8X
|
||||||
|
OC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\SettingsSaveVm.csutf-8]
|
||||||
|
TC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\DonatePage.xaml.csutf-8Q
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\Services\DatabaseService.csutf-8T
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\ISettingsService.csutf-8S
|
||||||
|
JC:\Sources\Other\ModernKeePass\ModernKeePass\Common\MessageDialogHelper.csutf-8P
|
||||||
|
GC:\Sources\Other\ModernKeePass\ModernKeePass\Common\NavigationHelper.csutf-8Y
|
||||||
|
PC:\Sources\Other\ModernKeePass\ModernKeePass\Common\NotifyPropertyChangedBase.csutf-8T
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\Common\ObservableDictionary.csutf-8L
|
||||||
|
CC:\Sources\Other\ModernKeePass\ModernKeePass\Common\RelayCommand.csutf-8Q
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\Common\SuspensionManager.csutf-8P
|
||||||
|
GC:\Sources\Other\ModernKeePass\ModernKeePass\Services\LicenseService.csutf-8O
|
||||||
|
FC:\Sources\Other\ModernKeePass\ModernKeePass\Services\RecentService.csutf-8R
|
||||||
|
IC:\Sources\Other\ModernKeePass\ModernKeePass\Services\ResourcesService.csutf-8Q
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\Services\SettingsService.csutf-8W
|
||||||
|
NC:\Sources\Other\ModernKeePass\ModernKeePass\Common\ToastNotificationHelper.csutf-8i
|
||||||
|
`C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\DiscreteIntToSolidColorBrushConverter.csutf-8d
|
||||||
|
[C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\EmptyStringToVisibilityConverter.csutf-8Z
|
||||||
|
QC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\NullToBooleanConverter.csutf-8Q
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\Exceptions\SaveException.csutf-8\
|
||||||
|
SC:\Sources\Other\ModernKeePass\ModernKeePass\Extensions\DispatcherTaskExtensions.csutf-8T
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IDatabaseService.csutf-8X
|
||||||
|
OC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IHasSelectableObject.csutf-8T
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\ISelectableModel.csutf-8\
|
||||||
|
SC:\Sources\Other\ModernKeePass\ModernKeePass\Views\BasePages\LayoutAwarePageBase.csutf-8k
|
||||||
|
bC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsDatabasePage.xaml.csutf-8n
|
||||||
|
eC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsNewDatabasePage.xaml.csutf-8g
|
||||||
|
^C:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsSavePage.xaml.csutf-8k
|
||||||
|
bC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsSecurityPage.xaml.csutf-8j
|
||||||
|
aC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsWelcomePage.xaml.csutf-8h
|
||||||
|
_C:\Sources\Other\ModernKeePass\ModernKeePass\TemplateSelectors\FirstItemDataTemplateSelector.csutf-8U
|
||||||
|
LC:\Sources\Other\ModernKeePass\ModernKeePass\Controls\ListViewWithDisable.csutf-8f
|
||||||
|
]C:\Sources\Other\ModernKeePass\ModernKeePass\Views\UserControls\BreadCrumbUserControl.xaml.csutf-8h
|
||||||
|
_C:\Sources\Other\ModernKeePass\ModernKeePass\Views\UserControls\CompositeKeyUserControl.xaml.csutf-8S
|
||||||
|
JC:\Sources\Other\ModernKeePass\ModernKeePass\Controls\TextBoxWithButton.csutf-8`
|
||||||
|
WC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\BooleanToVisibilityConverter.csutf-8Y
|
||||||
|
PC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\ColorToBrushConverter.csutf-8d
|
||||||
|
[C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\DoubleToSolidColorBrushConverter.csutf-8g
|
||||||
|
^C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\InverseBooleanToVisibilityConverter.csutf-8Z
|
||||||
|
QC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\PluralizationConverter.csutf-8c
|
||||||
|
ZC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\ProgressBarLegalValuesConverter.csutf-8X
|
||||||
|
OC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\TextToWidthConverter.csutf-8Q
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\Events\PasswordEventArgs.csutf-8N
|
||||||
|
EC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IIsEnabled.csutf-8M
|
||||||
|
DC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IPwEntity.csutf-8L
|
||||||
|
CC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPage.xaml.csutf-8\
|
||||||
|
SC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\AboutPage.xaml.csutf-8b
|
||||||
|
YC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\NewDatabasePage.xaml.csutf-8P
|
||||||
|
GC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPage.xaml.csutf-8^
|
||||||
|
UC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\WelcomePage.xaml.csutf-8K
|
||||||
|
BC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\AboutVm.csutf-8R
|
||||||
|
IC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\CompositeKeyVm.csutf-8X
|
||||||
|
OC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\ListMenuItemVm.csutf-8X
|
||||||
|
OC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\MainMenuItemVm.csutf-8V
|
||||||
|
MC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\RecentItemVm.csutf-8S
|
||||||
|
JC:\Sources\Other\ModernKeePass\ModernKeePass\Views\EntryDetailPage.xaml.csutf-8S
|
||||||
|
JC:\Sources\Other\ModernKeePass\ModernKeePass\Views\GroupDetailPage.xaml.csutf-8c
|
||||||
|
ZC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\OpenDatabasePage.xaml.csutf-8f
|
||||||
|
]C:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\RecentDatabasesPage.xaml.csutf-8c
|
||||||
|
ZC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\SaveDatabasePage.xaml.csutf-8P
|
||||||
|
GC:\Sources\Other\ModernKeePass\ModernKeePass\Properties\AssemblyInfo.csutf-8K
|
||||||
|
BC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\EntryVm.csutf-8K
|
||||||
|
BC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\GroupVm.csutf-8W
|
||||||
|
NC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\SettingsNewVm.csutf-8N
|
||||||
|
EC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\SettingsVm.csutf-8J
|
||||||
|
AC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\MainVm.csutf-8I
|
||||||
|
@C:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\NewVm.csutf-8J
|
||||||
|
AC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\OpenVm.csutf-8L
|
||||||
|
CC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\RecentVm.csutf-8J
|
||||||
|
AC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\SaveVm.csutf-8\
|
||||||
|
SC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\SettingsDatabaseVm.csutf-8i
|
||||||
|
`C:\Sources\Other\ModernKeePass\ModernKeePass\Views\UserControls\HamburgerMenuUserControl.xaml.csutf-8
|
139
ModernKeePass/.sonarqube/out/0/output-cs/file-metadata.pb
Normal file
139
ModernKeePass/.sonarqube/out/0/output-cs/file-metadata.pb
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
I
|
||||||
|
GC:\Sources\Other\ModernKeePass\ModernKeePass\Actions\ClipboardAction.csM
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\Actions\NavigateToUrlAction.csJ
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\Actions\SetupFocusAction.cs:
|
||||||
|
8C:\Sources\Other\ModernKeePass\ModernKeePass\App.xaml.csQ
|
||||||
|
OC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\IntToSymbolConverter.csT
|
||||||
|
RC:\Sources\Other\ModernKeePass\ModernKeePass\Exceptions\DatabaseOpenedException.csL
|
||||||
|
JC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\ILicenseService.csT
|
||||||
|
RC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IProxyInvocationHandler.csK
|
||||||
|
IC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IRecentService.csH
|
||||||
|
FC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IRecentItem.csM
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IResourceService.csO
|
||||||
|
MC:\Sources\Other\ModernKeePass\ModernKeePass\Services\SingletonServiceBase.csb
|
||||||
|
`C:\Sources\Other\ModernKeePass\ModernKeePass\TemplateSelectors\SelectableDataTemplateSelector.csQ
|
||||||
|
OC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\SettingsSaveVm.csV
|
||||||
|
TC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\DonatePage.xaml.csJ
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\Services\DatabaseService.csM
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\ISettingsService.csL
|
||||||
|
JC:\Sources\Other\ModernKeePass\ModernKeePass\Common\MessageDialogHelper.csI
|
||||||
|
GC:\Sources\Other\ModernKeePass\ModernKeePass\Common\NavigationHelper.csR
|
||||||
|
PC:\Sources\Other\ModernKeePass\ModernKeePass\Common\NotifyPropertyChangedBase.csM
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\Common\ObservableDictionary.csE
|
||||||
|
CC:\Sources\Other\ModernKeePass\ModernKeePass\Common\RelayCommand.csJ
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\Common\SuspensionManager.csI
|
||||||
|
GC:\Sources\Other\ModernKeePass\ModernKeePass\Services\LicenseService.csH
|
||||||
|
FC:\Sources\Other\ModernKeePass\ModernKeePass\Services\RecentService.csK
|
||||||
|
IC:\Sources\Other\ModernKeePass\ModernKeePass\Services\ResourcesService.csJ
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\Services\SettingsService.csP
|
||||||
|
NC:\Sources\Other\ModernKeePass\ModernKeePass\Common\ToastNotificationHelper.csb
|
||||||
|
`C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\DiscreteIntToSolidColorBrushConverter.cs]
|
||||||
|
[C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\EmptyStringToVisibilityConverter.csS
|
||||||
|
QC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\NullToBooleanConverter.csJ
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\Exceptions\SaveException.csU
|
||||||
|
SC:\Sources\Other\ModernKeePass\ModernKeePass\Extensions\DispatcherTaskExtensions.csM
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IDatabaseService.csQ
|
||||||
|
OC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IHasSelectableObject.csM
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\ISelectableModel.csU
|
||||||
|
SC:\Sources\Other\ModernKeePass\ModernKeePass\Views\BasePages\LayoutAwarePageBase.csd
|
||||||
|
bC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsDatabasePage.xaml.csg
|
||||||
|
eC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsNewDatabasePage.xaml.cs`
|
||||||
|
^C:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsSavePage.xaml.csd
|
||||||
|
bC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsSecurityPage.xaml.csc
|
||||||
|
aC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsWelcomePage.xaml.csa
|
||||||
|
_C:\Sources\Other\ModernKeePass\ModernKeePass\TemplateSelectors\FirstItemDataTemplateSelector.csN
|
||||||
|
LC:\Sources\Other\ModernKeePass\ModernKeePass\Controls\ListViewWithDisable.cs_
|
||||||
|
]C:\Sources\Other\ModernKeePass\ModernKeePass\Views\UserControls\BreadCrumbUserControl.xaml.csa
|
||||||
|
_C:\Sources\Other\ModernKeePass\ModernKeePass\Views\UserControls\CompositeKeyUserControl.xaml.csL
|
||||||
|
JC:\Sources\Other\ModernKeePass\ModernKeePass\Controls\TextBoxWithButton.csY
|
||||||
|
WC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\BooleanToVisibilityConverter.csR
|
||||||
|
PC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\ColorToBrushConverter.cs]
|
||||||
|
[C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\DoubleToSolidColorBrushConverter.cs`
|
||||||
|
^C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\InverseBooleanToVisibilityConverter.csS
|
||||||
|
QC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\PluralizationConverter.cs\
|
||||||
|
ZC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\ProgressBarLegalValuesConverter.csQ
|
||||||
|
OC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\TextToWidthConverter.csJ
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\Events\PasswordEventArgs.csG
|
||||||
|
EC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IIsEnabled.csF
|
||||||
|
DC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IPwEntity.csE
|
||||||
|
CC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPage.xaml.csU
|
||||||
|
SC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\AboutPage.xaml.cs[
|
||||||
|
YC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\NewDatabasePage.xaml.csI
|
||||||
|
GC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPage.xaml.csW
|
||||||
|
UC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\WelcomePage.xaml.csD
|
||||||
|
BC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\AboutVm.csK
|
||||||
|
IC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\CompositeKeyVm.csQ
|
||||||
|
OC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\ListMenuItemVm.csQ
|
||||||
|
OC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\MainMenuItemVm.csO
|
||||||
|
MC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\RecentItemVm.csL
|
||||||
|
JC:\Sources\Other\ModernKeePass\ModernKeePass\Views\EntryDetailPage.xaml.csL
|
||||||
|
JC:\Sources\Other\ModernKeePass\ModernKeePass\Views\GroupDetailPage.xaml.cs\
|
||||||
|
ZC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\OpenDatabasePage.xaml.cs_
|
||||||
|
]C:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\RecentDatabasesPage.xaml.cs\
|
||||||
|
ZC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\SaveDatabasePage.xaml.csI
|
||||||
|
GC:\Sources\Other\ModernKeePass\ModernKeePass\Properties\AssemblyInfo.csD
|
||||||
|
BC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\EntryVm.csD
|
||||||
|
BC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\GroupVm.csP
|
||||||
|
NC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\SettingsNewVm.csG
|
||||||
|
EC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\SettingsVm.csC
|
||||||
|
AC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\MainVm.csB
|
||||||
|
@C:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\NewVm.csC
|
||||||
|
AC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\OpenVm.csE
|
||||||
|
CC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\RecentVm.csC
|
||||||
|
AC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\SaveVm.csU
|
||||||
|
SC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\SettingsDatabaseVm.csb
|
||||||
|
`C:\Sources\Other\ModernKeePass\ModernKeePass\Views\UserControls\HamburgerMenuUserControl.xaml.csE
|
||||||
|
AC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\App.g.i.csC
|
||||||
|
?C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\App.g.csO
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\Colors.g.i.csM
|
||||||
|
IC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\Colors.g.csk
|
||||||
|
gC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsSavePage.g.i.csi
|
||||||
|
eC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsSavePage.g.csj
|
||||||
|
fC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\UserControls\BreadCrumbUserControl.g.i.csh
|
||||||
|
dC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\UserControls\BreadCrumbUserControl.g.csl
|
||||||
|
hC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\UserControls\CompositeKeyUserControl.g.i.csj
|
||||||
|
fC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\UserControls\CompositeKeyUserControl.g.csP
|
||||||
|
LC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPage.g.i.csN
|
||||||
|
JC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPage.g.cs`
|
||||||
|
\C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\AboutPage.g.i.cs^
|
||||||
|
ZC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\AboutPage.g.csW
|
||||||
|
SC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\EntryDetailPage.g.i.csU
|
||||||
|
QC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\EntryDetailPage.g.csW
|
||||||
|
SC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\GroupDetailPage.g.i.csU
|
||||||
|
QC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\GroupDetailPage.g.csa
|
||||||
|
]C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\DonatePage.g.i.cs_
|
||||||
|
[C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\DonatePage.g.csf
|
||||||
|
bC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\NewDatabasePage.g.i.csd
|
||||||
|
`C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\NewDatabasePage.g.csg
|
||||||
|
cC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\OpenDatabasePage.g.i.cse
|
||||||
|
aC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\OpenDatabasePage.g.csj
|
||||||
|
fC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\RecentDatabasesPage.g.i.csh
|
||||||
|
dC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\RecentDatabasesPage.g.csg
|
||||||
|
cC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\SaveDatabasePage.g.i.cse
|
||||||
|
aC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\SaveDatabasePage.g.csT
|
||||||
|
PC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPage.g.i.csR
|
||||||
|
NC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPage.g.csb
|
||||||
|
^C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\WelcomePage.g.i.cs`
|
||||||
|
\C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\MainPageFrames\WelcomePage.g.cso
|
||||||
|
kC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsDatabasePage.g.i.csm
|
||||||
|
iC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsDatabasePage.g.csr
|
||||||
|
nC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsNewDatabasePage.g.i.csp
|
||||||
|
lC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsNewDatabasePage.g.cso
|
||||||
|
kC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsSecurityPage.g.i.csm
|
||||||
|
iC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsSecurityPage.g.csn
|
||||||
|
jC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsWelcomePage.g.i.csl
|
||||||
|
hC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\SettingsPageFrames\SettingsWelcomePage.g.cs]
|
||||||
|
YC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\HamburgerButtonStyle.g.i.cs[
|
||||||
|
WC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\HamburgerButtonStyle.g.csc
|
||||||
|
_C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\ListViewLeftIndicatorStyle.g.i.csa
|
||||||
|
]C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\ListViewLeftIndicatorStyle.g.cs\
|
||||||
|
XC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\NoBorderButtonStyle.g.i.csZ
|
||||||
|
VC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\NoBorderButtonStyle.g.csO
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\Styles.g.i.csM
|
||||||
|
IC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\Styles.g.cs_
|
||||||
|
[C:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\TextBoxWithButtonStyle.g.i.cs]
|
||||||
|
YC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Styles\TextBoxWithButtonStyle.g.csm
|
||||||
|
iC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\UserControls\HamburgerMenuUserControl.g.i.csk
|
||||||
|
gC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\Views\UserControls\HamburgerMenuUserControl.g.csL
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\obj\Debug\XamlTypeInfo.g.csQ
|
||||||
|
MC:\Users\GBE\AppData\Local\Temp\.NETCore,Version=v4.5.1.AssemblyAttributes.cs
|
180
ModernKeePass/.sonarqube/out/0/output-cs/metrics.pb
Normal file
180
ModernKeePass/.sonarqube/out/0/output-cs/metrics.pb
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
<EFBFBD>
|
||||||
|
GC:\Sources\Other\ModernKeePass\ModernKeePass\Actions\ClipboardAction.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=3;2=0;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
|
||||||
|
<1A><17>
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\Actions\NavigateToUrlAction.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=3;2=0;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
|
||||||
|
!x<01>
|
||||||
|
<1D>
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\Actions\SetupFocusAction.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=2;2=1;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
|
||||||
|
<1B>
|
||||||
|
<18>
|
||||||
|
8C:\Sources\Other\ModernKeePass\ModernKeePass\App.xaml.cs7 8@HR 0=0;5=0;10=0;20=1;30=0;60=0;90=0Z1=5;2=1;4=2;6=1;8=0;10=0;12=0jH*>?@ABFTZ[^`fluvwz|}<7D><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01>r<>
|
||||||
|
|
||||||
|
!"#()+,-./023456789:;<CDEFGIJKLNORSUX\]_bdehjmnpqrstxy<79><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01>x<10>I !"+-./24579:EFKRX\_bdhmpsx<73><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01>
|
||||||
|
OC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\IntToSymbolConverter.cs7 (08;@;H;R 0=0;5=0;10=0;20=0;30=1;60=0;90=0Z1=0;2=1;4=0;6=0;8=0;10=0;12=1j<31>+,08<@JKLMZ[\]^_`abcdefgjklmnopqrstuvwxyz{|}~<><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03>r[
|
||||||
|
|
||||||
|
!"#$%&'()*-./12345679:;=>?ABCDEFGHINOPQRSUVWXYhi<68><03><03><03><03><03>x<02>?
|
||||||
|
!"#$%&'()*-./12345679:;=>?ABCDEFGHINOPQXhi<68><03>
|
||||||
|
RC:\Sources\Other\ModernKeePass\ModernKeePass\Exceptions\DatabaseOpenedException.cs(0R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r <09>
|
||||||
|
JC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\ILicenseService.cs(08@R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
<0C>
|
||||||
|
RC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IProxyInvocationHandler.cs(0R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r <09>
|
||||||
|
IC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IRecentService.cs(08@R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
|
||||||
|
<0F>
|
||||||
|
FC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IRecentItem.cs(08@R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
|
||||||
|
<0B>
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IResourceService.cs(0R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r<07>
|
||||||
|
MC:\Sources\Other\ModernKeePass\ModernKeePass\Services\SingletonServiceBase.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
|
||||||
|
<0C>
|
||||||
|
<EFBFBD>
|
||||||
|
`C:\Sources\Other\ModernKeePass\ModernKeePass\TemplateSelectors\SelectableDataTemplateSelector.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=4;2=1;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
|
||||||
|
x<02><0F>
|
||||||
|
OC:\Sources\Other\ModernKeePass\ModernKeePass\ViewModels\Items\SettingsSaveVm.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=4;2=0;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
|
||||||
|
<18>
|
||||||
|
<15>
|
||||||
|
TC:\Sources\Other\ModernKeePass\ModernKeePass\Views\MainPageFrames\DonatePage.xaml.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=0;6=0;8=0;10=0;12=0jr
|
||||||
|
|
||||||
|
|
||||||
|
<0F><0C>
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\Services\DatabaseService.csQ (082@2H2R 0=0;5=0;10=0;20=0;30=1;60=0;90=0Z1=25;2=5;4=0;6=2;8=0;10=0;12=0j$cdefghky<6B><01><01><01><01><01><01><01><01><01><01><01><01><01>r<>
|
||||||
|
|
||||||
|
!"#$%')*+,-/0123456789:<=>?@BCDEFHIJKLNOPQRTUVWYZ[]^_`ijlmnopqstuvwz{|}~<><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><02><02><02><02><02>x<16><01>"#'+,1468>?DEJKPQTUY_npstuwz{|<><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><02><02>
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\ISettingsService.cs(0R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r<08>
|
||||||
|
JC:\Sources\Other\ModernKeePass\ModernKeePass\Common\MessageDialogHelper.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=4;2=2;4=0;6=0;8=0;10=0;12=0j9<DJMPSr?
|
||||||
|
|
||||||
|
!"$%&')*+,-./01234678:=>@ABEFHIKNQTVWXYx<03> "$%+-.028:=BENQTV<54>
|
||||||
|
GC:\Sources\Other\ModernKeePass\ModernKeePass\Common\NavigationHelper.csD (8>@>H>R 0=0;5=0;10=0;20=0;30=0;60=1;90=0Z1=12;2=8;4=1;6=1;8=0;10=0;12=1j<31> !"#&(*,-./02579:ABCDEFKLMSW`stuvxyz<79><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03>r<>
|
||||||
|
|
||||||
|
;<=>?GHINOTUVXYZ[\^abfghiklpq{|}~<><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03><03>x*<2A><01>?INTUXZ[afhi<69><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><03><03><03>
|
||||||
|
PC:\Sources\Other\ModernKeePass\ModernKeePass\Common\NotifyPropertyChangedBase.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=2;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
x<01>
|
||||||
|
<19>
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\Common\ObservableDictionary.cs( (08!@&H!R 0=0;5=0;10=0;20=0;30=1;60=0;90=0Z1=18;2=5;4=1;6=0;8=0;10=0;12=0j
|
||||||
|
r<>
|
||||||
|
!"#$&'()*,-./12345679:;<=>?@ACDEFGHIJKLMOPQRSTUVWXYZ\]^_`abcdfghiklmnpqrsuvwxz{|}<><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01>x <09>. "().35;=>@FGIJLSWX^_`bhmrw|<7C><01><01><01><01><01><01><01><01>
|
||||||
|
CC:\Sources\Other\ModernKeePass\ModernKeePass\Common\RelayCommand.cs (8@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=2;2=3;4=0;6=0;8=0;10=0;12=0j%
|
||||||
|
|
||||||
|
$%&'(1234567=>?@ABHIJKLr* !")*+,-./89:;CDEFMNOPQRSTUVx<03>+,-.:EPR<50>
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\Common\SuspensionManager.cs8 (08@HR 0=0;5=0;10=0;20=1;30=0;60=0;90=0Z1=5;2=3;4=3;6=0;8=0;10=0;12=0j~ !"#)*+,-3456789>HIN\]^_`abcdefmqv<71><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01>r<>
|
||||||
|
$%&'./01:;<=?@ABCDEFJKLOPQRSTUVWXYZghiklnoprstwxyz{|}~<><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><02><02><02><02><02><02><02><02><02><02><02>x<15>S&0?BDLOPRSXinoswz|}<7D><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01>
|
||||||
|
GC:\Sources\Other\ModernKeePass\ModernKeePass\Services\LicenseService.cs (08@HR 0=0;5=0;10=1;20=0;30=0;60=0;90=0Z1=5;2=0;4=0;6=1;8=0;10=0;12=0j*+r?
|
||||||
|
|
||||||
|
!"#$%&'(),-./012345678:;<=>@ABCEFGHIJx<03>#$&'(),.012346<=BG<42>
|
||||||
|
FC:\Sources\Other\ModernKeePass\ModernKeePass\Services\RecentService.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=4;2=1;4=0;6=0;8=0;10=0;12=0r,
|
||||||
|
|
||||||
|
!#$%&()*+-./012x<06>
|
||||||
|
|
||||||
|
%*/<2F>
|
||||||
|
IC:\Sources\Other\ModernKeePass\ModernKeePass\Services\ResourcesService.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
<11>
|
||||||
|
<0E>
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\Services\SettingsService.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=1;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
|
||||||
|
x<03>
|
||||||
|
<1C>
|
||||||
|
NC:\Sources\Other\ModernKeePass\ModernKeePass\Common\ToastNotificationHelper.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=2;2=1;4=0;6=0;8=0;10=0;12=0r0
|
||||||
|
|
||||||
|
!#$%&'(*+,-./123456x<01> %&'(,.3<EFBFBD>
|
||||||
|
`C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\DiscreteIntToSolidColorBrushConverter.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=1;6=0;8=0;10=0;12=0r
|
||||||
|
|
||||||
|
x<01>
|
||||||
|
<18>
|
||||||
|
[C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\EmptyStringToVisibilityConverter.cs 8@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=1;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
|
||||||
|
x<02><11>
|
||||||
|
QC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\NullToBooleanConverter.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=2;2=0;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
|
||||||
|
<12>
|
||||||
|
<0F>
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\Exceptions\SaveException.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=2;2=0;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
|
||||||
|
<0E><0B>
|
||||||
|
SC:\Sources\Other\ModernKeePass\ModernKeePass\Extensions\DispatcherTaskExtensions.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=2;2=0;4=0;6=0;8=0;10=0;12=0jr
|
||||||
|
|
||||||
|
x<03>
|
||||||
|
|
||||||
|
<1E>
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IDatabaseService.cs(08@R 0=0;5=0;10=0;20=1;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0jr
|
||||||
|
|
||||||
|
!"#<23>
|
||||||
|
OC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IHasSelectableObject.cs(08@R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r<07>
|
||||||
|
KC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\ISelectableModel.cs(08@R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r<07>
|
||||||
|
SC:\Sources\Other\ModernKeePass\ModernKeePass\Views\BasePages\LayoutAwarePageBase.cs" (08#@#H#R 0=0;5=0;10=0;20=0;30=1;60=0;90=0Z1=13;2=4;4=1;6=1;8=0;10=0;12=0j\
|
||||||
|
"#*+,-.456789:;<=>ABFGOWXYZ[\]^ijlmnrstuv|}~<><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01>r<>
|
||||||
|
$%&()/012?@DEHIJKLMNPQRSTU_`abcdepwxyz<79><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01>x<10>1 $%/01DHJPRacy<63><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01><01>
|
||||||
|
bC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsDatabasePage.xaml.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=0;6=0;8=0;10=0;12=0jr
|
||||||
|
|
||||||
|
|
||||||
|
<0F><0C>
|
||||||
|
eC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsNewDatabasePage.xaml.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=0;6=0;8=0;10=0;12=0jr
|
||||||
|
|
||||||
|
|
||||||
|
<0F><0C>
|
||||||
|
^C:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsSavePage.xaml.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=0;6=0;8=0;10=0;12=0jr
|
||||||
|
|
||||||
|
|
||||||
|
<0F><0C>
|
||||||
|
bC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsSecurityPage.xaml.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=2;2=0;4=0;6=0;8=0;10=0;12=0j
|
||||||
|
r
|
||||||
|
<17><14>
|
||||||
|
aC:\Sources\Other\ModernKeePass\ModernKeePass\Views\SettingsPageFrames\SettingsWelcomePage.xaml.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=0;6=0;8=0;10=0;12=0jr
|
||||||
|
|
||||||
|
|
||||||
|
<0F><0C>
|
||||||
|
_C:\Sources\Other\ModernKeePass\ModernKeePass\TemplateSelectors\FirstItemDataTemplateSelector.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=4;2=1;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
x<01>
|
||||||
|
<0F>
|
||||||
|
LC:\Sources\Other\ModernKeePass\ModernKeePass\Controls\ListViewWithDisable.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=1;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
|
||||||
|
x<02><11>
|
||||||
|
]C:\Sources\Other\ModernKeePass\ModernKeePass\Views\UserControls\BreadCrumbUserControl.xaml.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=3;2=0;4=0;6=0;8=0;10=0;12=0jr
|
||||||
|
|
||||||
|
<1D>
|
||||||
|
<1B>
|
||||||
|
_C:\Sources\Other\ModernKeePass\ModernKeePass\Views\UserControls\CompositeKeyUserControl.xaml.cs
|
||||||
|
(08@HR 0=0;5=0;10=0;20=1;30=0;60=0;90=0Z1=8;2=4;4=0;6=1;8=0;10=0;12=0j`ort
|
||||||
|
!"#$%&'()*,-./01234569;<=>@ABCEFGIJKLMNOPQRSTUVWXY[\]^_abcefghijklmpqrsuvwxyz{|~<><01><01><01>x <09>%"#&*./26=GIKLRSUW]_ajkmpqry|~<><01>
|
||||||
|
JC:\Sources\Other\ModernKeePass\ModernKeePass\Controls\TextBoxWithButton.cs (
|
||||||
|
0
|
||||||
|
8@HR 0=0;5=0;10=1;20=0;30=0;60=0;90=0Z1=8;2=1;4=0;6=0;8=0;10=0;12=0r@
|
||||||
|
|
||||||
|
!#$%&'()*+,-/0123456789;<=>?@ABCDEx<01>
|
||||||
|
!%&)-1259=>?A<>
|
||||||
|
WC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\BooleanToVisibilityConverter.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=0;2=1;4=1;6=0;8=0;10=0;12=0jr
|
||||||
|
|
||||||
|
x<04><18>
|
||||||
|
PC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\ColorToBrushConverter.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=1;6=0;8=0;10=0;12=0r
|
||||||
|
|
||||||
|
x<03>
|
||||||
|
<17>
|
||||||
|
[C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\DoubleToSolidColorBrushConverter.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=2;2=0;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
|
||||||
|
x<01><1C>
|
||||||
|
^C:\Sources\Other\ModernKeePass\ModernKeePass\Converters\InverseBooleanToVisibilityConverter.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=0;2=1;4=1;6=0;8=0;10=0;12=0jr
|
||||||
|
|
||||||
|
x<04><18>
|
||||||
|
QC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\PluralizationConverter.cs (08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=0;6=1;8=0;10=0;12=0jr
|
||||||
|
|
||||||
|
x<04>
|
||||||
|
<15>
|
||||||
|
ZC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\ProgressBarLegalValuesConverter.cs
|
||||||
|
(08@HR 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=1;2=0;4=0;6=1;8=0;10=0;12=0r
|
||||||
|
x<05> <18>
|
||||||
|
OC:\Sources\Other\ModernKeePass\ModernKeePass\Converters\TextToWidthConverter.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=1;2=1;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
|
||||||
|
<14>
|
||||||
|
<11>
|
||||||
|
HC:\Sources\Other\ModernKeePass\ModernKeePass\Events\PasswordEventArgs.cs (08@HR 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=3;2=0;4=0;6=0;8=0;10=0;12=0r
|
||||||
|
|
||||||
|
|
||||||
|
<0F><0C>
|
||||||
|
EC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IIsEnabled.cs(08@R 0=1;5=0;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0r<07>
|
||||||
|
DC:\Sources\Other\ModernKeePass\ModernKeePass\Interfaces\IPwEntity.cs(08 @ R 0=0;5=1;10=0;20=0;30=0;60=0;90=0Z1=0;2=0;4=0;6=0;8=0;10=0;12=0j "#$r
|
||||||
|
|
2912
ModernKeePass/.sonarqube/out/0/output-cs/symrefs.pb
Normal file
2912
ModernKeePass/.sonarqube/out/0/output-cs/symrefs.pb
Normal file
File diff suppressed because it is too large
Load Diff
24951
ModernKeePass/.sonarqube/out/0/output-cs/token-cpd.pb
Normal file
24951
ModernKeePass/.sonarqube/out/0/output-cs/token-cpd.pb
Normal file
File diff suppressed because it is too large
Load Diff
2160
ModernKeePass/.sonarqube/out/0/output-cs/token-type.pb
Normal file
2160
ModernKeePass/.sonarqube/out/0/output-cs/token-type.pb
Normal file
File diff suppressed because it is too large
Load Diff
210
ModernKeePass/.sonarqube/out/sonar-project.properties
Normal file
210
ModernKeePass/.sonarqube/out/sonar-project.properties
Normal file
@@ -0,0 +1,210 @@
|
|||||||
|
sonar.projectKey=ModernKeePass
|
||||||
|
sonar.working.directory=C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\.sonarqube\\out\\.sonar
|
||||||
|
sonar.projectBaseDir=C:\\Sources\\Other\\ModernKeePass\\ModernKeePass
|
||||||
|
|
||||||
|
A0CFC681-769B-405A-8482-0CDEE595A91F.sonar.projectKey=ModernKeePass:A0CFC681-769B-405A-8482-0CDEE595A91F
|
||||||
|
A0CFC681-769B-405A-8482-0CDEE595A91F.sonar.projectName=ModernKeePass.App
|
||||||
|
A0CFC681-769B-405A-8482-0CDEE595A91F.sonar.projectBaseDir=C:\\Sources\\Other\\ModernKeePass\\ModernKeePass
|
||||||
|
A0CFC681-769B-405A-8482-0CDEE595A91F.sonar.sourceEncoding=utf-8
|
||||||
|
A0CFC681-769B-405A-8482-0CDEE595A91F.sonar.sources=\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Actions\\ClipboardAction.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Actions\\NavigateToUrlAction.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Actions\\SetupFocusAction.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\App.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\IntToSymbolConverter.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Exceptions\\DatabaseOpenedException.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\ILicenseService.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\IProxyInvocationHandler.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\IRecentService.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\IRecentItem.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\IResourceService.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Services\\SingletonServiceBase.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\TemplateSelectors\\SelectableDataTemplateSelector.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\Items\\SettingsSaveVm.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\DonatePage.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Services\\DatabaseService.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\ISettingsService.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Common\\MessageDialogHelper.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Common\\NavigationHelper.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Common\\NotifyPropertyChangedBase.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Common\\ObservableDictionary.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Common\\RelayCommand.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Common\\SuspensionManager.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Services\\LicenseService.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Services\\RecentService.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Services\\ResourcesService.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Services\\SettingsService.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Common\\ToastNotificationHelper.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\DiscreteIntToSolidColorBrushConverter.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\EmptyStringToVisibilityConverter.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\NullToBooleanConverter.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Exceptions\\SaveException.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Extensions\\DispatcherTaskExtensions.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\IDatabaseService.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\IHasSelectableObject.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\ISelectableModel.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\BasePages\\LayoutAwarePageBase.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsDatabasePage.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsNewDatabasePage.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsSavePage.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsSecurityPage.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsWelcomePage.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\TemplateSelectors\\FirstItemDataTemplateSelector.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Controls\\ListViewWithDisable.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\UserControls\\BreadCrumbUserControl.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\UserControls\\CompositeKeyUserControl.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Controls\\TextBoxWithButton.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\BooleanToVisibilityConverter.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\ColorToBrushConverter.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\DoubleToSolidColorBrushConverter.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\InverseBooleanToVisibilityConverter.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\PluralizationConverter.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\ProgressBarLegalValuesConverter.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Converters\\TextToWidthConverter.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Events\\PasswordEventArgs.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\IIsEnabled.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Interfaces\\IPwEntity.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPage.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\AboutPage.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\NewDatabasePage.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPage.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\WelcomePage.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\AboutVm.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\CompositeKeyVm.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\Items\\ListMenuItemVm.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\Items\\MainMenuItemVm.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\Items\\RecentItemVm.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\EntryDetailPage.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\GroupDetailPage.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\OpenDatabasePage.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\RecentDatabasesPage.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\SaveDatabasePage.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Properties\\AssemblyInfo.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\EntryVm.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\GroupVm.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\Items\\SettingsNewVm.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\SettingsVm.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\MainVm.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\NewVm.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\OpenVm.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\RecentVm.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\SaveVm.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\ViewModels\\Items\\SettingsDatabaseVm.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\UserControls\\HamburgerMenuUserControl.xaml.cs",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\description.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\description.Entry.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\description.Filter.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\description.Group.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\description.New.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\description.Open.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\description.Recent.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\description.Semantic.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\description.Settings.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\Entry.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\Filter.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\Group.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\New.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\Open.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\Recent.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\Semantic.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\images\\Screenshot\\Settings.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\keywords.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\privacyPolicy.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\releaseNotes.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\en-us\\baselisting\\websiteUrl.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\description.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\description.Entry.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\description.Filter.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\description.Group.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\description.New.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\description.Open.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\description.Recent.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\description.Semantic.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\description.Settings.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\Entry.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\Filter.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\Group.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\New.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\Open.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\Recent.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\Semantic.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\images\\Screenshot\\Settings.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\keywords.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\privacyPolicy.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\releaseNotes.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\appMetadata\\fr-fr\\baselisting\\websiteUrl.txt",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Logo.scale-100.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Logo.scale-140.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Logo.scale-180.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Logo.scale-80.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SmallLogo.scale-100.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SmallLogo.scale-140.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SmallLogo.scale-180.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SmallLogo.scale-80.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SmallLogo.targetsize-16.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SmallLogo.targetsize-256.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SmallLogo.targetsize-32.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SmallLogo.targetsize-48.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SplashScreen.scale-100.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SplashScreen.scale-140.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\ModernKeePass-SplashScreen.scale-180.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Square310x310Logo.scale-100.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Square310x310Logo.scale-140.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Square310x310Logo.scale-180.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Square310x310Logo.scale-80.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Square70x70Logo.scale-100.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Square70x70Logo.scale-140.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Square70x70Logo.scale-180.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Square70x70Logo.scale-80.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\StoreLogo.scale-100.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\StoreLogo.scale-140.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\StoreLogo.scale-180.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Wide310x150Logo.scale-100.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Wide310x150Logo.scale-140.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Wide310x150Logo.scale-180.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Assets\\Wide310x150Logo.scale-80.png",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\packages.config",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Strings\\fr-FR\\Resources.resw",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Strings\\fr-FR\\CodeBehind.resw",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Strings\\en-US\\CodeBehind.resw",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Strings\\en-US\\Resources.resw",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Styles\\Colors.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsSavePage.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\UserControls\\BreadCrumbUserControl.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\UserControls\\CompositeKeyUserControl.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPage.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\AboutPage.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\EntryDetailPage.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\GroupDetailPage.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\DonatePage.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\NewDatabasePage.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\OpenDatabasePage.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\RecentDatabasesPage.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\SaveDatabasePage.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPage.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\MainPageFrames\\WelcomePage.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsDatabasePage.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsNewDatabasePage.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsSecurityPage.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\SettingsPageFrames\\SettingsWelcomePage.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Styles\\HamburgerButtonStyle.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Styles\\ListViewLeftIndicatorStyle.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Styles\\NoBorderButtonStyle.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Styles\\Styles.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Styles\\TextBoxWithButtonStyle.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\Views\\UserControls\\HamburgerMenuUserControl.xaml",\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\App.xaml"
|
||||||
|
|
||||||
|
A0CFC681-769B-405A-8482-0CDEE595A91F.sonar.cs.roslyn.reportFilePath=C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\bin\\Debug\\ModernKeePass.exe.RoslynCA.json
|
||||||
|
A0CFC681-769B-405A-8482-0CDEE595A91F.sonar.cs.analyzer.projectOutPath=C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\.sonarqube\\out\\0
|
||||||
|
A0CFC681-769B-405A-8482-0CDEE595A91F.sonar.cs.analyzer.projectOutPaths=\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\.sonarqube\\out\\0"
|
||||||
|
A0CFC681-769B-405A-8482-0CDEE595A91F.sonar.cs.roslyn.reportFilePaths=\
|
||||||
|
"C:\\Sources\\Other\\ModernKeePass\\ModernKeePass\\bin\\Debug\\ModernKeePass.exe.RoslynCA.json"
|
||||||
|
|
||||||
|
sonar.organization=geogeob
|
||||||
|
sonar.host.url=https://sonarcloud.io
|
||||||
|
sonar.visualstudio.enable=false
|
||||||
|
|
||||||
|
sonar.modules=A0CFC681-769B-405A-8482-0CDEE595A91F
|
||||||
|
|
3
ModernKeePass/.sonarqube/out/summary.md
Normal file
3
ModernKeePass/.sonarqube/out/summary.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
Analysis succeeded for SonarQube project "", version [Analysis results](https://sonarcloud.io/dashboard/index/ModernKeePass)
|
||||||
|
- Product projects: 1, test projects: 0
|
||||||
|
- Invalid projects: 0, skipped projects: 0, excluded projects: 0
|
54
ModernKeePass/Actions/DeleteEntityAction.cs
Normal file
54
ModernKeePass/Actions/DeleteEntityAction.cs
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
using System.Windows.Input;
|
||||||
|
using Windows.UI.Xaml;
|
||||||
|
using Microsoft.Xaml.Interactivity;
|
||||||
|
using ModernKeePass.Common;
|
||||||
|
using ModernKeePass.Interfaces;
|
||||||
|
using ModernKeePass.Services;
|
||||||
|
using ModernKeePass.ViewModels;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Actions
|
||||||
|
{
|
||||||
|
public class DeleteEntityAction : DependencyObject, IAction
|
||||||
|
{
|
||||||
|
public IPwEntity Entity
|
||||||
|
{
|
||||||
|
get { return (IPwEntity)GetValue(EntityProperty); }
|
||||||
|
set { SetValue(EntityProperty, value); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static readonly DependencyProperty EntityProperty =
|
||||||
|
DependencyProperty.Register("Entity", typeof(IPwEntity), typeof(DeleteEntityAction),
|
||||||
|
new PropertyMetadata(null));
|
||||||
|
|
||||||
|
public ICommand Command
|
||||||
|
{
|
||||||
|
get { return (ICommand)GetValue(CommandProperty); }
|
||||||
|
set { SetValue(CommandProperty, value); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static readonly DependencyProperty CommandProperty =
|
||||||
|
DependencyProperty.Register("Command", typeof(ICommand), typeof(DeleteEntityAction),
|
||||||
|
new PropertyMetadata(null));
|
||||||
|
|
||||||
|
public object Execute(object sender, object parameter)
|
||||||
|
{
|
||||||
|
var resource = new ResourcesService();
|
||||||
|
var type = Entity is GroupVm ? "Group" : "Entry";
|
||||||
|
|
||||||
|
var message = Entity.IsRecycleOnDelete
|
||||||
|
? resource.GetResourceValue($"{type}RecyclingConfirmation")
|
||||||
|
: resource.GetResourceValue($"{type}DeletingConfirmation");
|
||||||
|
var text = Entity.IsRecycleOnDelete ? resource.GetResourceValue($"{type}Recycled") : resource.GetResourceValue($"{type}Deleted");
|
||||||
|
MessageDialogHelper.ShowActionDialog(resource.GetResourceValue("EntityDeleteTitle"), message,
|
||||||
|
resource.GetResourceValue("EntityDeleteActionButton"),
|
||||||
|
resource.GetResourceValue("EntityDeleteCancelButton"), a =>
|
||||||
|
{
|
||||||
|
ToastNotificationHelper.ShowMovedToast(Entity, resource.GetResourceValue("EntityDeleting"), text);
|
||||||
|
Entity.MarkForDelete(resource.GetResourceValue("RecycleBinTitle"));
|
||||||
|
Command.Execute(null);
|
||||||
|
}, null).GetAwaiter();
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
33
ModernKeePass/Actions/NavigateToUrlAction.cs
Normal file
33
ModernKeePass/Actions/NavigateToUrlAction.cs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
using System;
|
||||||
|
using Windows.UI.Xaml;
|
||||||
|
using Microsoft.Xaml.Interactivity;
|
||||||
|
using ModernKeePass.Common;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Actions
|
||||||
|
{
|
||||||
|
public class NavigateToUrlAction : DependencyObject, IAction
|
||||||
|
{
|
||||||
|
public string Url
|
||||||
|
{
|
||||||
|
get { return (string)GetValue(UrlProperty); }
|
||||||
|
set { SetValue(UrlProperty, value); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static readonly DependencyProperty UrlProperty =
|
||||||
|
DependencyProperty.Register("Url", typeof(string), typeof(NavigateToUrlAction), new PropertyMetadata(string.Empty));
|
||||||
|
|
||||||
|
public object Execute(object sender, object parameter)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var uri = new Uri(Url);
|
||||||
|
return Windows.System.Launcher.LaunchUriAsync(uri).GetAwaiter().GetResult();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
MessageDialogHelper.ShowErrorDialog(ex).GetAwaiter();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
46
ModernKeePass/Actions/RestoreEntityAction.cs
Normal file
46
ModernKeePass/Actions/RestoreEntityAction.cs
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
using System.Windows.Input;
|
||||||
|
using Windows.UI.Xaml;
|
||||||
|
using Microsoft.Xaml.Interactivity;
|
||||||
|
using ModernKeePass.Common;
|
||||||
|
using ModernKeePass.Interfaces;
|
||||||
|
using ModernKeePass.Services;
|
||||||
|
using ModernKeePass.ViewModels;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Actions
|
||||||
|
{
|
||||||
|
public class RestoreEntityAction : DependencyObject, IAction
|
||||||
|
{
|
||||||
|
public IPwEntity Entity
|
||||||
|
{
|
||||||
|
get { return (IPwEntity)GetValue(EntityProperty); }
|
||||||
|
set { SetValue(EntityProperty, value); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static readonly DependencyProperty EntityProperty =
|
||||||
|
DependencyProperty.Register("Entity", typeof(IPwEntity), typeof(RestoreEntityAction),
|
||||||
|
new PropertyMetadata(null));
|
||||||
|
|
||||||
|
public ICommand Command
|
||||||
|
{
|
||||||
|
get { return (ICommand)GetValue(CommandProperty); }
|
||||||
|
set { SetValue(CommandProperty, value); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static readonly DependencyProperty CommandProperty =
|
||||||
|
DependencyProperty.Register("Command", typeof(ICommand), typeof(RestoreEntityAction),
|
||||||
|
new PropertyMetadata(null));
|
||||||
|
|
||||||
|
|
||||||
|
public object Execute(object sender, object parameter)
|
||||||
|
{
|
||||||
|
var resource = new ResourcesService();
|
||||||
|
var type = Entity is GroupVm ? "Group" : "Entry";
|
||||||
|
|
||||||
|
ToastNotificationHelper.ShowMovedToast(Entity, resource.GetResourceValue("EntityRestoredTitle"),
|
||||||
|
resource.GetResourceValue($"{type}Restored"));
|
||||||
|
Command.Execute(null);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
33
ModernKeePass/Actions/ToastAction.cs
Normal file
33
ModernKeePass/Actions/ToastAction.cs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
using Windows.UI.Xaml;
|
||||||
|
using Microsoft.Xaml.Interactivity;
|
||||||
|
using ModernKeePass.Common;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Actions
|
||||||
|
{
|
||||||
|
public class ToastAction : DependencyObject, IAction
|
||||||
|
{
|
||||||
|
public string Title
|
||||||
|
{
|
||||||
|
get { return (string)GetValue(TitleProperty); }
|
||||||
|
set { SetValue(TitleProperty, value); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static readonly DependencyProperty TitleProperty =
|
||||||
|
DependencyProperty.Register("Title", typeof(string), typeof(ToastAction), new PropertyMetadata(string.Empty));
|
||||||
|
|
||||||
|
public string Message
|
||||||
|
{
|
||||||
|
get { return (string)GetValue(MessageProperty); }
|
||||||
|
set { SetValue(MessageProperty, value); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static readonly DependencyProperty MessageProperty =
|
||||||
|
DependencyProperty.Register("Message", typeof(string), typeof(ToastAction), new PropertyMetadata(string.Empty));
|
||||||
|
|
||||||
|
public object Execute(object sender, object parameter)
|
||||||
|
{
|
||||||
|
ToastNotificationHelper.ShowGenericToast(Title, Message);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -6,10 +6,13 @@
|
|||||||
<Application.Resources>
|
<Application.Resources>
|
||||||
<ResourceDictionary>
|
<ResourceDictionary>
|
||||||
<ResourceDictionary.MergedDictionaries>
|
<ResourceDictionary.MergedDictionaries>
|
||||||
<ResourceDictionary Source="Styles/TextBoxWithButtonStyle.xaml" />
|
<ResourceDictionary Source="ResourceDictionaries/Globals.xaml" />
|
||||||
<ResourceDictionary Source="Styles/HamburgerButtonStyle.xaml" />
|
<ResourceDictionary Source="ResourceDictionaries/TextBoxWithButtonStyle.xaml" />
|
||||||
<ResourceDictionary Source="Styles/ListViewLeftIndicatorStyle.xaml" />
|
<ResourceDictionary Source="ResourceDictionaries/HamburgerButtonStyle.xaml" />
|
||||||
<ResourceDictionary Source="Styles/NoBorderButtonStyle.xaml" />
|
<ResourceDictionary Source="ResourceDictionaries/ListViewLeftIndicatorStyle.xaml" />
|
||||||
|
<ResourceDictionary Source="ResourceDictionaries/NoBorderButtonStyle.xaml" />
|
||||||
|
<ResourceDictionary Source="ResourceDictionaries/NoBorderToggleButtonStyle.xaml" />
|
||||||
|
<ResourceDictionary Source="ResourceDictionaries/Styles.xaml" />
|
||||||
</ResourceDictionary.MergedDictionaries>
|
</ResourceDictionary.MergedDictionaries>
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
</Application.Resources>
|
</Application.Resources>
|
||||||
|
@@ -1,14 +1,19 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using Windows.ApplicationModel;
|
using Windows.ApplicationModel;
|
||||||
using Windows.ApplicationModel.Activation;
|
using Windows.ApplicationModel.Activation;
|
||||||
using Windows.Data.Json;
|
|
||||||
using Windows.Storage;
|
using Windows.Storage;
|
||||||
|
using Windows.Storage.Pickers;
|
||||||
using Windows.UI.Xaml;
|
using Windows.UI.Xaml;
|
||||||
using Windows.UI.Xaml.Controls;
|
using Windows.UI.Xaml.Controls;
|
||||||
using Windows.UI.Xaml.Navigation;
|
using Windows.UI.Xaml.Navigation;
|
||||||
|
using Microsoft.HockeyApp;
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Exceptions;
|
||||||
|
using ModernKeePass.Services;
|
||||||
|
using ModernKeePass.Views;
|
||||||
|
|
||||||
// The Blank Application template is documented at http://go.microsoft.com/fwlink/?LinkId=234227
|
// The Blank Application template is documented at http://go.microsoft.com/fwlink/?LinkId=234227
|
||||||
|
|
||||||
@@ -19,41 +24,78 @@ namespace ModernKeePass
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
sealed partial class App
|
sealed partial class App
|
||||||
{
|
{
|
||||||
public DatabaseHelper Database { get; set; } = new DatabaseHelper();
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes the singleton application object. This is the first line of authored code
|
/// Initializes the singleton application object. This is the first line of authored code
|
||||||
/// executed, and as such is the logical equivalent of main() or WinMain().
|
/// executed, and as such is the logical equivalent of main() or WinMain().
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public App()
|
public App()
|
||||||
{
|
{
|
||||||
|
HockeyClient.Current.Configure("2fe83672887b4910b9de93a4398d0f8f");
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
Suspending += OnSuspending;
|
Suspending += OnSuspending;
|
||||||
|
Resuming += OnResuming;
|
||||||
|
UnhandledException += OnUnhandledException;
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Event Handlers
|
#region Event Handlers
|
||||||
|
|
||||||
|
private async void OnUnhandledException(object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs)
|
||||||
|
{
|
||||||
|
// Save the argument exception because it's cleared on first access
|
||||||
|
var exception = unhandledExceptionEventArgs.Exception;
|
||||||
|
var realException =
|
||||||
|
exception is TargetInvocationException &&
|
||||||
|
exception.InnerException != null
|
||||||
|
? exception.InnerException
|
||||||
|
: exception;
|
||||||
|
|
||||||
|
var database = DatabaseService.Instance;
|
||||||
|
var resource = new ResourcesService();
|
||||||
|
if (realException is SaveException)
|
||||||
|
{
|
||||||
|
unhandledExceptionEventArgs.Handled = true;
|
||||||
|
await MessageDialogHelper.ShowActionDialog(resource.GetResourceValue("MessageDialogSaveErrorTitle"),
|
||||||
|
realException.InnerException.Message,
|
||||||
|
resource.GetResourceValue("MessageDialogSaveErrorButtonSaveAs"),
|
||||||
|
resource.GetResourceValue("MessageDialogSaveErrorButtonDiscard"),
|
||||||
|
async command =>
|
||||||
|
{
|
||||||
|
var savePicker = new FileSavePicker
|
||||||
|
{
|
||||||
|
SuggestedStartLocation = PickerLocationId.DocumentsLibrary,
|
||||||
|
SuggestedFileName = $"{database.Name} - copy"
|
||||||
|
};
|
||||||
|
savePicker.FileTypeChoices.Add(resource.GetResourceValue("MessageDialogSaveErrorFileTypeDesc"),
|
||||||
|
new List<string> {".kdbx"});
|
||||||
|
|
||||||
|
var file = await savePicker.PickSaveFileAsync();
|
||||||
|
if (file != null) database.Save(file);
|
||||||
|
}, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Invoked when the application is launched normally by the end user. Other entry points
|
/// Invoked when the application is launched normally by the end user. Other entry points
|
||||||
/// will be used such as when the application is launched to open a specific file.
|
/// will be used such as when the application is launched to open a specific file.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="e">Details about the launch request and process.</param>
|
/// <param name="args">Details about the launch request and process.</param>
|
||||||
protected override void OnLaunched(LaunchActivatedEventArgs e)
|
protected override async void OnLaunched(LaunchActivatedEventArgs args)
|
||||||
{
|
{
|
||||||
OnLaunchOrActivated(e);
|
await OnLaunchOrActivated(args);
|
||||||
|
await HockeyClient.Current.SendCrashesAsync(/* sendWithoutAsking: true */);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnActivated(IActivatedEventArgs args)
|
protected override async void OnActivated(IActivatedEventArgs args)
|
||||||
{
|
{
|
||||||
OnLaunchOrActivated(args);
|
await OnLaunchOrActivated(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnLaunchOrActivated(IActivatedEventArgs e)
|
private async Task OnLaunchOrActivated(IActivatedEventArgs e)
|
||||||
{
|
{
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
if (System.Diagnostics.Debugger.IsAttached)
|
if (System.Diagnostics.Debugger.IsAttached)
|
||||||
{
|
{
|
||||||
//DebugSettings.EnableFrameRateCounter = true;
|
DebugSettings.EnableFrameRateCounter = true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -71,49 +113,54 @@ namespace ModernKeePass
|
|||||||
|
|
||||||
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
|
if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
|
||||||
{
|
{
|
||||||
//TODO: Load state from previously suspended application
|
// Load state from previously terminated application
|
||||||
|
await SuspensionManager.RestoreAsync();
|
||||||
|
#if DEBUG
|
||||||
|
await MessageDialogHelper.ShowNotificationDialog("App terminated", "Windows or an error made the app terminate");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Place the frame in the current Window
|
// Place the frame in the current Window
|
||||||
Window.Current.Content = rootFrame;
|
Window.Current.Content = rootFrame;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e is LaunchActivatedEventArgs)
|
var lauchActivatedEventArgs = e as LaunchActivatedEventArgs;
|
||||||
{
|
if (lauchActivatedEventArgs != null && rootFrame.Content == null)
|
||||||
var lauchActivatedEventArgs = (LaunchActivatedEventArgs) e;
|
rootFrame.Navigate(typeof(MainPage), lauchActivatedEventArgs.Arguments);
|
||||||
if (rootFrame.Content == null)
|
|
||||||
{
|
|
||||||
// When the navigation stack isn't restored navigate to the first page,
|
|
||||||
// configuring the new page by passing required information as a navigation
|
|
||||||
// parameter
|
|
||||||
rootFrame.Navigate(typeof(Pages.MainPage), lauchActivatedEventArgs.Arguments);
|
|
||||||
}
|
|
||||||
/*else
|
|
||||||
{
|
|
||||||
// App is "launched" via the Toast Activation event
|
|
||||||
UndoEntityDelete(lauchActivatedEventArgs.Arguments);
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
// This is only available on Windows 10...
|
|
||||||
/*else if (e is ToastNotificationActivatedEventArgs)
|
|
||||||
{
|
|
||||||
var toastActivationArgs = e as ToastNotificationActivatedEventArgs;
|
|
||||||
|
|
||||||
// Parse the query string (using QueryString.NET)
|
|
||||||
UndoEntityDelete(QueryString.Parse(toastActivationArgs.Argument));
|
|
||||||
}*/
|
|
||||||
// Ensure the current window is active
|
// Ensure the current window is active
|
||||||
Window.Current.Activate();
|
Window.Current.Activate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnResuming(object sender, object e)
|
||||||
|
{
|
||||||
|
var currentFrame = Window.Current.Content as Frame;
|
||||||
|
var database = DatabaseService.Instance;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
database.ReOpen();
|
||||||
|
#if DEBUG
|
||||||
|
ToastNotificationHelper.ShowGenericToast(database.Name, "Database reopened (changes were saved)");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
currentFrame?.Navigate(typeof(MainPage));
|
||||||
|
#if DEBUG
|
||||||
|
ToastNotificationHelper.ShowGenericToast("App resumed", "Nothing to do, no previous database opened");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Invoked when Navigation to a certain page fails
|
/// Invoked when Navigation to a certain page fails
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="sender">The Frame which failed navigation</param>
|
/// <param name="sender">The Frame which failed navigation</param>
|
||||||
/// <param name="e">Details about the navigation failure</param>
|
/// <param name="e">Details about the navigation failure</param>
|
||||||
void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
|
private void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
|
||||||
{
|
{
|
||||||
throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
|
throw new NavigationException(e.SourcePageType);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -123,10 +170,20 @@ namespace ModernKeePass
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="sender">The source of the suspend request.</param>
|
/// <param name="sender">The source of the suspend request.</param>
|
||||||
/// <param name="e">Details about the suspend request.</param>
|
/// <param name="e">Details about the suspend request.</param>
|
||||||
private void OnSuspending(object sender, SuspendingEventArgs e)
|
private async void OnSuspending(object sender, SuspendingEventArgs e)
|
||||||
{
|
{
|
||||||
var deferral = e.SuspendingOperation.GetDeferral();
|
var deferral = e.SuspendingOperation.GetDeferral();
|
||||||
Database.Save();
|
var database = DatabaseService.Instance;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (SettingsService.Instance.GetSetting("SaveSuspend", true)) database.Save();
|
||||||
|
database.Close(false);
|
||||||
|
}
|
||||||
|
catch (Exception exception)
|
||||||
|
{
|
||||||
|
ToastNotificationHelper.ShowErrorToast(exception);
|
||||||
|
}
|
||||||
|
await SuspensionManager.SaveAsync();
|
||||||
deferral.Complete();
|
deferral.Complete();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,11 +195,12 @@ namespace ModernKeePass
|
|||||||
{
|
{
|
||||||
base.OnFileActivated(args);
|
base.OnFileActivated(args);
|
||||||
var rootFrame = new Frame();
|
var rootFrame = new Frame();
|
||||||
Database.DatabaseFile = args.Files[0] as StorageFile;
|
var file = args.Files[0] as StorageFile;
|
||||||
rootFrame.Navigate(typeof(Pages.MainPage), args);
|
rootFrame.Navigate(typeof(MainPage), file);
|
||||||
Window.Current.Content = rootFrame;
|
Window.Current.Content = rootFrame;
|
||||||
Window.Current.Activate();
|
Window.Current.Activate();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,163 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Windows.Storage;
|
|
||||||
using Windows.UI.Xaml.Controls;
|
|
||||||
using ModernKeePass.ViewModels;
|
|
||||||
using ModernKeePassLib;
|
|
||||||
using ModernKeePassLib.Cryptography.KeyDerivation;
|
|
||||||
using ModernKeePassLib.Interfaces;
|
|
||||||
using ModernKeePassLib.Keys;
|
|
||||||
using ModernKeePassLib.Serialization;
|
|
||||||
|
|
||||||
namespace ModernKeePass.Common
|
|
||||||
{
|
|
||||||
public class DatabaseHelper
|
|
||||||
{
|
|
||||||
public enum DatabaseStatus
|
|
||||||
{
|
|
||||||
Error = -3,
|
|
||||||
NoCompositeKey = -2,
|
|
||||||
CompositeKeyError = -1,
|
|
||||||
Closed = 0,
|
|
||||||
Opening = 1,
|
|
||||||
Opened = 2
|
|
||||||
}
|
|
||||||
private readonly PwDatabase _pwDatabase = new PwDatabase();
|
|
||||||
private StorageFile _databaseFile;
|
|
||||||
private GroupVm _recycleBin;
|
|
||||||
|
|
||||||
public GroupVm RootGroup { get; set; }
|
|
||||||
|
|
||||||
public GroupVm RecycleBin
|
|
||||||
{
|
|
||||||
get { return _recycleBin; }
|
|
||||||
set
|
|
||||||
{
|
|
||||||
_recycleBin = value;
|
|
||||||
_pwDatabase.RecycleBinUuid = _recycleBin.IdUuid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public DatabaseStatus Status { get; private set; } = DatabaseStatus.Closed;
|
|
||||||
public string Name => DatabaseFile?.Name;
|
|
||||||
|
|
||||||
public bool RecycleBinEnabled
|
|
||||||
{
|
|
||||||
get { return _pwDatabase.RecycleBinEnabled; }
|
|
||||||
set { _pwDatabase.RecycleBinEnabled = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public StorageFile DatabaseFile
|
|
||||||
{
|
|
||||||
get { return _databaseFile; }
|
|
||||||
set
|
|
||||||
{
|
|
||||||
_databaseFile = value;
|
|
||||||
Status = DatabaseStatus.Opening;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public PwUuid DataCipher
|
|
||||||
{
|
|
||||||
get { return _pwDatabase.DataCipherUuid; }
|
|
||||||
set { _pwDatabase.DataCipherUuid = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public PwCompressionAlgorithm CompressionAlgorithm
|
|
||||||
{
|
|
||||||
get { return _pwDatabase.Compression; }
|
|
||||||
set { _pwDatabase.Compression = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public KdfParameters KeyDerivation
|
|
||||||
{
|
|
||||||
get { return _pwDatabase.KdfParameters; }
|
|
||||||
set { _pwDatabase.KdfParameters = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Open a KeePass database
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="key">The database composite key</param>
|
|
||||||
/// <param name="createNew">True to create a new database before opening it</param>
|
|
||||||
/// <returns>An error message, if any</returns>
|
|
||||||
public void Open(CompositeKey key, bool createNew = false)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (key == null) Status = DatabaseStatus.NoCompositeKey;
|
|
||||||
var ioConnection = IOConnectionInfo.FromFile(DatabaseFile);
|
|
||||||
if (createNew) _pwDatabase.New(ioConnection, key);
|
|
||||||
else _pwDatabase.Open(ioConnection, key, new NullStatusLogger());
|
|
||||||
|
|
||||||
if (_pwDatabase.IsOpen)
|
|
||||||
{
|
|
||||||
Status = DatabaseStatus.Opened;
|
|
||||||
RootGroup = new GroupVm(_pwDatabase.RootGroup, null, RecycleBinEnabled ? _pwDatabase.RecycleBinUuid : null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (InvalidCompositeKeyException)
|
|
||||||
{
|
|
||||||
Status = DatabaseStatus.CompositeKeyError;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Status = DatabaseStatus.Error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Save the current database to another file and open it
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="file">The new database file</param>
|
|
||||||
internal void Save(StorageFile file)
|
|
||||||
{
|
|
||||||
DatabaseFile = file;
|
|
||||||
_pwDatabase.SaveAs(IOConnectionInfo.FromFile(DatabaseFile), true, new NullStatusLogger());
|
|
||||||
Status = DatabaseStatus.Opened;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Commit the changes to the currently opened database to file
|
|
||||||
/// </summary>
|
|
||||||
public bool Save()
|
|
||||||
{
|
|
||||||
if (_pwDatabase == null || !_pwDatabase.IsOpen) return false;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
_pwDatabase.Save(new NullStatusLogger());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
MessageDialogHelper.ShowErrorDialog(ex);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Close the currently opened database
|
|
||||||
/// </summary>
|
|
||||||
public void Close()
|
|
||||||
{
|
|
||||||
_pwDatabase?.Close();
|
|
||||||
Status = DatabaseStatus.Closed;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddDeletedItem(PwUuid id)
|
|
||||||
{
|
|
||||||
_pwDatabase.DeletedObjects.Add(new PwDeletedObject(id, DateTime.UtcNow));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CreateRecycleBin()
|
|
||||||
{
|
|
||||||
RecycleBin = RootGroup.AddNewGroup("Recycle bin");
|
|
||||||
RecycleBin.IsSelected = true;
|
|
||||||
RecycleBin.IconSymbol = Symbol.Delete;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void UpdateCompositeKey(CompositeKey key)
|
|
||||||
{
|
|
||||||
_pwDatabase.MasterKey = key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,18 +1,48 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using Windows.UI.Popups;
|
using Windows.UI.Popups;
|
||||||
|
|
||||||
namespace ModernKeePass.Common
|
namespace ModernKeePass.Common
|
||||||
{
|
{
|
||||||
public static class MessageDialogHelper
|
public static class MessageDialogHelper
|
||||||
{
|
{
|
||||||
public static async void ShowDeleteConfirmationDialog(string actionText, string contentText, UICommandInvokedHandler action)
|
public static async Task ShowActionDialog(string title, string contentText, string actionButtonText, string cancelButtonText, UICommandInvokedHandler actionCommand, UICommandInvokedHandler cancelCommand)
|
||||||
{
|
{
|
||||||
// Create the message dialog and set its content
|
// Create the message dialog and set its content
|
||||||
var messageDialog = new MessageDialog(contentText);
|
var messageDialog = CreateBasicDialog(title, contentText, cancelButtonText, cancelCommand);
|
||||||
|
|
||||||
// Add commands and set their callbacks; both buttons use the same callback function instead of inline event handlers
|
// Add commands and set their callbacks; both buttons use the same callback function instead of inline event handlers
|
||||||
messageDialog.Commands.Add(new UICommand(actionText, action));
|
messageDialog.Commands.Add(new UICommand(actionButtonText, actionCommand));
|
||||||
messageDialog.Commands.Add(new UICommand("Cancel"));
|
|
||||||
|
// Show the message dialog
|
||||||
|
await messageDialog.ShowAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task ShowErrorDialog(Exception exception)
|
||||||
|
{
|
||||||
|
if (exception == null) return;
|
||||||
|
// Create the message dialog and set its content
|
||||||
|
var messageDialog = CreateBasicDialog(exception.Message, exception.StackTrace, "OK");
|
||||||
|
|
||||||
|
// Show the message dialog
|
||||||
|
await messageDialog.ShowAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task ShowNotificationDialog(string title, string message)
|
||||||
|
{
|
||||||
|
var dialog = CreateBasicDialog(title, message, "OK");
|
||||||
|
|
||||||
|
// Show the message dialog
|
||||||
|
await dialog.ShowAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static MessageDialog CreateBasicDialog(string title, string message, string dismissActionText, UICommandInvokedHandler cancelCommand = null)
|
||||||
|
{
|
||||||
|
// Create the message dialog and set its content
|
||||||
|
var messageDialog = new MessageDialog(message, title);
|
||||||
|
|
||||||
|
// Add commands and set their callbacks
|
||||||
|
messageDialog.Commands.Add(new UICommand(dismissActionText, cancelCommand));
|
||||||
|
|
||||||
// Set the command that will be invoked by default
|
// Set the command that will be invoked by default
|
||||||
messageDialog.DefaultCommandIndex = 1;
|
messageDialog.DefaultCommandIndex = 1;
|
||||||
@@ -20,20 +50,7 @@ namespace ModernKeePass.Common
|
|||||||
// Set the command to be invoked when escape is pressed
|
// Set the command to be invoked when escape is pressed
|
||||||
messageDialog.CancelCommandIndex = 1;
|
messageDialog.CancelCommandIndex = 1;
|
||||||
|
|
||||||
// Show the message dialog
|
return messageDialog;
|
||||||
await messageDialog.ShowAsync();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static async void ShowErrorDialog(Exception exception)
|
|
||||||
{
|
|
||||||
// Create the message dialog and set its content
|
|
||||||
var messageDialog = new MessageDialog(exception.Message, "Error occured");
|
|
||||||
|
|
||||||
// Add commands and set their callbacks; both buttons use the same callback function instead of inline event handlers
|
|
||||||
messageDialog.Commands.Add(new UICommand("OK"));
|
|
||||||
|
|
||||||
// Show the message dialog
|
|
||||||
await messageDialog.ShowAsync();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
using System;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Windows.Foundation.Collections;
|
using Windows.Foundation.Collections;
|
||||||
|
|
||||||
@@ -15,15 +14,15 @@ namespace ModernKeePass.Common
|
|||||||
{
|
{
|
||||||
public ObservableDictionaryChangedEventArgs(CollectionChange change, string key)
|
public ObservableDictionaryChangedEventArgs(CollectionChange change, string key)
|
||||||
{
|
{
|
||||||
this.CollectionChange = change;
|
CollectionChange = change;
|
||||||
this.Key = key;
|
Key = key;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CollectionChange CollectionChange { get; private set; }
|
public CollectionChange CollectionChange { get; private set; }
|
||||||
public string Key { get; private set; }
|
public string Key { get; private set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
private Dictionary<string, object> _dictionary = new Dictionary<string, object>();
|
private readonly Dictionary<string, object> _dictionary = new Dictionary<string, object>();
|
||||||
public event MapChangedEventHandler<string, object> MapChanged;
|
public event MapChangedEventHandler<string, object> MapChanged;
|
||||||
|
|
||||||
private void InvokeMapChanged(CollectionChange change, string key)
|
private void InvokeMapChanged(CollectionChange change, string key)
|
||||||
@@ -37,13 +36,13 @@ namespace ModernKeePass.Common
|
|||||||
|
|
||||||
public void Add(string key, object value)
|
public void Add(string key, object value)
|
||||||
{
|
{
|
||||||
this._dictionary.Add(key, value);
|
_dictionary.Add(key, value);
|
||||||
this.InvokeMapChanged(CollectionChange.ItemInserted, key);
|
InvokeMapChanged(CollectionChange.ItemInserted, key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Add(KeyValuePair<string, object> item)
|
public void Add(KeyValuePair<string, object> item)
|
||||||
{
|
{
|
||||||
this.Add(item.Key, item.Value);
|
Add(item.Key, item.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddRange(IEnumerable<KeyValuePair<string, object>> values)
|
public void AddRange(IEnumerable<KeyValuePair<string, object>> values)
|
||||||
@@ -56,9 +55,9 @@ namespace ModernKeePass.Common
|
|||||||
|
|
||||||
public bool Remove(string key)
|
public bool Remove(string key)
|
||||||
{
|
{
|
||||||
if (this._dictionary.Remove(key))
|
if (_dictionary.Remove(key))
|
||||||
{
|
{
|
||||||
this.InvokeMapChanged(CollectionChange.ItemRemoved, key);
|
InvokeMapChanged(CollectionChange.ItemRemoved, key);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -67,10 +66,10 @@ namespace ModernKeePass.Common
|
|||||||
public bool Remove(KeyValuePair<string, object> item)
|
public bool Remove(KeyValuePair<string, object> item)
|
||||||
{
|
{
|
||||||
object currentValue;
|
object currentValue;
|
||||||
if (this._dictionary.TryGetValue(item.Key, out currentValue) &&
|
if (_dictionary.TryGetValue(item.Key, out currentValue) &&
|
||||||
Object.Equals(item.Value, currentValue) && this._dictionary.Remove(item.Key))
|
Equals(item.Value, currentValue) && _dictionary.Remove(item.Key))
|
||||||
{
|
{
|
||||||
this.InvokeMapChanged(CollectionChange.ItemRemoved, item.Key);
|
InvokeMapChanged(CollectionChange.ItemRemoved, item.Key);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -80,53 +79,53 @@ namespace ModernKeePass.Common
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return this._dictionary[key];
|
return _dictionary[key];
|
||||||
}
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
this._dictionary[key] = value;
|
_dictionary[key] = value;
|
||||||
this.InvokeMapChanged(CollectionChange.ItemChanged, key);
|
InvokeMapChanged(CollectionChange.ItemChanged, key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Clear()
|
public void Clear()
|
||||||
{
|
{
|
||||||
var priorKeys = this._dictionary.Keys.ToArray();
|
var priorKeys = _dictionary.Keys.ToArray();
|
||||||
this._dictionary.Clear();
|
_dictionary.Clear();
|
||||||
foreach (var key in priorKeys)
|
foreach (var key in priorKeys)
|
||||||
{
|
{
|
||||||
this.InvokeMapChanged(CollectionChange.ItemRemoved, key);
|
InvokeMapChanged(CollectionChange.ItemRemoved, key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ICollection<string> Keys
|
public ICollection<string> Keys
|
||||||
{
|
{
|
||||||
get { return this._dictionary.Keys; }
|
get { return _dictionary.Keys; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool ContainsKey(string key)
|
public bool ContainsKey(string key)
|
||||||
{
|
{
|
||||||
return this._dictionary.ContainsKey(key);
|
return _dictionary.ContainsKey(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool TryGetValue(string key, out object value)
|
public bool TryGetValue(string key, out object value)
|
||||||
{
|
{
|
||||||
return this._dictionary.TryGetValue(key, out value);
|
return _dictionary.TryGetValue(key, out value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ICollection<object> Values
|
public ICollection<object> Values
|
||||||
{
|
{
|
||||||
get { return this._dictionary.Values; }
|
get { return _dictionary.Values; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Contains(KeyValuePair<string, object> item)
|
public bool Contains(KeyValuePair<string, object> item)
|
||||||
{
|
{
|
||||||
return this._dictionary.Contains(item);
|
return _dictionary.Contains(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int Count
|
public int Count
|
||||||
{
|
{
|
||||||
get { return this._dictionary.Count; }
|
get { return _dictionary.Count; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsReadOnly
|
public bool IsReadOnly
|
||||||
@@ -136,18 +135,18 @@ namespace ModernKeePass.Common
|
|||||||
|
|
||||||
public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
|
public IEnumerator<KeyValuePair<string, object>> GetEnumerator()
|
||||||
{
|
{
|
||||||
return this._dictionary.GetEnumerator();
|
return _dictionary.GetEnumerator();
|
||||||
}
|
}
|
||||||
|
|
||||||
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
|
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
|
||||||
{
|
{
|
||||||
return this._dictionary.GetEnumerator();
|
return _dictionary.GetEnumerator();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CopyTo(KeyValuePair<string, object>[] array, int arrayIndex)
|
public void CopyTo(KeyValuePair<string, object>[] array, int arrayIndex)
|
||||||
{
|
{
|
||||||
int arraySize = array.Length;
|
int arraySize = array.Length;
|
||||||
foreach (var pair in this._dictionary)
|
foreach (var pair in _dictionary)
|
||||||
{
|
{
|
||||||
if (arrayIndex >= arraySize) break;
|
if (arrayIndex >= arraySize) break;
|
||||||
array[arrayIndex++] = pair;
|
array[arrayIndex++] = pair;
|
||||||
|
@@ -1,8 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
|
|
||||||
namespace ModernKeePass.Common
|
namespace ModernKeePass.Common
|
||||||
@@ -55,7 +51,7 @@ namespace ModernKeePass.Common
|
|||||||
/// <returns>true if this command can be executed; otherwise, false.</returns>
|
/// <returns>true if this command can be executed; otherwise, false.</returns>
|
||||||
public bool CanExecute(object parameter)
|
public bool CanExecute(object parameter)
|
||||||
{
|
{
|
||||||
return _canExecute == null ? true : _canExecute();
|
return _canExecute?.Invoke() ?? true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@@ -1,11 +1,8 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Windows.ApplicationModel;
|
|
||||||
using Windows.Storage;
|
using Windows.Storage;
|
||||||
using Windows.Storage.Streams;
|
using Windows.Storage.Streams;
|
||||||
using Windows.UI.Xaml;
|
using Windows.UI.Xaml;
|
||||||
@@ -20,10 +17,10 @@ namespace ModernKeePass.Common
|
|||||||
/// carry across sessions, but that should be discarded when an application crashes or is
|
/// carry across sessions, but that should be discarded when an application crashes or is
|
||||||
/// upgraded.
|
/// upgraded.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal sealed class SuspensionManager
|
internal static class SuspensionManager
|
||||||
{
|
{
|
||||||
private static Dictionary<string, object> _sessionState = new Dictionary<string, object>();
|
private static Dictionary<string, object> _sessionState = new Dictionary<string, object>();
|
||||||
private static List<Type> _knownTypes = new List<Type>();
|
private static readonly List<Type> _knownTypes = new List<Type>();
|
||||||
private const string sessionStateFilename = "_sessionState.xml";
|
private const string sessionStateFilename = "_sessionState.xml";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -33,20 +30,14 @@ namespace ModernKeePass.Common
|
|||||||
/// <see cref="DataContractSerializer"/> and should be as compact as possible. Strings
|
/// <see cref="DataContractSerializer"/> and should be as compact as possible. Strings
|
||||||
/// and other self-contained data types are strongly recommended.
|
/// and other self-contained data types are strongly recommended.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static Dictionary<string, object> SessionState
|
public static Dictionary<string, object> SessionState => _sessionState;
|
||||||
{
|
|
||||||
get { return _sessionState; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// List of custom types provided to the <see cref="DataContractSerializer"/> when
|
/// List of custom types provided to the <see cref="DataContractSerializer"/> when
|
||||||
/// reading and writing session state. Initially empty, additional types may be
|
/// reading and writing session state. Initially empty, additional types may be
|
||||||
/// added to customize the serialization process.
|
/// added to customize the serialization process.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static List<Type> KnownTypes
|
public static List<Type> KnownTypes => _knownTypes;
|
||||||
{
|
|
||||||
get { return _knownTypes; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Save the current <see cref="SessionState"/>. Any <see cref="Frame"/> instances
|
/// Save the current <see cref="SessionState"/>. Any <see cref="Frame"/> instances
|
||||||
|
@@ -32,5 +32,23 @@ namespace ModernKeePass.Common
|
|||||||
ToastNotificationManager.CreateToastNotifier().Show(toast);
|
ToastNotificationManager.CreateToastNotifier().Show(toast);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void ShowGenericToast(string title, string text)
|
||||||
|
{
|
||||||
|
var notificationXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);
|
||||||
|
var toastElements = notificationXml.GetElementsByTagName("text");
|
||||||
|
toastElements[0].AppendChild(notificationXml.CreateTextNode(title));
|
||||||
|
toastElements[1].AppendChild(notificationXml.CreateTextNode(text));
|
||||||
|
|
||||||
|
var toast = new ToastNotification(notificationXml)
|
||||||
|
{
|
||||||
|
ExpirationTime = DateTime.Now.AddSeconds(5)
|
||||||
|
};
|
||||||
|
ToastNotificationManager.CreateToastNotifier().Show(toast);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ShowErrorToast(Exception exception)
|
||||||
|
{
|
||||||
|
ShowGenericToast(exception.Source, exception.Message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,101 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using Windows.Storage.Pickers;
|
|
||||||
using Windows.System;
|
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using Windows.UI.Xaml.Input;
|
|
||||||
using ModernKeePass.Events;
|
|
||||||
using ModernKeePass.ViewModels;
|
|
||||||
|
|
||||||
// Pour en savoir plus sur le modèle d'élément Contrôle utilisateur, consultez la page http://go.microsoft.com/fwlink/?LinkId=234236
|
|
||||||
|
|
||||||
namespace ModernKeePass.Controls
|
|
||||||
{
|
|
||||||
public sealed partial class CompositeKeyUserControl
|
|
||||||
{
|
|
||||||
public CompositeKeyVm Model => Grid.DataContext as CompositeKeyVm;
|
|
||||||
|
|
||||||
public bool CreateNew
|
|
||||||
{
|
|
||||||
get { return (bool)GetValue(CreateNewProperty); }
|
|
||||||
set { SetValue(CreateNewProperty, value); }
|
|
||||||
}
|
|
||||||
public static readonly DependencyProperty CreateNewProperty =
|
|
||||||
DependencyProperty.Register(
|
|
||||||
"CreateNew",
|
|
||||||
typeof(bool),
|
|
||||||
typeof(CompositeKeyUserControl),
|
|
||||||
new PropertyMetadata(false, (o, args) => { }));
|
|
||||||
|
|
||||||
public bool UpdateKey
|
|
||||||
{
|
|
||||||
get { return (bool)GetValue(UpdateKeyProperty); }
|
|
||||||
set { SetValue(UpdateKeyProperty, value); }
|
|
||||||
}
|
|
||||||
public static readonly DependencyProperty UpdateKeyProperty =
|
|
||||||
DependencyProperty.Register(
|
|
||||||
"UpdateKey",
|
|
||||||
typeof(bool),
|
|
||||||
typeof(CompositeKeyUserControl),
|
|
||||||
new PropertyMetadata(false, (o, args) => { }));
|
|
||||||
|
|
||||||
public bool ShowComplexityIndicator => CreateNew || UpdateKey;
|
|
||||||
|
|
||||||
public CompositeKeyUserControl()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
}
|
|
||||||
|
|
||||||
public event PasswordCheckingEventHandler ValidationChecking;
|
|
||||||
public delegate void PasswordCheckingEventHandler(object sender, EventArgs e);
|
|
||||||
public event PasswordCheckedEventHandler ValidationChecked;
|
|
||||||
public delegate void PasswordCheckedEventHandler(object sender, PasswordEventArgs e);
|
|
||||||
|
|
||||||
private void OpenButton_OnClick(object sender, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
ValidationChecking?.Invoke(this, new EventArgs());
|
|
||||||
|
|
||||||
if (UpdateKey) Model.UpdateKey();
|
|
||||||
else if (Model.OpenDatabase(CreateNew))
|
|
||||||
{
|
|
||||||
ValidationChecked?.Invoke(this, new PasswordEventArgs(Model.RootGroup));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void PasswordBox_KeyDown(object sender, KeyRoutedEventArgs e)
|
|
||||||
{
|
|
||||||
if (e.Key == VirtualKey.Enter) OpenButton_OnClick(null, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void KeyFileButton_Click(object sender, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
var picker =
|
|
||||||
new FileOpenPicker
|
|
||||||
{
|
|
||||||
ViewMode = PickerViewMode.List,
|
|
||||||
SuggestedStartLocation = PickerLocationId.DocumentsLibrary
|
|
||||||
};
|
|
||||||
picker.FileTypeFilter.Add(".key");
|
|
||||||
|
|
||||||
// Application now has read/write access to the picked file
|
|
||||||
var file = await picker.PickSingleFileAsync();
|
|
||||||
if (file == null) return;
|
|
||||||
Model.KeyFile = file;
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void CreateKeyFileButton_Click(object sender, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
var savePicker = new FileSavePicker
|
|
||||||
{
|
|
||||||
SuggestedStartLocation = PickerLocationId.DocumentsLibrary,
|
|
||||||
SuggestedFileName = "Key"
|
|
||||||
};
|
|
||||||
savePicker.FileTypeChoices.Add("Key file", new List<string> { ".key" });
|
|
||||||
|
|
||||||
var file = await savePicker.PickSaveFileAsync();
|
|
||||||
if (file == null) return;
|
|
||||||
|
|
||||||
Model.CreateKeyFile(file);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,23 +1,12 @@
|
|||||||
using System;
|
using System;
|
||||||
using Windows.UI.Xaml;
|
using Windows.UI.Xaml;
|
||||||
using Windows.UI.Xaml.Controls;
|
using Windows.UI.Xaml.Controls;
|
||||||
|
using Windows.UI.Xaml.Controls.Primitives;
|
||||||
|
|
||||||
namespace ModernKeePass.Controls
|
namespace ModernKeePass.Controls
|
||||||
{
|
{
|
||||||
public class TextBoxWithButton : TextBox
|
public class TextBoxWithButton : TextBox
|
||||||
{
|
{
|
||||||
/*public Symbol ButtonSymbol
|
|
||||||
{
|
|
||||||
get { return (Symbol)GetValue(ButtonSymbolProperty); }
|
|
||||||
set { SetValue(ButtonSymbolProperty, value); }
|
|
||||||
}
|
|
||||||
public static readonly DependencyProperty ButtonSymbolProperty =
|
|
||||||
DependencyProperty.Register(
|
|
||||||
"ButtonSymbol",
|
|
||||||
typeof(Symbol),
|
|
||||||
typeof(TextBoxWithButton),
|
|
||||||
new PropertyMetadata(Symbol.Delete, (o, args) => { }));*/
|
|
||||||
|
|
||||||
public string ButtonSymbol
|
public string ButtonSymbol
|
||||||
{
|
{
|
||||||
get { return (string)GetValue(ButtonSymbolProperty); }
|
get { return (string)GetValue(ButtonSymbolProperty); }
|
||||||
@@ -31,6 +20,30 @@ namespace ModernKeePass.Controls
|
|||||||
new PropertyMetadata("", (o, args) => { }));
|
new PropertyMetadata("", (o, args) => { }));
|
||||||
public event EventHandler<RoutedEventArgs> ButtonClick;
|
public event EventHandler<RoutedEventArgs> ButtonClick;
|
||||||
|
|
||||||
|
public string ButtonTooltip
|
||||||
|
{
|
||||||
|
get { return (string)GetValue(ButtonTooltipProperty); }
|
||||||
|
set { SetValue(ButtonTooltipProperty, value); }
|
||||||
|
}
|
||||||
|
public static readonly DependencyProperty ButtonTooltipProperty =
|
||||||
|
DependencyProperty.Register(
|
||||||
|
"ButtonTooltip",
|
||||||
|
typeof(string),
|
||||||
|
typeof(TextBoxWithButton),
|
||||||
|
new PropertyMetadata(string.Empty, (o, args) => { }));
|
||||||
|
|
||||||
|
public bool IsButtonEnabled
|
||||||
|
{
|
||||||
|
get { return (bool)GetValue(IsButtonEnabledProperty); }
|
||||||
|
set { SetValue(IsButtonEnabledProperty, value); }
|
||||||
|
}
|
||||||
|
public static readonly DependencyProperty IsButtonEnabledProperty =
|
||||||
|
DependencyProperty.Register(
|
||||||
|
"IsButtonEnabled",
|
||||||
|
typeof(bool),
|
||||||
|
typeof(TextBoxWithButton),
|
||||||
|
new PropertyMetadata(true, (o, args) => { }));
|
||||||
|
|
||||||
protected override void OnApplyTemplate()
|
protected override void OnApplyTemplate()
|
||||||
{
|
{
|
||||||
base.OnApplyTemplate();
|
base.OnApplyTemplate();
|
||||||
|
@@ -8,20 +8,20 @@ namespace ModernKeePass.Converters
|
|||||||
{
|
{
|
||||||
public object Convert(object value, Type targetType, object parameter, string language)
|
public object Convert(object value, Type targetType, object parameter, string language)
|
||||||
{
|
{
|
||||||
var boolean = value is bool ? (bool) value : false;
|
var boolean = value as bool? ?? false;
|
||||||
return boolean ? Visibility.Visible : Visibility.Collapsed;
|
return boolean ? Visibility.Visible : Visibility.Collapsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
// No need to implement this
|
// No need to implement this
|
||||||
public object ConvertBack(object value, Type targetType, object parameter, string language)
|
public object ConvertBack(object value, Type targetType, object parameter, string language)
|
||||||
{
|
{
|
||||||
var visibility = value is Visibility ? (Visibility) value : Visibility.Visible;
|
var visibility = value as Visibility? ?? Visibility.Visible;
|
||||||
switch (visibility)
|
switch (visibility)
|
||||||
{
|
{
|
||||||
case Visibility.Visible: return true;
|
case Visibility.Visible: return true;
|
||||||
case Visibility.Collapsed: return false;
|
case Visibility.Collapsed: return false;
|
||||||
default:
|
default:
|
||||||
throw new ArgumentOutOfRangeException();
|
throw new ArgumentOutOfRangeException(nameof(value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -20,7 +20,8 @@ namespace ModernKeePass.Converters
|
|||||||
|
|
||||||
public object ConvertBack(object value, Type targetType, object parameter, string language)
|
public object ConvertBack(object value, Type targetType, object parameter, string language)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
var brush = value as SolidColorBrush;
|
||||||
|
return brush == null ? new Color() : Color.FromArgb(brush.Color.A, brush.Color.R, brush.Color.G, brush.Color.B);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1,15 +1,15 @@
|
|||||||
using System;
|
using System;
|
||||||
using Windows.UI.Text;
|
using Windows.UI.Xaml;
|
||||||
using Windows.UI.Xaml.Data;
|
using Windows.UI.Xaml.Data;
|
||||||
|
|
||||||
namespace ModernKeePass.Converters
|
namespace ModernKeePass.Converters
|
||||||
{
|
{
|
||||||
public class BooleanToFontStyleConverter : IValueConverter
|
class EmptyStringToVisibilityConverter: IValueConverter
|
||||||
{
|
{
|
||||||
public object Convert(object value, Type targetType, object parameter, string language)
|
public object Convert(object value, Type targetType, object parameter, string language)
|
||||||
{
|
{
|
||||||
var boolean = value is bool ? (bool)value : false;
|
var text = value is string ? value.ToString() : string.Empty;
|
||||||
return boolean ? FontStyle.Italic : FontStyle.Normal;
|
return string.IsNullOrEmpty(text) ? Visibility.Collapsed : Visibility.Visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
public object ConvertBack(object value, Type targetType, object parameter, string language)
|
public object ConvertBack(object value, Type targetType, object parameter, string language)
|
130
ModernKeePass/Converters/IntToSymbolConverter.cs
Normal file
130
ModernKeePass/Converters/IntToSymbolConverter.cs
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
using System;
|
||||||
|
using Windows.UI.Xaml.Controls;
|
||||||
|
using Windows.UI.Xaml.Data;
|
||||||
|
using ModernKeePassLib;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Converters
|
||||||
|
{
|
||||||
|
public class IntToSymbolConverter : IValueConverter
|
||||||
|
{
|
||||||
|
public object Convert(object value, Type targetType, object parameter, string language)
|
||||||
|
{
|
||||||
|
var icon = (PwIcon) value;
|
||||||
|
switch (icon)
|
||||||
|
{
|
||||||
|
case PwIcon.Key: return Symbol.Permissions;
|
||||||
|
case PwIcon.WorldSocket:
|
||||||
|
case PwIcon.World: return Symbol.World;
|
||||||
|
case PwIcon.Warning: return Symbol.Important;
|
||||||
|
case PwIcon.WorldComputer:
|
||||||
|
case PwIcon.Drive:
|
||||||
|
case PwIcon.DriveWindows:
|
||||||
|
case PwIcon.NetworkServer: return Symbol.MapDrive;
|
||||||
|
case PwIcon.MarkedDirectory: return Symbol.Map;
|
||||||
|
case PwIcon.UserCommunication: return Symbol.ContactInfo;
|
||||||
|
case PwIcon.Parts: return Symbol.ViewAll;
|
||||||
|
case PwIcon.Notepad: return Symbol.Document;
|
||||||
|
case PwIcon.Identity: return Symbol.Contact2;
|
||||||
|
case PwIcon.PaperReady: return Symbol.SyncFolder;
|
||||||
|
case PwIcon.Digicam: return Symbol.Camera;
|
||||||
|
case PwIcon.IRCommunication: return Symbol.View;
|
||||||
|
case PwIcon.Energy: return Symbol.ZeroBars;
|
||||||
|
case PwIcon.Scanner: return Symbol.Scan;
|
||||||
|
case PwIcon.CDRom: return Symbol.Rotate;
|
||||||
|
case PwIcon.Monitor: return Symbol.Caption;
|
||||||
|
case PwIcon.EMailBox:
|
||||||
|
case PwIcon.EMail: return Symbol.Mail;
|
||||||
|
case PwIcon.Configuration: return Symbol.Setting;
|
||||||
|
case PwIcon.ClipboardReady: return Symbol.Paste;
|
||||||
|
case PwIcon.PaperNew: return Symbol.Page2;
|
||||||
|
case PwIcon.Screen: return Symbol.GoToStart;
|
||||||
|
case PwIcon.EnergyCareful: return Symbol.FourBars;
|
||||||
|
case PwIcon.Disk: return Symbol.Save;
|
||||||
|
case PwIcon.Console: return Symbol.SlideShow;
|
||||||
|
case PwIcon.Printer: return Symbol.Scan;
|
||||||
|
case PwIcon.ProgramIcons: return Symbol.GoToStart;
|
||||||
|
case PwIcon.Settings:
|
||||||
|
case PwIcon.Tool: return Symbol.Repair;
|
||||||
|
case PwIcon.Archive: return Symbol.Crop;
|
||||||
|
case PwIcon.Count: return Symbol.Calculator;
|
||||||
|
case PwIcon.Clock: return Symbol.Clock;
|
||||||
|
case PwIcon.EMailSearch: return Symbol.Find;
|
||||||
|
case PwIcon.PaperFlag: return Symbol.Flag;
|
||||||
|
case PwIcon.TrashBin: return Symbol.Delete;
|
||||||
|
case PwIcon.Expired: return Symbol.ReportHacked;
|
||||||
|
case PwIcon.Info: return Symbol.Help;
|
||||||
|
case PwIcon.Folder:
|
||||||
|
case PwIcon.FolderOpen:
|
||||||
|
case PwIcon.FolderPackage: return Symbol.Folder;
|
||||||
|
case PwIcon.PaperLocked: return Symbol.ProtectedDocument;
|
||||||
|
case PwIcon.Checked: return Symbol.Accept;
|
||||||
|
case PwIcon.Pen: return Symbol.Edit;
|
||||||
|
case PwIcon.Thumbnail: return Symbol.BrowsePhotos;
|
||||||
|
case PwIcon.Book: return Symbol.Library;
|
||||||
|
case PwIcon.List: return Symbol.List;
|
||||||
|
case PwIcon.UserKey: return Symbol.ContactPresence;
|
||||||
|
case PwIcon.Home: return Symbol.Home;
|
||||||
|
case PwIcon.Star: return Symbol.OutlineStar;
|
||||||
|
case PwIcon.Money: return Symbol.Shop;
|
||||||
|
case PwIcon.Certificate: return Symbol.PreviewLink;
|
||||||
|
case PwIcon.BlackBerry: return Symbol.CellPhone;
|
||||||
|
default: return Symbol.Stop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public object ConvertBack(object value, Type targetType, object parameter, string language)
|
||||||
|
{
|
||||||
|
var symbol = (Symbol) value;
|
||||||
|
switch (symbol)
|
||||||
|
{
|
||||||
|
case Symbol.Delete: return (int)PwIcon.TrashBin;
|
||||||
|
case Symbol.Edit: return (int) PwIcon.Pen;
|
||||||
|
case Symbol.Save: return (int) PwIcon.Disk;
|
||||||
|
case Symbol.Cancel: return (int) PwIcon.Expired;
|
||||||
|
case Symbol.Accept: return (int) PwIcon.Checked;
|
||||||
|
case Symbol.Home: return (int) PwIcon.Home;
|
||||||
|
case Symbol.Camera: return (int) PwIcon.Digicam;
|
||||||
|
case Symbol.Setting: return (int) PwIcon.Configuration;
|
||||||
|
case Symbol.Mail: return (int) PwIcon.EMail;
|
||||||
|
case Symbol.Find: return (int) PwIcon.EMailSearch;
|
||||||
|
case Symbol.Help: return (int) PwIcon.Info;
|
||||||
|
case Symbol.Clock: return (int) PwIcon.Clock;
|
||||||
|
case Symbol.Crop: return (int) PwIcon.Archive;
|
||||||
|
case Symbol.World: return (int) PwIcon.World;
|
||||||
|
case Symbol.Flag: return (int) PwIcon.PaperFlag;
|
||||||
|
case Symbol.PreviewLink: return (int) PwIcon.Certificate;
|
||||||
|
case Symbol.Document: return (int) PwIcon.Notepad;
|
||||||
|
case Symbol.ProtectedDocument: return (int) PwIcon.PaperLocked;
|
||||||
|
case Symbol.ContactInfo: return (int) PwIcon.UserCommunication;
|
||||||
|
case Symbol.ViewAll: return (int) PwIcon.Parts;
|
||||||
|
case Symbol.Rotate: return (int) PwIcon.CDRom;
|
||||||
|
case Symbol.List: return (int) PwIcon.List;
|
||||||
|
case Symbol.Shop: return (int) PwIcon.Money;
|
||||||
|
case Symbol.BrowsePhotos: return (int) PwIcon.Thumbnail;
|
||||||
|
case Symbol.Caption: return (int) PwIcon.Monitor;
|
||||||
|
case Symbol.Repair: return (int) PwIcon.Tool;
|
||||||
|
case Symbol.Page2: return (int) PwIcon.PaperNew;
|
||||||
|
case Symbol.Paste: return (int) PwIcon.ClipboardReady;
|
||||||
|
case Symbol.Important: return (int) PwIcon.Warning;
|
||||||
|
case Symbol.SlideShow: return (int) PwIcon.Console;
|
||||||
|
case Symbol.MapDrive: return (int) PwIcon.NetworkServer;
|
||||||
|
case Symbol.ContactPresence: return (int) PwIcon.UserKey;
|
||||||
|
case Symbol.Contact2: return (int) PwIcon.Identity;
|
||||||
|
case Symbol.Folder: return (int) PwIcon.Folder;
|
||||||
|
case Symbol.View: return (int) PwIcon.IRCommunication;
|
||||||
|
case Symbol.Permissions: return (int) PwIcon.Key;
|
||||||
|
case Symbol.Map: return (int) PwIcon.MarkedDirectory;
|
||||||
|
case Symbol.CellPhone: return (int) PwIcon.BlackBerry;
|
||||||
|
case Symbol.OutlineStar: return (int) PwIcon.Star;
|
||||||
|
case Symbol.Calculator: return (int) PwIcon.Count;
|
||||||
|
case Symbol.Library: return (int) PwIcon.Book;
|
||||||
|
case Symbol.SyncFolder: return (int) PwIcon.PaperReady;
|
||||||
|
case Symbol.GoToStart: return (int) PwIcon.Screen;
|
||||||
|
case Symbol.ZeroBars: return (int) PwIcon.Energy;
|
||||||
|
case Symbol.FourBars: return (int) PwIcon.EnergyCareful;
|
||||||
|
case Symbol.Scan: return (int) PwIcon.Scanner;
|
||||||
|
default: return (int) PwIcon.Key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -8,20 +8,20 @@ namespace ModernKeePass.Converters
|
|||||||
{
|
{
|
||||||
public object Convert(object value, Type targetType, object parameter, string language)
|
public object Convert(object value, Type targetType, object parameter, string language)
|
||||||
{
|
{
|
||||||
var boolean = value is bool ? (bool)value : false;
|
var boolean = value as bool? ?? false;
|
||||||
return boolean ? Visibility.Collapsed : Visibility.Visible;
|
return boolean ? Visibility.Collapsed : Visibility.Visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
// No need to implement this
|
// No need to implement this
|
||||||
public object ConvertBack(object value, Type targetType, object parameter, string language)
|
public object ConvertBack(object value, Type targetType, object parameter, string language)
|
||||||
{
|
{
|
||||||
var visibility = value is Visibility ? (Visibility)value : Visibility.Visible;
|
var visibility = value as Visibility? ?? Visibility.Visible;
|
||||||
switch (visibility)
|
switch (visibility)
|
||||||
{
|
{
|
||||||
case Visibility.Visible: return false;
|
case Visibility.Visible: return false;
|
||||||
case Visibility.Collapsed: return true;
|
case Visibility.Collapsed: return true;
|
||||||
default:
|
default:
|
||||||
throw new ArgumentOutOfRangeException();
|
throw new ArgumentOutOfRangeException(nameof(value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
11
ModernKeePass/Exceptions/NavigationException.cs
Normal file
11
ModernKeePass/Exceptions/NavigationException.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Exceptions
|
||||||
|
{
|
||||||
|
public class NavigationException: Exception
|
||||||
|
{
|
||||||
|
public NavigationException(Type pageType) : base($"Failed to load Page {pageType.FullName}")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
14
ModernKeePass/Exceptions/SaveException.cs
Normal file
14
ModernKeePass/Exceptions/SaveException.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Exceptions
|
||||||
|
{
|
||||||
|
public class SaveException : Exception
|
||||||
|
{
|
||||||
|
public new Exception InnerException { get; }
|
||||||
|
|
||||||
|
public SaveException(Exception exception)
|
||||||
|
{
|
||||||
|
InnerException = exception;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
32
ModernKeePass/Extensions/DispatcherTaskExtensions.cs
Normal file
32
ModernKeePass/Extensions/DispatcherTaskExtensions.cs
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
using System;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Windows.UI.Core;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Extensions
|
||||||
|
{
|
||||||
|
public static class DispatcherTaskExtensions
|
||||||
|
{
|
||||||
|
public static async Task<T> RunTaskAsync<T>(this CoreDispatcher dispatcher,
|
||||||
|
Func<Task<T>> func, CoreDispatcherPriority priority = CoreDispatcherPriority.Normal)
|
||||||
|
{
|
||||||
|
var taskCompletionSource = new TaskCompletionSource<T>();
|
||||||
|
await dispatcher.RunAsync(priority, async () =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
taskCompletionSource.SetResult(await func());
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
taskCompletionSource.SetException(ex);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return await taskCompletionSource.Task;
|
||||||
|
}
|
||||||
|
|
||||||
|
// There is no TaskCompletionSource<void> so we use a bool that we throw away.
|
||||||
|
public static async Task RunTaskAsync(this CoreDispatcher dispatcher,
|
||||||
|
Func<Task> func, CoreDispatcherPriority priority = CoreDispatcherPriority.Normal) =>
|
||||||
|
await RunTaskAsync(dispatcher, async () => { await func(); return false; }, priority);
|
||||||
|
}
|
||||||
|
}
|
30
ModernKeePass/Interfaces/IDatabaseService.cs
Normal file
30
ModernKeePass/Interfaces/IDatabaseService.cs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
using Windows.Storage;
|
||||||
|
using ModernKeePass.ViewModels;
|
||||||
|
using ModernKeePassLib;
|
||||||
|
using ModernKeePassLib.Cryptography.KeyDerivation;
|
||||||
|
using ModernKeePassLib.Keys;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Interfaces
|
||||||
|
{
|
||||||
|
public interface IDatabaseService
|
||||||
|
{
|
||||||
|
string Name { get; }
|
||||||
|
bool RecycleBinEnabled { get; set; }
|
||||||
|
GroupVm RootGroup { get; set; }
|
||||||
|
GroupVm RecycleBin { get; set; }
|
||||||
|
PwUuid DataCipher { get; set; }
|
||||||
|
PwCompressionAlgorithm CompressionAlgorithm { get; set; }
|
||||||
|
KdfParameters KeyDerivation { get; set; }
|
||||||
|
bool IsOpen { get; }
|
||||||
|
bool HasChanged { get; set; }
|
||||||
|
|
||||||
|
void Open(StorageFile databaseFile, CompositeKey key, bool createNew = false);
|
||||||
|
void ReOpen();
|
||||||
|
void Save();
|
||||||
|
void Save(StorageFile file);
|
||||||
|
void CreateRecycleBin(string title);
|
||||||
|
void AddDeletedItem(PwUuid id);
|
||||||
|
void Close(bool releaseFile = true);
|
||||||
|
void UpdateCompositeKey(CompositeKey newCompositeKey);
|
||||||
|
}
|
||||||
|
}
|
9
ModernKeePass/Interfaces/IProxyInvocationHandler.cs
Normal file
9
ModernKeePass/Interfaces/IProxyInvocationHandler.cs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Interfaces
|
||||||
|
{
|
||||||
|
public interface IProxyInvocationHandler
|
||||||
|
{
|
||||||
|
object Invoke(object proxy, MethodInfo method, object[] parameters);
|
||||||
|
}
|
||||||
|
}
|
@@ -1,4 +1,5 @@
|
|||||||
using Windows.UI.Xaml.Controls;
|
using System.Collections.Generic;
|
||||||
|
using System.Windows.Input;
|
||||||
using ModernKeePass.ViewModels;
|
using ModernKeePass.ViewModels;
|
||||||
|
|
||||||
namespace ModernKeePass.Interfaces
|
namespace ModernKeePass.Interfaces
|
||||||
@@ -7,12 +8,22 @@ namespace ModernKeePass.Interfaces
|
|||||||
{
|
{
|
||||||
GroupVm ParentGroup { get; }
|
GroupVm ParentGroup { get; }
|
||||||
GroupVm PreviousGroup { get; }
|
GroupVm PreviousGroup { get; }
|
||||||
Symbol IconSymbol { get; }
|
int IconId { get; }
|
||||||
string Id { get; }
|
string Id { get; }
|
||||||
string Name { get; set; }
|
string Name { get; set; }
|
||||||
string Path { get; }
|
IEnumerable<IPwEntity> BreadCrumb { get; }
|
||||||
bool IsEditMode { get; }
|
bool IsEditMode { get; }
|
||||||
|
bool IsRecycleOnDelete { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Save changes to Model
|
||||||
|
/// </summary>
|
||||||
|
ICommand SaveCommand { get; }
|
||||||
|
/// <summary>
|
||||||
|
/// Restore ViewModel
|
||||||
|
/// </summary>
|
||||||
|
ICommand UndoDeleteCommand { get; }
|
||||||
|
ICommand GoBackCommand { get; set; }
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Move a entity to the destination group
|
/// Move a entity to the destination group
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -23,16 +34,8 @@ namespace ModernKeePass.Interfaces
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
void CommitDelete();
|
void CommitDelete();
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Restore ViewModel
|
|
||||||
/// </summary>
|
|
||||||
void UndoDelete();
|
|
||||||
/// <summary>
|
|
||||||
/// Save changes to Model
|
|
||||||
/// </summary>
|
|
||||||
void Save();
|
|
||||||
/// <summary>
|
|
||||||
/// Delete from ViewModel
|
/// Delete from ViewModel
|
||||||
/// </summary>
|
/// </summary>
|
||||||
void MarkForDelete();
|
void MarkForDelete(string recycleBinTitle);
|
||||||
}
|
}
|
||||||
}
|
}
|
11
ModernKeePass/Interfaces/IRecentItem.cs
Normal file
11
ModernKeePass/Interfaces/IRecentItem.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
using Windows.Storage;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Interfaces
|
||||||
|
{
|
||||||
|
public interface IRecentItem
|
||||||
|
{
|
||||||
|
StorageFile DatabaseFile { get; }
|
||||||
|
string Token { get; }
|
||||||
|
string Name { get; }
|
||||||
|
}
|
||||||
|
}
|
15
ModernKeePass/Interfaces/IRecentService.cs
Normal file
15
ModernKeePass/Interfaces/IRecentService.cs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Windows.Storage;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Interfaces
|
||||||
|
{
|
||||||
|
public interface IRecentService
|
||||||
|
{
|
||||||
|
int EntryCount { get; }
|
||||||
|
Task<IStorageItem> GetFileAsync(string token);
|
||||||
|
ObservableCollection<IRecentItem> GetAllFiles(bool removeIfNonExistant = true);
|
||||||
|
void Add(IStorageItem file, string metadata);
|
||||||
|
void ClearAll();
|
||||||
|
}
|
||||||
|
}
|
7
ModernKeePass/Interfaces/IResourceService.cs
Normal file
7
ModernKeePass/Interfaces/IResourceService.cs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
namespace ModernKeePass.Interfaces
|
||||||
|
{
|
||||||
|
public interface IResourceService
|
||||||
|
{
|
||||||
|
string GetResourceValue(string key);
|
||||||
|
}
|
||||||
|
}
|
8
ModernKeePass/Interfaces/ISettingsService.cs
Normal file
8
ModernKeePass/Interfaces/ISettingsService.cs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
namespace ModernKeePass.Interfaces
|
||||||
|
{
|
||||||
|
public interface ISettingsService
|
||||||
|
{
|
||||||
|
T GetSetting<T>(string property, T defaultValue = default(T));
|
||||||
|
void PutSetting<T>(string property, T value);
|
||||||
|
}
|
||||||
|
}
|
@@ -1,477 +0,0 @@
|
|||||||
using Windows.UI.Xaml.Controls;
|
|
||||||
using ModernKeePassLib;
|
|
||||||
|
|
||||||
namespace ModernKeePass.Mappings
|
|
||||||
{
|
|
||||||
public static class PwIconToSegoeMapping
|
|
||||||
{
|
|
||||||
public static Symbol GetSymbolFromIcon(PwIcon icon)
|
|
||||||
{
|
|
||||||
switch (icon)
|
|
||||||
{
|
|
||||||
case PwIcon.Key: return Symbol.Permissions;
|
|
||||||
case PwIcon.WorldSocket:
|
|
||||||
case PwIcon.World: return Symbol.World;
|
|
||||||
case PwIcon.Warning: return Symbol.Important;
|
|
||||||
case PwIcon.WorldComputer:
|
|
||||||
case PwIcon.Drive:
|
|
||||||
case PwIcon.DriveWindows:
|
|
||||||
case PwIcon.NetworkServer: return Symbol.MapDrive;
|
|
||||||
case PwIcon.MarkedDirectory: return Symbol.Map;
|
|
||||||
case PwIcon.UserCommunication: return Symbol.ContactInfo;
|
|
||||||
case PwIcon.Parts: return Symbol.ViewAll;
|
|
||||||
case PwIcon.Notepad: return Symbol.Document;
|
|
||||||
case PwIcon.Identity: return Symbol.Contact2;
|
|
||||||
case PwIcon.PaperReady: return Symbol.SyncFolder;
|
|
||||||
case PwIcon.Digicam: return Symbol.Camera;
|
|
||||||
case PwIcon.IRCommunication: return Symbol.View;
|
|
||||||
case PwIcon.Energy: return Symbol.ZeroBars;
|
|
||||||
case PwIcon.Scanner: return Symbol.Scan;
|
|
||||||
case PwIcon.CDRom: return Symbol.Rotate;
|
|
||||||
case PwIcon.Monitor: return Symbol.Caption;
|
|
||||||
case PwIcon.EMailBox:
|
|
||||||
case PwIcon.EMail: return Symbol.Mail;
|
|
||||||
case PwIcon.Configuration: return Symbol.Setting;
|
|
||||||
case PwIcon.ClipboardReady: return Symbol.Paste;
|
|
||||||
case PwIcon.PaperNew: return Symbol.Page2;
|
|
||||||
case PwIcon.Screen: return Symbol.GoToStart;
|
|
||||||
case PwIcon.EnergyCareful: return Symbol.FourBars;
|
|
||||||
case PwIcon.Disk: return Symbol.Save;
|
|
||||||
//case PwIcon.PaperQ: return Symbol.;
|
|
||||||
//case PwIcon.TerminalEncrypted: return Symbol.;
|
|
||||||
case PwIcon.Console: return Symbol.SlideShow;
|
|
||||||
case PwIcon.Printer: return Symbol.Scan;
|
|
||||||
case PwIcon.ProgramIcons: return Symbol.GoToStart;
|
|
||||||
//case PwIcon.Run: return Symbol.;
|
|
||||||
case PwIcon.Settings:
|
|
||||||
case PwIcon.Tool: return Symbol.Repair;
|
|
||||||
case PwIcon.Archive: return Symbol.Crop;
|
|
||||||
case PwIcon.Count: return Symbol.Calculator;
|
|
||||||
case PwIcon.Clock: return Symbol.Clock;
|
|
||||||
case PwIcon.EMailSearch: return Symbol.Find;
|
|
||||||
case PwIcon.PaperFlag: return Symbol.Flag;
|
|
||||||
//case PwIcon.Memory: return Symbol.;
|
|
||||||
case PwIcon.TrashBin: return Symbol.Delete;
|
|
||||||
case PwIcon.Expired: return Symbol.Cancel;
|
|
||||||
case PwIcon.Info: return Symbol.Help;
|
|
||||||
//case PwIcon.Package: return Symbol.;
|
|
||||||
case PwIcon.Folder:
|
|
||||||
case PwIcon.FolderOpen:
|
|
||||||
case PwIcon.FolderPackage: return Symbol.Folder;
|
|
||||||
//case PwIcon.LockOpen: return Symbol.;
|
|
||||||
case PwIcon.PaperLocked: return Symbol.ProtectedDocument;
|
|
||||||
case PwIcon.Checked: return Symbol.Accept;
|
|
||||||
case PwIcon.Pen: return Symbol.Edit;
|
|
||||||
case PwIcon.Thumbnail: return Symbol.BrowsePhotos;
|
|
||||||
case PwIcon.Book: return Symbol.Library;
|
|
||||||
case PwIcon.List: return Symbol.List;
|
|
||||||
case PwIcon.UserKey: return Symbol.ContactPresence;
|
|
||||||
case PwIcon.Home: return Symbol.Home;
|
|
||||||
case PwIcon.Star: return Symbol.OutlineStar;
|
|
||||||
//case PwIcon.Tux: return Symbol.;
|
|
||||||
//case PwIcon.Feather: return Symbol.;
|
|
||||||
//case PwIcon.Apple: return Symbol.;
|
|
||||||
//case PwIcon.Wiki: return Symbol.;
|
|
||||||
case PwIcon.Money: return Symbol.Shop;
|
|
||||||
case PwIcon.Certificate: return Symbol.PreviewLink;
|
|
||||||
case PwIcon.BlackBerry: return Symbol.CellPhone;
|
|
||||||
default: return Symbol.Stop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static PwIcon GetIconFromSymbol(Symbol symbol)
|
|
||||||
{
|
|
||||||
switch (symbol)
|
|
||||||
{
|
|
||||||
/*case Symbol.Previous:
|
|
||||||
break;
|
|
||||||
case Symbol.Next:
|
|
||||||
break;
|
|
||||||
case Symbol.Play:
|
|
||||||
break;
|
|
||||||
case Symbol.Pause:
|
|
||||||
break;
|
|
||||||
case Symbol.Edit:
|
|
||||||
break;
|
|
||||||
case Symbol.Save:
|
|
||||||
break;
|
|
||||||
case Symbol.Clear:
|
|
||||||
break;*/
|
|
||||||
case Symbol.Delete:
|
|
||||||
return PwIcon.TrashBin;
|
|
||||||
/*case Symbol.Remove:
|
|
||||||
break;
|
|
||||||
case Symbol.Add:
|
|
||||||
break;
|
|
||||||
case Symbol.Cancel:
|
|
||||||
break;
|
|
||||||
case Symbol.Accept:
|
|
||||||
break;
|
|
||||||
case Symbol.More:
|
|
||||||
break;
|
|
||||||
case Symbol.Redo:
|
|
||||||
break;
|
|
||||||
case Symbol.Undo:
|
|
||||||
break;
|
|
||||||
case Symbol.Home:
|
|
||||||
break;
|
|
||||||
case Symbol.Up:
|
|
||||||
break;
|
|
||||||
case Symbol.Forward:
|
|
||||||
break;
|
|
||||||
case Symbol.Back:
|
|
||||||
break;
|
|
||||||
case Symbol.Favorite:
|
|
||||||
break;
|
|
||||||
case Symbol.Camera:
|
|
||||||
break;
|
|
||||||
case Symbol.Setting:
|
|
||||||
break;
|
|
||||||
case Symbol.Video:
|
|
||||||
break;
|
|
||||||
case Symbol.Sync:
|
|
||||||
break;
|
|
||||||
case Symbol.Download:
|
|
||||||
break;
|
|
||||||
case Symbol.Mail:
|
|
||||||
break;
|
|
||||||
case Symbol.Find:
|
|
||||||
break;
|
|
||||||
case Symbol.Help:
|
|
||||||
break;
|
|
||||||
case Symbol.Upload:
|
|
||||||
break;
|
|
||||||
case Symbol.Emoji:
|
|
||||||
break;
|
|
||||||
case Symbol.TwoPage:
|
|
||||||
break;
|
|
||||||
case Symbol.LeaveChat:
|
|
||||||
break;
|
|
||||||
case Symbol.MailForward:
|
|
||||||
break;
|
|
||||||
case Symbol.Clock:
|
|
||||||
break;
|
|
||||||
case Symbol.Send:
|
|
||||||
break;
|
|
||||||
case Symbol.Crop:
|
|
||||||
break;
|
|
||||||
case Symbol.RotateCamera:
|
|
||||||
break;
|
|
||||||
case Symbol.People:
|
|
||||||
break;
|
|
||||||
case Symbol.OpenPane:
|
|
||||||
break;
|
|
||||||
case Symbol.ClosePane:
|
|
||||||
break;
|
|
||||||
case Symbol.World:
|
|
||||||
break;
|
|
||||||
case Symbol.Flag:
|
|
||||||
break;
|
|
||||||
case Symbol.PreviewLink:
|
|
||||||
break;
|
|
||||||
case Symbol.Globe:
|
|
||||||
break;
|
|
||||||
case Symbol.Trim:
|
|
||||||
break;
|
|
||||||
case Symbol.AttachCamera:
|
|
||||||
break;
|
|
||||||
case Symbol.ZoomIn:
|
|
||||||
break;
|
|
||||||
case Symbol.Bookmarks:
|
|
||||||
break;
|
|
||||||
case Symbol.Document:
|
|
||||||
break;
|
|
||||||
case Symbol.ProtectedDocument:
|
|
||||||
break;
|
|
||||||
case Symbol.Page:
|
|
||||||
break;
|
|
||||||
case Symbol.Bullets:
|
|
||||||
break;
|
|
||||||
case Symbol.Comment:
|
|
||||||
break;
|
|
||||||
case Symbol.MailFilled:
|
|
||||||
break;
|
|
||||||
case Symbol.ContactInfo:
|
|
||||||
break;
|
|
||||||
case Symbol.HangUp:
|
|
||||||
break;
|
|
||||||
case Symbol.ViewAll:
|
|
||||||
break;
|
|
||||||
case Symbol.MapPin:
|
|
||||||
break;
|
|
||||||
case Symbol.Phone:
|
|
||||||
break;
|
|
||||||
case Symbol.VideoChat:
|
|
||||||
break;
|
|
||||||
case Symbol.Switch:
|
|
||||||
break;
|
|
||||||
case Symbol.Contact:
|
|
||||||
break;
|
|
||||||
case Symbol.Rename:
|
|
||||||
break;
|
|
||||||
case Symbol.Pin:
|
|
||||||
break;
|
|
||||||
case Symbol.MusicInfo:
|
|
||||||
break;
|
|
||||||
case Symbol.Go:
|
|
||||||
break;
|
|
||||||
case Symbol.Keyboard:
|
|
||||||
break;
|
|
||||||
case Symbol.DockLeft:
|
|
||||||
break;
|
|
||||||
case Symbol.DockRight:
|
|
||||||
break;
|
|
||||||
case Symbol.DockBottom:
|
|
||||||
break;
|
|
||||||
case Symbol.Remote:
|
|
||||||
break;
|
|
||||||
case Symbol.Refresh:
|
|
||||||
break;
|
|
||||||
case Symbol.Rotate:
|
|
||||||
break;
|
|
||||||
case Symbol.Shuffle:
|
|
||||||
break;
|
|
||||||
case Symbol.List:
|
|
||||||
break;
|
|
||||||
case Symbol.Shop:
|
|
||||||
break;
|
|
||||||
case Symbol.SelectAll:
|
|
||||||
break;
|
|
||||||
case Symbol.Orientation:
|
|
||||||
break;
|
|
||||||
case Symbol.Import:
|
|
||||||
break;
|
|
||||||
case Symbol.ImportAll:
|
|
||||||
break;
|
|
||||||
case Symbol.BrowsePhotos:
|
|
||||||
break;
|
|
||||||
case Symbol.WebCam:
|
|
||||||
break;
|
|
||||||
case Symbol.Pictures:
|
|
||||||
break;
|
|
||||||
case Symbol.SaveLocal:
|
|
||||||
break;
|
|
||||||
case Symbol.Caption:
|
|
||||||
break;
|
|
||||||
case Symbol.Stop:
|
|
||||||
break;
|
|
||||||
case Symbol.ShowResults:
|
|
||||||
break;
|
|
||||||
case Symbol.Volume:
|
|
||||||
break;
|
|
||||||
case Symbol.Repair:
|
|
||||||
break;
|
|
||||||
case Symbol.Message:
|
|
||||||
break;
|
|
||||||
case Symbol.Page2:
|
|
||||||
break;
|
|
||||||
case Symbol.CalendarDay:
|
|
||||||
break;
|
|
||||||
case Symbol.CalendarWeek:
|
|
||||||
break;
|
|
||||||
case Symbol.Calendar:
|
|
||||||
break;
|
|
||||||
case Symbol.Character:
|
|
||||||
break;
|
|
||||||
case Symbol.MailReplyAll:
|
|
||||||
break;
|
|
||||||
case Symbol.Read:
|
|
||||||
break;
|
|
||||||
case Symbol.Link:
|
|
||||||
break;
|
|
||||||
case Symbol.Account:
|
|
||||||
break;
|
|
||||||
case Symbol.ShowBcc:
|
|
||||||
break;
|
|
||||||
case Symbol.HideBcc:
|
|
||||||
break;
|
|
||||||
case Symbol.Cut:
|
|
||||||
break;
|
|
||||||
case Symbol.Attach:
|
|
||||||
break;
|
|
||||||
case Symbol.Paste:
|
|
||||||
break;
|
|
||||||
case Symbol.Filter:
|
|
||||||
break;
|
|
||||||
case Symbol.Copy:
|
|
||||||
break;
|
|
||||||
case Symbol.Emoji2:
|
|
||||||
break;
|
|
||||||
case Symbol.Important:
|
|
||||||
break;
|
|
||||||
case Symbol.MailReply:
|
|
||||||
break;
|
|
||||||
case Symbol.SlideShow:
|
|
||||||
break;
|
|
||||||
case Symbol.Sort:
|
|
||||||
break;
|
|
||||||
case Symbol.Manage:
|
|
||||||
break;
|
|
||||||
case Symbol.AllApps:
|
|
||||||
break;
|
|
||||||
case Symbol.DisconnectDrive:
|
|
||||||
break;
|
|
||||||
case Symbol.MapDrive:
|
|
||||||
break;
|
|
||||||
case Symbol.NewWindow:
|
|
||||||
break;
|
|
||||||
case Symbol.OpenWith:
|
|
||||||
break;
|
|
||||||
case Symbol.ContactPresence:
|
|
||||||
break;
|
|
||||||
case Symbol.Priority:
|
|
||||||
break;
|
|
||||||
case Symbol.GoToToday:
|
|
||||||
break;
|
|
||||||
case Symbol.Font:
|
|
||||||
break;
|
|
||||||
case Symbol.FontColor:
|
|
||||||
break;
|
|
||||||
case Symbol.Contact2:
|
|
||||||
break;
|
|
||||||
case Symbol.Folder:
|
|
||||||
break;
|
|
||||||
case Symbol.Audio:
|
|
||||||
break;
|
|
||||||
case Symbol.Placeholder:
|
|
||||||
break;
|
|
||||||
case Symbol.View:
|
|
||||||
break;
|
|
||||||
case Symbol.SetLockScreen:
|
|
||||||
break;
|
|
||||||
case Symbol.SetTile:
|
|
||||||
break;
|
|
||||||
case Symbol.ClosedCaption:
|
|
||||||
break;
|
|
||||||
case Symbol.StopSlideShow:
|
|
||||||
break;
|
|
||||||
case Symbol.Permissions:
|
|
||||||
break;
|
|
||||||
case Symbol.Highlight:
|
|
||||||
break;
|
|
||||||
case Symbol.DisableUpdates:
|
|
||||||
break;
|
|
||||||
case Symbol.UnFavorite:
|
|
||||||
break;
|
|
||||||
case Symbol.UnPin:
|
|
||||||
break;
|
|
||||||
case Symbol.OpenLocal:
|
|
||||||
break;
|
|
||||||
case Symbol.Mute:
|
|
||||||
break;
|
|
||||||
case Symbol.Italic:
|
|
||||||
break;
|
|
||||||
case Symbol.Underline:
|
|
||||||
break;
|
|
||||||
case Symbol.Bold:
|
|
||||||
break;
|
|
||||||
case Symbol.MoveToFolder:
|
|
||||||
break;
|
|
||||||
case Symbol.LikeDislike:
|
|
||||||
break;
|
|
||||||
case Symbol.Dislike:
|
|
||||||
break;
|
|
||||||
case Symbol.Like:
|
|
||||||
break;
|
|
||||||
case Symbol.AlignRight:
|
|
||||||
break;
|
|
||||||
case Symbol.AlignCenter:
|
|
||||||
break;
|
|
||||||
case Symbol.AlignLeft:
|
|
||||||
break;
|
|
||||||
case Symbol.Zoom:
|
|
||||||
break;
|
|
||||||
case Symbol.ZoomOut:
|
|
||||||
break;
|
|
||||||
case Symbol.OpenFile:
|
|
||||||
break;
|
|
||||||
case Symbol.OtherUser:
|
|
||||||
break;
|
|
||||||
case Symbol.Admin:
|
|
||||||
break;
|
|
||||||
case Symbol.Street:
|
|
||||||
break;
|
|
||||||
case Symbol.Map:
|
|
||||||
break;
|
|
||||||
case Symbol.ClearSelection:
|
|
||||||
break;
|
|
||||||
case Symbol.FontDecrease:
|
|
||||||
break;
|
|
||||||
case Symbol.FontIncrease:
|
|
||||||
break;
|
|
||||||
case Symbol.FontSize:
|
|
||||||
break;
|
|
||||||
case Symbol.CellPhone:
|
|
||||||
break;
|
|
||||||
case Symbol.ReShare:
|
|
||||||
break;
|
|
||||||
case Symbol.Tag:
|
|
||||||
break;
|
|
||||||
case Symbol.RepeatOne:
|
|
||||||
break;
|
|
||||||
case Symbol.RepeatAll:
|
|
||||||
break;
|
|
||||||
case Symbol.OutlineStar:
|
|
||||||
break;
|
|
||||||
case Symbol.SolidStar:
|
|
||||||
break;
|
|
||||||
case Symbol.Calculator:
|
|
||||||
break;
|
|
||||||
case Symbol.Directions:
|
|
||||||
break;
|
|
||||||
case Symbol.Target:
|
|
||||||
break;
|
|
||||||
case Symbol.Library:
|
|
||||||
break;
|
|
||||||
case Symbol.PhoneBook:
|
|
||||||
break;
|
|
||||||
case Symbol.Memo:
|
|
||||||
break;
|
|
||||||
case Symbol.Microphone:
|
|
||||||
break;
|
|
||||||
case Symbol.PostUpdate:
|
|
||||||
break;
|
|
||||||
case Symbol.BackToWindow:
|
|
||||||
break;
|
|
||||||
case Symbol.FullScreen:
|
|
||||||
break;
|
|
||||||
case Symbol.NewFolder:
|
|
||||||
break;
|
|
||||||
case Symbol.CalendarReply:
|
|
||||||
break;
|
|
||||||
case Symbol.UnSyncFolder:
|
|
||||||
break;
|
|
||||||
case Symbol.ReportHacked:
|
|
||||||
break;
|
|
||||||
case Symbol.SyncFolder:
|
|
||||||
break;
|
|
||||||
case Symbol.BlockContact:
|
|
||||||
break;
|
|
||||||
case Symbol.SwitchApps:
|
|
||||||
break;
|
|
||||||
case Symbol.AddFriend:
|
|
||||||
break;
|
|
||||||
case Symbol.TouchPointer:
|
|
||||||
break;
|
|
||||||
case Symbol.GoToStart:
|
|
||||||
break;
|
|
||||||
case Symbol.ZeroBars:
|
|
||||||
break;
|
|
||||||
case Symbol.OneBar:
|
|
||||||
break;
|
|
||||||
case Symbol.TwoBars:
|
|
||||||
break;
|
|
||||||
case Symbol.ThreeBars:
|
|
||||||
break;
|
|
||||||
case Symbol.FourBars:
|
|
||||||
break;
|
|
||||||
case Symbol.Scan:
|
|
||||||
break;
|
|
||||||
case Symbol.Preview:
|
|
||||||
break;*/
|
|
||||||
default:
|
|
||||||
return PwIcon.Folder;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -15,8 +15,6 @@
|
|||||||
<FileAlignment>512</FileAlignment>
|
<FileAlignment>512</FileAlignment>
|
||||||
<ProjectTypeGuids>{BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
<ProjectTypeGuids>{BC8A1FFA-BEE3-4634-8014-F334798102B3};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||||
<PackageCertificateKeyFile>ModernKeePass_StoreKey.pfx</PackageCertificateKeyFile>
|
<PackageCertificateKeyFile>ModernKeePass_StoreKey.pfx</PackageCertificateKeyFile>
|
||||||
<NuGetPackageImportStamp>
|
|
||||||
</NuGetPackageImportStamp>
|
|
||||||
<PackageCertificateThumbprint>ED3AA34F46D03498F989901C5DB2742B65D72F60</PackageCertificateThumbprint>
|
<PackageCertificateThumbprint>ED3AA34F46D03498F989901C5DB2742B65D72F60</PackageCertificateThumbprint>
|
||||||
<AppxAutoIncrementPackageRevision>True</AppxAutoIncrementPackageRevision>
|
<AppxAutoIncrementPackageRevision>True</AppxAutoIncrementPackageRevision>
|
||||||
<AppxBundlePlatforms>neutral</AppxBundlePlatforms>
|
<AppxBundlePlatforms>neutral</AppxBundlePlatforms>
|
||||||
@@ -109,32 +107,71 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Actions\ClipboardAction.cs" />
|
<Compile Include="Actions\ClipboardAction.cs" />
|
||||||
|
<Compile Include="Actions\DeleteEntityAction.cs" />
|
||||||
|
<Compile Include="Actions\NavigateToUrlAction.cs" />
|
||||||
|
<Compile Include="Actions\RestoreEntityAction.cs" />
|
||||||
<Compile Include="Actions\SetupFocusAction.cs" />
|
<Compile Include="Actions\SetupFocusAction.cs" />
|
||||||
|
<Compile Include="Actions\ToastAction.cs" />
|
||||||
<Compile Include="App.xaml.cs">
|
<Compile Include="App.xaml.cs">
|
||||||
<DependentUpon>App.xaml</DependentUpon>
|
<DependentUpon>App.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Common\DatabaseHelper.cs" />
|
<Compile Include="Converters\IntToSymbolConverter.cs" />
|
||||||
|
<Compile Include="Exceptions\NavigationException.cs" />
|
||||||
|
<Compile Include="Interfaces\IProxyInvocationHandler.cs" />
|
||||||
|
<Compile Include="Interfaces\IRecentService.cs" />
|
||||||
|
<Compile Include="Interfaces\IRecentItem.cs" />
|
||||||
|
<Compile Include="Interfaces\IResourceService.cs" />
|
||||||
|
<Compile Include="Services\SingletonServiceBase.cs" />
|
||||||
|
<Compile Include="TemplateSelectors\SelectableDataTemplateSelector.cs" />
|
||||||
|
<Compile Include="ViewModels\Items\SettingsSaveVm.cs" />
|
||||||
|
<Compile Include="Views\MainPageFrames\DonatePage.xaml.cs">
|
||||||
|
<DependentUpon>DonatePage.xaml</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Services\DatabaseService.cs" />
|
||||||
|
<Compile Include="Interfaces\ISettingsService.cs" />
|
||||||
<Compile Include="Common\MessageDialogHelper.cs" />
|
<Compile Include="Common\MessageDialogHelper.cs" />
|
||||||
<Compile Include="Common\NavigationHelper.cs" />
|
<Compile Include="Common\NavigationHelper.cs" />
|
||||||
<Compile Include="Common\NotifyPropertyChangedBase.cs" />
|
<Compile Include="Common\NotifyPropertyChangedBase.cs" />
|
||||||
<Compile Include="Common\ObservableDictionary.cs" />
|
<Compile Include="Common\ObservableDictionary.cs" />
|
||||||
<Compile Include="Common\RelayCommand.cs" />
|
<Compile Include="Common\RelayCommand.cs" />
|
||||||
<Compile Include="Common\SuspensionManager.cs" />
|
<Compile Include="Common\SuspensionManager.cs" />
|
||||||
|
<Compile Include="Services\RecentService.cs" />
|
||||||
|
<Compile Include="Services\ResourcesService.cs" />
|
||||||
|
<Compile Include="Services\SettingsService.cs" />
|
||||||
<Compile Include="Common\ToastNotificationHelper.cs" />
|
<Compile Include="Common\ToastNotificationHelper.cs" />
|
||||||
<Compile Include="Converters\DiscreteIntToSolidColorBrushConverter.cs" />
|
<Compile Include="Converters\DiscreteIntToSolidColorBrushConverter.cs" />
|
||||||
|
<Compile Include="Converters\EmptyStringToVisibilityConverter.cs" />
|
||||||
<Compile Include="Converters\NullToBooleanConverter.cs" />
|
<Compile Include="Converters\NullToBooleanConverter.cs" />
|
||||||
|
<Compile Include="Exceptions\SaveException.cs" />
|
||||||
|
<Compile Include="Extensions\DispatcherTaskExtensions.cs" />
|
||||||
|
<Compile Include="Interfaces\IDatabaseService.cs" />
|
||||||
<Compile Include="Interfaces\IHasSelectableObject.cs" />
|
<Compile Include="Interfaces\IHasSelectableObject.cs" />
|
||||||
<Compile Include="Interfaces\ISelectableModel.cs" />
|
<Compile Include="Interfaces\ISelectableModel.cs" />
|
||||||
<Compile Include="Pages\BasePages\LayoutAwarePageBase.cs" />
|
<Compile Include="Views\BasePages\LayoutAwarePageBase.cs" />
|
||||||
<Compile Include="Pages\SettingsPageFrames\SettingsDatabasePage.xaml.cs">
|
<Compile Include="Views\SettingsPageFrames\SettingsDatabasePage.xaml.cs">
|
||||||
<DependentUpon>SettingsDatabasePage.xaml</DependentUpon>
|
<DependentUpon>SettingsDatabasePage.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Pages\SettingsPageFrames\SettingsSecurityPage.xaml.cs">
|
<Compile Include="Views\SettingsPageFrames\SettingsNewDatabasePage.xaml.cs">
|
||||||
|
<DependentUpon>SettingsNewDatabasePage.xaml</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Views\SettingsPageFrames\SettingsSavePage.xaml.cs">
|
||||||
|
<DependentUpon>SettingsSavePage.xaml</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Views\SettingsPageFrames\SettingsSecurityPage.xaml.cs">
|
||||||
<DependentUpon>SettingsSecurityPage.xaml</DependentUpon>
|
<DependentUpon>SettingsSecurityPage.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="Views\SettingsPageFrames\SettingsWelcomePage.xaml.cs">
|
||||||
|
<DependentUpon>SettingsWelcomePage.xaml</DependentUpon>
|
||||||
|
</Compile>
|
||||||
<Compile Include="TemplateSelectors\FirstItemDataTemplateSelector.cs" />
|
<Compile Include="TemplateSelectors\FirstItemDataTemplateSelector.cs" />
|
||||||
<Compile Include="Controls\ListViewWithDisable.cs" />
|
<Compile Include="Controls\ListViewWithDisable.cs" />
|
||||||
<Compile Include="Controls\CompositeKeyUserControl.xaml.cs">
|
<Compile Include="Views\UserControls\BreadCrumbUserControl.xaml.cs">
|
||||||
|
<DependentUpon>BreadCrumbUserControl.xaml</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Views\UserControls\ColorPickerUserControl.xaml.cs">
|
||||||
|
<DependentUpon>ColorPickerUserControl.xaml</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Views\UserControls\CompositeKeyUserControl.xaml.cs">
|
||||||
<DependentUpon>CompositeKeyUserControl.xaml</DependentUpon>
|
<DependentUpon>CompositeKeyUserControl.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Controls\TextBoxWithButton.cs" />
|
<Compile Include="Controls\TextBoxWithButton.cs" />
|
||||||
@@ -142,27 +179,25 @@
|
|||||||
<Compile Include="Converters\ColorToBrushConverter.cs" />
|
<Compile Include="Converters\ColorToBrushConverter.cs" />
|
||||||
<Compile Include="Converters\DoubleToSolidColorBrushConverter.cs" />
|
<Compile Include="Converters\DoubleToSolidColorBrushConverter.cs" />
|
||||||
<Compile Include="Converters\InverseBooleanToVisibilityConverter.cs" />
|
<Compile Include="Converters\InverseBooleanToVisibilityConverter.cs" />
|
||||||
<Compile Include="Converters\BooleanToFontStyleConverter.cs" />
|
|
||||||
<Compile Include="Converters\PluralizationConverter.cs" />
|
<Compile Include="Converters\PluralizationConverter.cs" />
|
||||||
<Compile Include="Converters\ProgressBarLegalValuesConverter.cs" />
|
<Compile Include="Converters\ProgressBarLegalValuesConverter.cs" />
|
||||||
<Compile Include="Converters\TextToWidthConverter.cs" />
|
<Compile Include="Converters\TextToWidthConverter.cs" />
|
||||||
<Compile Include="Events\PasswordEventArgs.cs" />
|
<Compile Include="Events\PasswordEventArgs.cs" />
|
||||||
<Compile Include="Interfaces\IIsEnabled.cs" />
|
<Compile Include="Interfaces\IIsEnabled.cs" />
|
||||||
<Compile Include="Interfaces\IPwEntity.cs" />
|
<Compile Include="Interfaces\IPwEntity.cs" />
|
||||||
<Compile Include="Pages\MainPage.xaml.cs">
|
<Compile Include="Views\MainPage.xaml.cs">
|
||||||
<DependentUpon>MainPage.xaml</DependentUpon>
|
<DependentUpon>MainPage.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Mappings\PwIconToSegoeMapping.cs" />
|
<Compile Include="Views\MainPageFrames\AboutPage.xaml.cs">
|
||||||
<Compile Include="Pages\MainPageFrames\AboutPage.xaml.cs">
|
|
||||||
<DependentUpon>AboutPage.xaml</DependentUpon>
|
<DependentUpon>AboutPage.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Pages\MainPageFrames\NewDatabasePage.xaml.cs">
|
<Compile Include="Views\MainPageFrames\NewDatabasePage.xaml.cs">
|
||||||
<DependentUpon>NewDatabasePage.xaml</DependentUpon>
|
<DependentUpon>NewDatabasePage.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Pages\SettingsPage.xaml.cs">
|
<Compile Include="Views\SettingsPage.xaml.cs">
|
||||||
<DependentUpon>SettingsPage.xaml</DependentUpon>
|
<DependentUpon>SettingsPage.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Pages\MainPageFrames\WelcomePage.xaml.cs">
|
<Compile Include="Views\MainPageFrames\WelcomePage.xaml.cs">
|
||||||
<DependentUpon>WelcomePage.xaml</DependentUpon>
|
<DependentUpon>WelcomePage.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="ViewModels\AboutVm.cs" />
|
<Compile Include="ViewModels\AboutVm.cs" />
|
||||||
@@ -170,24 +205,25 @@
|
|||||||
<Compile Include="ViewModels\Items\ListMenuItemVm.cs" />
|
<Compile Include="ViewModels\Items\ListMenuItemVm.cs" />
|
||||||
<Compile Include="ViewModels\Items\MainMenuItemVm.cs" />
|
<Compile Include="ViewModels\Items\MainMenuItemVm.cs" />
|
||||||
<Compile Include="ViewModels\Items\RecentItemVm.cs" />
|
<Compile Include="ViewModels\Items\RecentItemVm.cs" />
|
||||||
<Compile Include="Pages\EntryDetailPage.xaml.cs">
|
<Compile Include="Views\EntryDetailPage.xaml.cs">
|
||||||
<DependentUpon>EntryDetailPage.xaml</DependentUpon>
|
<DependentUpon>EntryDetailPage.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Pages\GroupDetailPage.xaml.cs">
|
<Compile Include="Views\GroupDetailPage.xaml.cs">
|
||||||
<DependentUpon>GroupDetailPage.xaml</DependentUpon>
|
<DependentUpon>GroupDetailPage.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Pages\MainPageFrames\OpenDatabasePage.xaml.cs">
|
<Compile Include="Views\MainPageFrames\OpenDatabasePage.xaml.cs">
|
||||||
<DependentUpon>OpenDatabasePage.xaml</DependentUpon>
|
<DependentUpon>OpenDatabasePage.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Pages\MainPageFrames\RecentDatabasesPage.xaml.cs">
|
<Compile Include="Views\MainPageFrames\RecentDatabasesPage.xaml.cs">
|
||||||
<DependentUpon>RecentDatabasesPage.xaml</DependentUpon>
|
<DependentUpon>RecentDatabasesPage.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Pages\MainPageFrames\SaveDatabasePage.xaml.cs">
|
<Compile Include="Views\MainPageFrames\SaveDatabasePage.xaml.cs">
|
||||||
<DependentUpon>SaveDatabasePage.xaml</DependentUpon>
|
<DependentUpon>SaveDatabasePage.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="ViewModels\EntryVm.cs" />
|
<Compile Include="ViewModels\EntryVm.cs" />
|
||||||
<Compile Include="ViewModels\GroupVm.cs" />
|
<Compile Include="ViewModels\GroupVm.cs" />
|
||||||
|
<Compile Include="ViewModels\Items\SettingsNewVm.cs" />
|
||||||
<Compile Include="ViewModels\SettingsVm.cs" />
|
<Compile Include="ViewModels\SettingsVm.cs" />
|
||||||
<Compile Include="ViewModels\MainVm.cs" />
|
<Compile Include="ViewModels\MainVm.cs" />
|
||||||
<Compile Include="ViewModels\NewVm.cs" />
|
<Compile Include="ViewModels\NewVm.cs" />
|
||||||
@@ -195,6 +231,15 @@
|
|||||||
<Compile Include="ViewModels\RecentVm.cs" />
|
<Compile Include="ViewModels\RecentVm.cs" />
|
||||||
<Compile Include="ViewModels\SaveVm.cs" />
|
<Compile Include="ViewModels\SaveVm.cs" />
|
||||||
<Compile Include="ViewModels\Items\SettingsDatabaseVm.cs" />
|
<Compile Include="ViewModels\Items\SettingsDatabaseVm.cs" />
|
||||||
|
<Compile Include="Views\UserControls\HamburgerMenuUserControl.xaml.cs">
|
||||||
|
<DependentUpon>HamburgerMenuUserControl.xaml</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Views\UserControls\SymbolPickerUserControl.xaml.cs">
|
||||||
|
<DependentUpon>SymbolPickerUserControl.xaml</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<Compile Include="Views\UserControls\TopMenuUserControl.xaml.cs">
|
||||||
|
<DependentUpon>TopMenuUserControl.xaml</DependentUpon>
|
||||||
|
</Compile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<AppxManifest Include="Package.appxmanifest">
|
<AppxManifest Include="Package.appxmanifest">
|
||||||
@@ -203,6 +248,10 @@
|
|||||||
<None Include="packages.config">
|
<None Include="packages.config">
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</None>
|
</None>
|
||||||
|
<PRIResource Include="Strings\fr-FR\Resources.resw" />
|
||||||
|
<PRIResource Include="Strings\fr-FR\CodeBehind.resw" />
|
||||||
|
<PRIResource Include="Strings\en-US\CodeBehind.resw" />
|
||||||
|
<PRIResource Include="Strings\en-US\Resources.resw" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="Package.StoreAssociation.xml" />
|
<None Include="Package.StoreAssociation.xml" />
|
||||||
@@ -212,94 +261,157 @@
|
|||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
</ApplicationDefinition>
|
</ApplicationDefinition>
|
||||||
<Page Include="Controls\CompositeKeyUserControl.xaml">
|
<Page Include="ResourceDictionaries\Globals.xaml">
|
||||||
<SubType>Designer</SubType>
|
|
||||||
<Generator>MSBuild:Compile</Generator>
|
|
||||||
</Page>
|
|
||||||
<Page Include="Pages\MainPage.xaml">
|
|
||||||
<Generator>MSBuild:Compile</Generator>
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
</Page>
|
|
||||||
<Page Include="Pages\MainPageFrames\AboutPage.xaml">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
<Generator>MSBuild:Compile</Generator>
|
|
||||||
</Page>
|
|
||||||
<Page Include="Pages\EntryDetailPage.xaml">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
<Generator>MSBuild:Compile</Generator>
|
|
||||||
</Page>
|
|
||||||
<Page Include="Pages\GroupDetailPage.xaml">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
<Generator>MSBuild:Compile</Generator>
|
|
||||||
</Page>
|
|
||||||
<Page Include="Pages\MainPageFrames\NewDatabasePage.xaml">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
<Generator>MSBuild:Compile</Generator>
|
|
||||||
</Page>
|
|
||||||
<Page Include="Pages\MainPageFrames\OpenDatabasePage.xaml">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
<Generator>MSBuild:Compile</Generator>
|
|
||||||
</Page>
|
|
||||||
<Page Include="Pages\MainPageFrames\RecentDatabasesPage.xaml">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
<Generator>MSBuild:Compile</Generator>
|
|
||||||
</Page>
|
|
||||||
<Page Include="Pages\MainPageFrames\SaveDatabasePage.xaml">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
<Generator>MSBuild:Compile</Generator>
|
|
||||||
</Page>
|
|
||||||
<Page Include="Pages\SettingsPage.xaml">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
<Generator>MSBuild:Compile</Generator>
|
|
||||||
</Page>
|
|
||||||
<Page Include="Pages\MainPageFrames\WelcomePage.xaml">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
<Generator>MSBuild:Compile</Generator>
|
|
||||||
</Page>
|
|
||||||
<Page Include="Pages\SettingsPageFrames\SettingsDatabasePage.xaml">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
<Generator>MSBuild:Compile</Generator>
|
|
||||||
</Page>
|
|
||||||
<Page Include="Pages\SettingsPageFrames\SettingsSecurityPage.xaml">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
<Generator>MSBuild:Compile</Generator>
|
|
||||||
</Page>
|
|
||||||
<Page Include="Styles\HamburgerButtonStyle.xaml">
|
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Page>
|
</Page>
|
||||||
<Page Include="Styles\ListViewLeftIndicatorStyle.xaml">
|
<Page Include="ResourceDictionaries\NoBorderToggleButtonStyle.xaml">
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Page>
|
</Page>
|
||||||
<Page Include="Styles\NoBorderButtonStyle.xaml">
|
<Page Include="Views\SettingsPageFrames\SettingsSavePage.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\UserControls\BreadCrumbUserControl.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\UserControls\ColorPickerUserControl.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\UserControls\CompositeKeyUserControl.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\MainPage.xaml">
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\MainPageFrames\AboutPage.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\EntryDetailPage.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\GroupDetailPage.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\MainPageFrames\DonatePage.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\MainPageFrames\NewDatabasePage.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\MainPageFrames\OpenDatabasePage.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\MainPageFrames\RecentDatabasesPage.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\MainPageFrames\SaveDatabasePage.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\SettingsPage.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\MainPageFrames\WelcomePage.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\SettingsPageFrames\SettingsDatabasePage.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\SettingsPageFrames\SettingsNewDatabasePage.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\SettingsPageFrames\SettingsSecurityPage.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\SettingsPageFrames\SettingsWelcomePage.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="ResourceDictionaries\HamburgerButtonStyle.xaml">
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Page>
|
</Page>
|
||||||
<Page Include="Styles\TextBoxWithButtonStyle.xaml">
|
<Page Include="ResourceDictionaries\ListViewLeftIndicatorStyle.xaml">
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Page>
|
</Page>
|
||||||
|
<Page Include="ResourceDictionaries\NoBorderButtonStyle.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Page>
|
||||||
|
<Page Include="ResourceDictionaries\Styles.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Page>
|
||||||
|
<Page Include="ResourceDictionaries\TextBoxWithButtonStyle.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\UserControls\HamburgerMenuUserControl.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\UserControls\SymbolPickerUserControl.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
|
<Page Include="Views\UserControls\TopMenuUserControl.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="BouncyCastle.Crypto, Version=1.8.1.0, Culture=neutral, PublicKeyToken=0e99375e54769942, processorArchitecture=MSIL">
|
<Reference Include="BouncyCastle.Crypto, Version=1.8.2.0, Culture=neutral, PublicKeyToken=0e99375e54769942, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\Portable.BouncyCastle.1.8.1.3\lib\netstandard1.0\BouncyCastle.Crypto.dll</HintPath>
|
<HintPath>..\packages\Portable.BouncyCastle.1.8.2\lib\netstandard1.0\BouncyCastle.Crypto.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.HockeyApp.Core45, Version=4.1.6.1005, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\HockeySDK.Core.4.1.6\lib\portable-net45+win8+wp8+wpa81+win81+uap10.0\Microsoft.HockeyApp.Core45.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.HockeyApp.Kit, Version=4.1.6.1005, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\HockeySDK.WINRT.4.1.6\lib\portable-win81\Microsoft.HockeyApp.Kit.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Microsoft.Toolkit.Uwp.Notifications, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="Microsoft.Toolkit.Uwp.Notifications, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\Microsoft.Toolkit.Uwp.Notifications.2.0.0\lib\dotnet\Microsoft.Toolkit.Uwp.Notifications.dll</HintPath>
|
<HintPath>..\packages\Microsoft.Toolkit.Uwp.Notifications.2.0.0\lib\dotnet\Microsoft.Toolkit.Uwp.Notifications.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="ModernKeePassLib, Version=2.37.0.2000, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="ModernKeePassLib, Version=2.39.1.22027, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\ModernKeePassLib.2.37.7000\lib\netstandard1.2\ModernKeePassLib.dll</HintPath>
|
<HintPath>..\packages\ModernKeePassLib.2.39.1\lib\netstandard1.2\ModernKeePassLib.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="Splat, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="Splat, Version=3.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\Splat.2.0.0\lib\Portable-Win81+Wpa81\Splat.dll</HintPath>
|
<HintPath>..\packages\Splat.3.0.0\lib\netstandard1.1\Splat.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System.Drawing.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Drawing.Primitives.4.3.0\lib\netstandard1.1\System.Drawing.Primitives.dll</HintPath>
|
||||||
<Private>True</Private>
|
<Private>True</Private>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
<Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
@@ -316,8 +428,45 @@
|
|||||||
<Name>BehaviorsXamlSDKManaged</Name>
|
<Name>BehaviorsXamlSDKManaged</Name>
|
||||||
</SDKReference>
|
</SDKReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup />
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\description.txt" />
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\images\Screenshot\description.Entry.txt" />
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\images\Screenshot\description.Group.txt" />
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\images\Screenshot\description.New.txt" />
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\images\Screenshot\description.Open.txt" />
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\images\Screenshot\description.Recent.txt" />
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\images\Screenshot\description.Semantic.txt" />
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\images\Screenshot\description.Settings.txt" />
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\images\Screenshot\Entry.png" />
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\images\Screenshot\Group.png" />
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\images\Screenshot\New.png" />
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\images\Screenshot\Open.png" />
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\images\Screenshot\Recent.png" />
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\images\Screenshot\Semantic.png" />
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\images\Screenshot\Settings.png" />
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\keywords.txt" />
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\privacyPolicy.txt" />
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\releaseNotes.txt" />
|
||||||
|
<Content Include="appMetadata\en-us\baselisting\websiteUrl.txt" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\description.txt" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\images\Screenshot\description.Entry.txt" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\images\Screenshot\description.Group.txt" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\images\Screenshot\description.New.txt" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\images\Screenshot\description.Open.txt" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\images\Screenshot\description.Recent.txt" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\images\Screenshot\description.Semantic.txt" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\images\Screenshot\description.Settings.txt" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\images\Screenshot\Entry.png" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\images\Screenshot\Group.png" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\images\Screenshot\New.png" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\images\Screenshot\Open.png" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\images\Screenshot\Recent.png" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\images\Screenshot\Semantic.png" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\images\Screenshot\Settings.png" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\keywords.txt" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\privacyPolicy.txt" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\releaseNotes.txt" />
|
||||||
|
<Content Include="appMetadata\fr-fr\baselisting\websiteUrl.txt" />
|
||||||
<Content Include="Assets\Logo.scale-100.png" />
|
<Content Include="Assets\Logo.scale-100.png" />
|
||||||
<Content Include="Assets\Logo.scale-140.png" />
|
<Content Include="Assets\Logo.scale-140.png" />
|
||||||
<Content Include="Assets\Logo.scale-180.png" />
|
<Content Include="Assets\Logo.scale-180.png" />
|
||||||
@@ -358,10 +507,8 @@
|
|||||||
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets'))" />
|
<Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets'))" />
|
||||||
<Error Condition="!Exists('..\packages\NETStandard.Library.2.0.1\build\NETStandard.Library.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NETStandard.Library.2.0.1\build\NETStandard.Library.targets'))" />
|
|
||||||
</Target>
|
</Target>
|
||||||
<Import Project="..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
|
<Import Project="..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
|
||||||
<Import Project="..\packages\NETStandard.Library.2.0.1\build\NETStandard.Library.targets" Condition="Exists('..\packages\NETStandard.Library.2.0.1\build\NETStandard.Library.targets')" />
|
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
<Target Name="BeforeBuild">
|
<Target Name="BeforeBuild">
|
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest" xmlns:m2="http://schemas.microsoft.com/appx/2013/manifest">
|
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest" xmlns:m2="http://schemas.microsoft.com/appx/2013/manifest">
|
||||||
<Identity Name="wismna.ModernKeePass" Publisher="CN=0719A91A-C322-4EE0-A257-E60733EECF06" Version="1.9.0.30" />
|
<Identity Name="wismna.ModernKeePass" Publisher="CN=0719A91A-C322-4EE0-A257-E60733EECF06" Version="1.14.0.32" />
|
||||||
<Properties>
|
<Properties>
|
||||||
<DisplayName>ModernKeePass</DisplayName>
|
<DisplayName>ModernKeePass</DisplayName>
|
||||||
<PublisherDisplayName>wismna</PublisherDisplayName>
|
<PublisherDisplayName>wismna</PublisherDisplayName>
|
||||||
|
@@ -1,106 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Windows.ApplicationModel.DataTransfer;
|
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using Windows.UI.Xaml.Controls;
|
|
||||||
using Windows.UI.Xaml.Navigation;
|
|
||||||
using ModernKeePass.Common;
|
|
||||||
using ModernKeePass.ViewModels;
|
|
||||||
|
|
||||||
// Pour en savoir plus sur le modèle d'élément Page Détail de l'élément, consultez la page http://go.microsoft.com/fwlink/?LinkId=234232
|
|
||||||
|
|
||||||
namespace ModernKeePass.Pages
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Page affichant les détails d'un élément au sein d'un groupe, offrant la possibilité de
|
|
||||||
/// consulter les autres éléments qui appartiennent au même groupe.
|
|
||||||
/// </summary>
|
|
||||||
public sealed partial class EntryDetailPage
|
|
||||||
{
|
|
||||||
public EntryVm Model => (EntryVm) DataContext;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// NavigationHelper est utilisé sur chaque page pour faciliter la navigation et
|
|
||||||
/// gestion de la durée de vie des processus
|
|
||||||
/// </summary>
|
|
||||||
public NavigationHelper NavigationHelper { get; }
|
|
||||||
|
|
||||||
public EntryDetailPage()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
NavigationHelper = new NavigationHelper(this);
|
|
||||||
NavigationHelper.LoadState += navigationHelper_LoadState;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Remplit la page à l'aide du contenu passé lors de la navigation. Tout état enregistré est également
|
|
||||||
/// fourni lorsqu'une page est recréée à partir d'une session antérieure.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender">
|
|
||||||
/// Source de l'événement ; en général <see cref="Common.NavigationHelper"/>
|
|
||||||
/// </param>
|
|
||||||
/// <param name="e">Données d'événement qui fournissent le paramètre de navigation transmis à
|
|
||||||
/// <see cref="Frame.Navigate(Type, object)"/> lors de la requête initiale de cette page et
|
|
||||||
/// un dictionnaire d'état conservé par cette page durant une session
|
|
||||||
/// antérieure. L'état n'aura pas la valeur Null lors de la première visite de la page.</param>
|
|
||||||
private void navigationHelper_LoadState(object sender, LoadStateEventArgs e) {}
|
|
||||||
|
|
||||||
#region Inscription de NavigationHelper
|
|
||||||
|
|
||||||
/// Les méthodes fournies dans cette section sont utilisées simplement pour permettre
|
|
||||||
/// NavigationHelper pour répondre aux méthodes de navigation de la page.
|
|
||||||
///
|
|
||||||
/// La logique spécifique à la page doit être placée dans les gestionnaires d'événements pour
|
|
||||||
/// <see cref="Common.NavigationHelper.LoadState"/>
|
|
||||||
/// et <see cref="Common.NavigationHelper.SaveState"/>.
|
|
||||||
/// Le paramètre de navigation est disponible dans la méthode LoadState
|
|
||||||
/// en plus de l'état de page conservé durant une session antérieure.
|
|
||||||
|
|
||||||
protected override void OnNavigatedTo(NavigationEventArgs e)
|
|
||||||
{
|
|
||||||
NavigationHelper.OnNavigatedTo(e);
|
|
||||||
if (!(e.Parameter is EntryVm)) return;
|
|
||||||
DataContext = (EntryVm)e.Parameter;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnNavigatedFrom(NavigationEventArgs e)
|
|
||||||
{
|
|
||||||
NavigationHelper.OnNavigatedFrom(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
private void DeleteButton_Click(object sender, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
var isRecycleBinEnabled = ((App)Application.Current).Database.RecycleBinEnabled && !Model.ParentGroup.IsSelected;
|
|
||||||
var message = isRecycleBinEnabled
|
|
||||||
? "Are you sure you want to send this entry to the recycle bin?"
|
|
||||||
: "Are you sure you want to delete this entry?";
|
|
||||||
var text = isRecycleBinEnabled ? "Item moved to the Recycle bin" : "Item permanently removed";
|
|
||||||
MessageDialogHelper.ShowDeleteConfirmationDialog("Delete", message, a =>
|
|
||||||
{
|
|
||||||
ToastNotificationHelper.ShowMovedToast(Model, "Deleting", text);
|
|
||||||
Model.MarkForDelete();
|
|
||||||
if (Frame.CanGoBack) Frame.GoBack();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RestoreButton_Click(object sender, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
ToastNotificationHelper.ShowMovedToast(Model, "Restored", "Item returned to its original group");
|
|
||||||
if (Frame.CanGoBack) Frame.GoBack();
|
|
||||||
}
|
|
||||||
|
|
||||||
private async void UrlButton_Click(object sender, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var uri = new Uri(UrlTextBox.Text);
|
|
||||||
await Windows.System.Launcher.LaunchUriAsync(uri);
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
// TODO: Show some error
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,304 +0,0 @@
|
|||||||
<Page
|
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
||||||
xmlns:viewModels="using:ModernKeePass.ViewModels"
|
|
||||||
xmlns:converters="using:ModernKeePass.Converters"
|
|
||||||
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
|
|
||||||
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
|
|
||||||
xmlns:actions="using:ModernKeePass.Actions"
|
|
||||||
xmlns:templateSelectors="using:ModernKeePass.TemplateSelectors"
|
|
||||||
x:Name="PageRoot"
|
|
||||||
x:Class="ModernKeePass.Pages.GroupDetailPage"
|
|
||||||
mc:Ignorable="d" >
|
|
||||||
<Page.Resources>
|
|
||||||
<SolidColorBrush x:Key="Transparent" Color="Transparent"/>
|
|
||||||
<SolidColorBrush x:Key="SystemColor" Color="{StaticResource SystemColorButtonFaceColor}" />
|
|
||||||
<converters:ColorToBrushConverter x:Key="ColorToBrushConverter"/>
|
|
||||||
<converters:BooleanToFontStyleConverter x:Key="BooleanToFontStyleConverter"/>
|
|
||||||
<converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
|
|
||||||
<converters:NullToBooleanConverter x:Key="NullToBooleanConverter"/>
|
|
||||||
</Page.Resources>
|
|
||||||
<Page.DataContext>
|
|
||||||
<viewModels:GroupVm />
|
|
||||||
</Page.DataContext>
|
|
||||||
<Page.BottomAppBar>
|
|
||||||
<CommandBar x:Name="CommandBar" VerticalAlignment="Center">
|
|
||||||
<CommandBar.SecondaryCommands>
|
|
||||||
<AppBarButton Icon="Save" Label="Save">
|
|
||||||
<interactivity:Interaction.Behaviors>
|
|
||||||
<core:EventTriggerBehavior EventName="Click">
|
|
||||||
<core:CallMethodAction TargetObject="{Binding}" MethodName="Save"/>
|
|
||||||
<core:ChangePropertyAction TargetObject="{Binding ElementName=CommandBar}" PropertyName="IsOpen" Value="False" />
|
|
||||||
</core:EventTriggerBehavior>
|
|
||||||
</interactivity:Interaction.Behaviors>
|
|
||||||
</AppBarButton>
|
|
||||||
<AppBarButton Icon="Setting" Label="Settings">
|
|
||||||
<interactivity:Interaction.Behaviors>
|
|
||||||
<core:EventTriggerBehavior EventName="Click">
|
|
||||||
<core:NavigateToPageAction TargetPage="ModernKeePass.Pages.SettingsPage" />
|
|
||||||
</core:EventTriggerBehavior>
|
|
||||||
</interactivity:Interaction.Behaviors>
|
|
||||||
</AppBarButton>
|
|
||||||
</CommandBar.SecondaryCommands>
|
|
||||||
<AppBarToggleButton Icon="Edit" Label="Edit" IsChecked="{Binding IsEditMode, Mode=TwoWay}">
|
|
||||||
<interactivity:Interaction.Behaviors>
|
|
||||||
<core:EventTriggerBehavior EventName="Click">
|
|
||||||
<core:ChangePropertyAction TargetObject="{Binding ElementName=CommandBar}" PropertyName="IsOpen" Value="False" />
|
|
||||||
</core:EventTriggerBehavior>
|
|
||||||
</interactivity:Interaction.Behaviors>
|
|
||||||
</AppBarToggleButton>
|
|
||||||
<AppBarButton Icon="Undo" Label="Restore" Visibility="{Binding ShowRestore, Converter={StaticResource BooleanToVisibilityConverter}}" IsEnabled="{Binding PreviousGroup, Converter={StaticResource NullToBooleanConverter}}" Click="RestoreButton_Click">
|
|
||||||
<interactivity:Interaction.Behaviors>
|
|
||||||
<core:EventTriggerBehavior EventName="Click">
|
|
||||||
<core:CallMethodAction MethodName="UndoDelete" TargetObject="{Binding}" />
|
|
||||||
</core:EventTriggerBehavior>
|
|
||||||
</interactivity:Interaction.Behaviors>
|
|
||||||
</AppBarButton>
|
|
||||||
<AppBarButton Icon="Delete" Label="Delete" IsEnabled="{Binding IsNotRoot}" Click="DeleteButton_Click" />
|
|
||||||
</CommandBar>
|
|
||||||
</Page.BottomAppBar>
|
|
||||||
<Grid>
|
|
||||||
<Grid.Resources>
|
|
||||||
<CollectionViewSource
|
|
||||||
x:Name="GroupsViewSource"
|
|
||||||
Source="{Binding Groups}" />
|
|
||||||
<CollectionViewSource
|
|
||||||
x:Name="EntriesViewSource"
|
|
||||||
Source="{Binding Entries}" />
|
|
||||||
<CollectionViewSource
|
|
||||||
x:Name="EntriesZoomedOutViewSource"
|
|
||||||
Source="{Binding EntriesZoomedOut}" IsSourceGrouped="True"/>
|
|
||||||
</Grid.Resources>
|
|
||||||
<Grid.Background>
|
|
||||||
<StaticResource ResourceKey="ApplicationPageBackgroundThemeBrush"/>
|
|
||||||
</Grid.Background>
|
|
||||||
<Grid.ChildrenTransitions>
|
|
||||||
<TransitionCollection>
|
|
||||||
<EntranceThemeTransition/>
|
|
||||||
</TransitionCollection>
|
|
||||||
</Grid.ChildrenTransitions>
|
|
||||||
<Grid.RowDefinitions>
|
|
||||||
<RowDefinition Height="50"/>
|
|
||||||
<RowDefinition Height="*"/>
|
|
||||||
</Grid.RowDefinitions>
|
|
||||||
<Grid Grid.Row="1">
|
|
||||||
<Grid.ColumnDefinitions>
|
|
||||||
<ColumnDefinition Width="Auto" />
|
|
||||||
<ColumnDefinition Width="*" />
|
|
||||||
</Grid.ColumnDefinitions>
|
|
||||||
<ListView
|
|
||||||
Grid.Column="0"
|
|
||||||
x:Name="LeftListView"
|
|
||||||
Margin="0,0,0,-10"
|
|
||||||
SelectionChanged="groups_SelectionChanged"
|
|
||||||
IsSwipeEnabled="false"
|
|
||||||
IsSynchronizedWithCurrentItem="False"
|
|
||||||
DataContext="{Binding DataContext, ElementName=PageRoot}"
|
|
||||||
RequestedTheme="Dark"
|
|
||||||
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
|
|
||||||
Foreground="{ThemeResource DefaultTextForegroundThemeBrush}">
|
|
||||||
<ListView.Resources>
|
|
||||||
<DataTemplate x:Name="Collapsed">
|
|
||||||
<SymbolIcon Symbol="{Binding IconSymbol}" Margin="8,0,0,0">
|
|
||||||
<ToolTipService.ToolTip>
|
|
||||||
<ToolTip Content="{Binding Name}" />
|
|
||||||
</ToolTipService.ToolTip>
|
|
||||||
</SymbolIcon>
|
|
||||||
</DataTemplate>
|
|
||||||
<DataTemplate x:Name="Expanded">
|
|
||||||
<StackPanel Orientation="Horizontal">
|
|
||||||
<SymbolIcon Symbol="{Binding IconSymbol}" Margin="8,0,0,0" />
|
|
||||||
<TextBlock Text="{Binding Name}" FontWeight="{Binding FontWeight}" TextWrapping="NoWrap" VerticalAlignment="Center" Margin="30,0,20,0" FontStyle="{Binding IsSelected, Converter={StaticResource BooleanToFontStyleConverter}}" />
|
|
||||||
</StackPanel>
|
|
||||||
</DataTemplate>
|
|
||||||
</ListView.Resources>
|
|
||||||
<ListView.ItemsSource>
|
|
||||||
<Binding Source="{StaticResource GroupsViewSource}"/>
|
|
||||||
</ListView.ItemsSource>
|
|
||||||
<ListView.ItemContainerStyle>
|
|
||||||
<Style TargetType="ListViewItem">
|
|
||||||
<Setter Property="VerticalContentAlignment" Value="Stretch" />
|
|
||||||
<!--<Setter Property="HorizontalContentAlignment" Value="Center" />-->
|
|
||||||
<Setter Property="Padding" Value="0"/>
|
|
||||||
<Setter Property="Margin" Value="0"/>
|
|
||||||
</Style>
|
|
||||||
</ListView.ItemContainerStyle>
|
|
||||||
<ListView.HeaderTemplate>
|
|
||||||
<DataTemplate>
|
|
||||||
<ToggleButton Style="{StaticResource HamburgerToggleButton}">
|
|
||||||
<interactivity:Interaction.Behaviors>
|
|
||||||
<core:EventTriggerBehavior EventName="Loaded">
|
|
||||||
<core:ChangePropertyAction PropertyName="ItemTemplate" Value="{StaticResource Collapsed}" TargetObject="{Binding ElementName=LeftListView}"/>
|
|
||||||
</core:EventTriggerBehavior>
|
|
||||||
<core:EventTriggerBehavior EventName="Checked">
|
|
||||||
<core:ChangePropertyAction PropertyName="ItemTemplate" Value="{StaticResource Expanded}" TargetObject="{Binding ElementName=LeftListView}"/>
|
|
||||||
</core:EventTriggerBehavior>
|
|
||||||
<core:EventTriggerBehavior EventName="Unchecked">
|
|
||||||
<core:ChangePropertyAction PropertyName="ItemTemplate" Value="{StaticResource Collapsed}" TargetObject="{Binding ElementName=LeftListView}"/>
|
|
||||||
</core:EventTriggerBehavior>
|
|
||||||
</interactivity:Interaction.Behaviors>
|
|
||||||
</ToggleButton>
|
|
||||||
</DataTemplate>
|
|
||||||
</ListView.HeaderTemplate>
|
|
||||||
</ListView>
|
|
||||||
<!-- Horizontal scrolling grid -->
|
|
||||||
<SemanticZoom Grid.Column="1" ViewChangeStarted="SemanticZoom_ViewChangeStarted" Margin="0,30,0,0">
|
|
||||||
<SemanticZoom.ZoomedInView>
|
|
||||||
<GridView
|
|
||||||
x:Name="GridView"
|
|
||||||
AutomationProperties.AutomationId="ItemGridView"
|
|
||||||
AutomationProperties.Name="Entries"
|
|
||||||
TabIndex="1"
|
|
||||||
SelectionChanged="entries_SelectionChanged"
|
|
||||||
IsSynchronizedWithCurrentItem="False">
|
|
||||||
<interactivity:Interaction.Behaviors>
|
|
||||||
<core:DataTriggerBehavior Binding="{Binding IsEditMode}" Value="False">
|
|
||||||
<actions:SetupFocusAction TargetObject="{Binding ElementName=GridView}" />
|
|
||||||
</core:DataTriggerBehavior>
|
|
||||||
</interactivity:Interaction.Behaviors>
|
|
||||||
<GridView.Resources>
|
|
||||||
<DataTemplate x:Name="GroupFirstItem">
|
|
||||||
<Border
|
|
||||||
BorderThickness="2"
|
|
||||||
BorderBrush="{StaticResource SystemColor}"
|
|
||||||
Background="{StaticResource HubSectionHeaderPressedForegroundThemeBrush}">
|
|
||||||
<Grid Height="110" Width="480">
|
|
||||||
<Grid.ColumnDefinitions>
|
|
||||||
<ColumnDefinition Width="Auto"/>
|
|
||||||
<ColumnDefinition Width="*"/>
|
|
||||||
</Grid.ColumnDefinitions>
|
|
||||||
<SymbolIcon Grid.Column="0" Symbol="{Binding IconSymbol}" Width="100" Height="100" RenderTransformOrigin="0.5,0.5" Foreground="{ThemeResource TextBoxBackgroundThemeBrush}" >
|
|
||||||
<SymbolIcon.RenderTransform>
|
|
||||||
<CompositeTransform ScaleX="2" TranslateX="0" TranslateY="0" ScaleY="2"/>
|
|
||||||
</SymbolIcon.RenderTransform>
|
|
||||||
</SymbolIcon>
|
|
||||||
<TextBlock Grid.Column="1" Text="{Binding Name}" FontWeight="Bold" Style="{ThemeResource TitleTextBlockStyle}" Foreground="{ThemeResource TextBoxBackgroundThemeBrush}" TextWrapping="NoWrap" VerticalAlignment="Center" Margin="13,0,0,5"/>
|
|
||||||
</Grid>
|
|
||||||
</Border>
|
|
||||||
</DataTemplate>
|
|
||||||
<DataTemplate x:Name="GroupOtherItem">
|
|
||||||
<Grid Height="110" Width="480" x:Name="EntryGrid" >
|
|
||||||
<Grid.ColumnDefinitions>
|
|
||||||
<ColumnDefinition Width="Auto"/>
|
|
||||||
<ColumnDefinition Width="*"/>
|
|
||||||
</Grid.ColumnDefinitions>
|
|
||||||
<Border
|
|
||||||
Grid.Column="0"
|
|
||||||
BorderThickness="2"
|
|
||||||
BorderBrush="{StaticResource SystemColor}"
|
|
||||||
Background="{Binding BackgroundColor, ConverterParameter={StaticResource Transparent}, Converter={StaticResource ColorToBrushConverter}}">
|
|
||||||
<SymbolIcon Symbol="{Binding IconSymbol}" Width="100" Height="100" RenderTransformOrigin="0.5,0.5" >
|
|
||||||
<SymbolIcon.RenderTransform>
|
|
||||||
<CompositeTransform ScaleX="2" TranslateX="0" TranslateY="0" ScaleY="2"/>
|
|
||||||
</SymbolIcon.RenderTransform>
|
|
||||||
</SymbolIcon>
|
|
||||||
</Border>
|
|
||||||
<StackPanel Grid.Column="1" VerticalAlignment="Top" Margin="10,10,0,0" >
|
|
||||||
<TextBlock x:Name="NameTextBlock" Text="{Binding Name}" Style="{StaticResource TitleTextBlockStyle}" TextWrapping="NoWrap" Foreground="{Binding ForegroundColor, ConverterParameter={StaticResource TextBoxForegroundThemeBrush}, Converter={StaticResource ColorToBrushConverter}}"/>
|
|
||||||
<TextBlock Style="{StaticResource CaptionTextBlockStyle}" TextWrapping="NoWrap"/>
|
|
||||||
<TextBlock Text="{Binding UserName}" Style="{StaticResource BodyTextBlockStyle}" MaxHeight="60" />
|
|
||||||
<TextBlock Text="{Binding Url}" Style="{StaticResource BodyTextBlockStyle}" MaxHeight="60" />
|
|
||||||
</StackPanel>
|
|
||||||
</Grid>
|
|
||||||
</DataTemplate>
|
|
||||||
</GridView.Resources>
|
|
||||||
<GridView.ItemsSource>
|
|
||||||
<Binding Source="{StaticResource EntriesViewSource}"/>
|
|
||||||
</GridView.ItemsSource>
|
|
||||||
<GridView.DataContext>
|
|
||||||
<viewModels:EntryVm/>
|
|
||||||
</GridView.DataContext>
|
|
||||||
<GridView.ItemTemplateSelector>
|
|
||||||
<templateSelectors:FirstItemDataTemplateSelector
|
|
||||||
FirstItem="{StaticResource GroupFirstItem}"
|
|
||||||
OtherItem="{StaticResource GroupOtherItem}" />
|
|
||||||
</GridView.ItemTemplateSelector>
|
|
||||||
<GridView.ItemContainerStyle>
|
|
||||||
<Style TargetType="FrameworkElement">
|
|
||||||
<Setter Property="Margin" Value="52,0,0,2"/>
|
|
||||||
</Style>
|
|
||||||
</GridView.ItemContainerStyle>
|
|
||||||
</GridView>
|
|
||||||
</SemanticZoom.ZoomedInView>
|
|
||||||
|
|
||||||
<SemanticZoom.ZoomedOutView>
|
|
||||||
<ListView
|
|
||||||
x:Name="SemanticListView"
|
|
||||||
ItemsSource="{Binding Source={StaticResource EntriesZoomedOutViewSource}}"
|
|
||||||
IsSwipeEnabled="false"
|
|
||||||
SelectionChanged="groups_SelectionChanged"
|
|
||||||
IsSynchronizedWithCurrentItem="False">
|
|
||||||
<ListView.ItemsPanel>
|
|
||||||
<ItemsPanelTemplate>
|
|
||||||
<StackPanel Orientation="Horizontal" />
|
|
||||||
</ItemsPanelTemplate>
|
|
||||||
</ListView.ItemsPanel>
|
|
||||||
<ListView.ItemTemplate>
|
|
||||||
<DataTemplate>
|
|
||||||
<StackPanel Orientation="Vertical">
|
|
||||||
<TextBlock Text="{Binding Name}" Style="{StaticResource TitleTextBlockStyle}" TextWrapping="NoWrap"/>
|
|
||||||
</StackPanel>
|
|
||||||
</DataTemplate>
|
|
||||||
</ListView.ItemTemplate>
|
|
||||||
<ListView.GroupStyle>
|
|
||||||
<GroupStyle HidesIfEmpty="True">
|
|
||||||
<GroupStyle.HeaderTemplate>
|
|
||||||
<DataTemplate>
|
|
||||||
<Grid Background="LightGray" Margin="0,0,10,0" HorizontalAlignment="Left">
|
|
||||||
<TextBlock Text="{Binding Key}" Width="40" Foreground="Black" Margin="30" Style="{StaticResource HeaderTextBlockStyle}"/>
|
|
||||||
</Grid>
|
|
||||||
</DataTemplate>
|
|
||||||
</GroupStyle.HeaderTemplate>
|
|
||||||
</GroupStyle>
|
|
||||||
</ListView.GroupStyle>
|
|
||||||
</ListView>
|
|
||||||
</SemanticZoom.ZoomedOutView>
|
|
||||||
</SemanticZoom>
|
|
||||||
|
|
||||||
</Grid>
|
|
||||||
<!-- Back button and page title -->
|
|
||||||
<Grid Grid.Row="0" Background="{ThemeResource AppBarBackgroundThemeBrush}">
|
|
||||||
<Grid.ColumnDefinitions>
|
|
||||||
<ColumnDefinition Width="60"/>
|
|
||||||
<ColumnDefinition Width="*"/>
|
|
||||||
<ColumnDefinition Width="400"/>
|
|
||||||
</Grid.ColumnDefinitions>
|
|
||||||
<Button Grid.Column="0"
|
|
||||||
x:Name="BackButton"
|
|
||||||
Command="{Binding NavigationHelper.GoBackCommand, ElementName=PageRoot}"
|
|
||||||
Height="50"
|
|
||||||
Width="50"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
AutomationProperties.Name="Back"
|
|
||||||
AutomationProperties.AutomationId="BackButton"
|
|
||||||
AutomationProperties.ItemType="Navigation Button"
|
|
||||||
Style="{StaticResource NoBorderButtonStyle}">
|
|
||||||
<SymbolIcon Symbol="Back" />
|
|
||||||
</Button>
|
|
||||||
<StackPanel Grid.Column="1" >
|
|
||||||
<TextBox
|
|
||||||
x:Name="TitleTextBox"
|
|
||||||
Text="{Binding Name, Mode=TwoWay}"
|
|
||||||
Foreground="{ThemeResource DefaultTextForegroundThemeBrush}"
|
|
||||||
Background="Transparent"
|
|
||||||
IsHitTestVisible="{Binding IsEditMode}"
|
|
||||||
BorderThickness="0"
|
|
||||||
FontSize="20"
|
|
||||||
FontWeight="SemiBold"
|
|
||||||
TextWrapping="NoWrap"
|
|
||||||
VerticalAlignment="Center"
|
|
||||||
PlaceholderText="New group name...">
|
|
||||||
<interactivity:Interaction.Behaviors>
|
|
||||||
<core:DataTriggerBehavior Binding="{Binding IsEditMode}" Value="True">
|
|
||||||
<actions:SetupFocusAction TargetObject="{Binding ElementName=TitleTextBox}" />
|
|
||||||
</core:DataTriggerBehavior>
|
|
||||||
</interactivity:Interaction.Behaviors>
|
|
||||||
</TextBox>
|
|
||||||
<TextBlock FontSize="12" Text="{Binding Path}" />
|
|
||||||
</StackPanel>
|
|
||||||
<SearchBox Grid.Column="2" PlaceholderText="Search..." Width="350" Background="{ThemeResource TextBoxDisabledBackgroundThemeBrush}" BorderThickness="0" FontSize="18" SuggestionsRequested="SearchBox_OnSuggestionsRequested" SearchHistoryEnabled="False" ResultSuggestionChosen="SearchBox_OnResultSuggestionChosen" />
|
|
||||||
</Grid>
|
|
||||||
</Grid>
|
|
||||||
</Page>
|
|
@@ -1,48 +0,0 @@
|
|||||||
<Page
|
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
||||||
xmlns:viewModels="using:ModernKeePass.ViewModels"
|
|
||||||
xmlns:local="using:ModernKeePass.Controls"
|
|
||||||
xmlns:converters="using:ModernKeePass.Converters"
|
|
||||||
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
|
|
||||||
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
|
|
||||||
x:Class="ModernKeePass.Pages.RecentDatabasesPage"
|
|
||||||
mc:Ignorable="d">
|
|
||||||
<Page.Resources>
|
|
||||||
<converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
|
|
||||||
<CollectionViewSource x:Name="RecentItemsSource" Source="{Binding RecentItems}" />
|
|
||||||
</Page.Resources>
|
|
||||||
<Page.DataContext>
|
|
||||||
<viewModels:RecentVm/>
|
|
||||||
</Page.DataContext>
|
|
||||||
<ListView Background="{StaticResource ApplicationPageBackgroundThemeBrush}"
|
|
||||||
ItemsSource="{Binding Source={StaticResource RecentItemsSource}}"
|
|
||||||
SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
|
|
||||||
ItemContainerStyle="{StaticResource ListViewLeftIndicatorItemExpanded}">
|
|
||||||
<ListView.ItemTemplate>
|
|
||||||
<DataTemplate>
|
|
||||||
<Grid Margin="10,0,10,0">
|
|
||||||
<Grid.RowDefinitions>
|
|
||||||
<RowDefinition />
|
|
||||||
<RowDefinition />
|
|
||||||
<RowDefinition />
|
|
||||||
</Grid.RowDefinitions>
|
|
||||||
<Grid.ColumnDefinitions>
|
|
||||||
<ColumnDefinition Width="*"/>
|
|
||||||
</Grid.ColumnDefinitions>
|
|
||||||
<TextBlock Grid.Row="0" Text="{Binding Name}" Padding="5,0,0,0" />
|
|
||||||
<TextBlock Grid.Row="1" Text="{Binding Path}" Padding="5,0,0,0" FontSize="10" />
|
|
||||||
<local:CompositeKeyUserControl Grid.Row="2" x:Name="DatabaseUserControl" HorizontalAlignment="Stretch" MinWidth="400" Margin="0,10,0,0" Visibility="{Binding IsSelected, Converter={StaticResource BooleanToVisibilityConverter}}" ValidationChecking="OpenDatabaseUserControl_OnValidationChecking">
|
|
||||||
<interactivity:Interaction.Behaviors>
|
|
||||||
<core:EventTriggerBehavior EventName="ValidationChecked">
|
|
||||||
<core:NavigateToPageAction TargetPage="ModernKeePass.Pages.GroupDetailPage" />
|
|
||||||
</core:EventTriggerBehavior>
|
|
||||||
</interactivity:Interaction.Behaviors>
|
|
||||||
</local:CompositeKeyUserControl>
|
|
||||||
</Grid>
|
|
||||||
</DataTemplate>
|
|
||||||
</ListView.ItemTemplate>
|
|
||||||
</ListView>
|
|
||||||
</Page>
|
|
@@ -1,19 +0,0 @@
|
|||||||
<Page
|
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
||||||
xmlns:viewModels="using:ModernKeePass.ViewModels"
|
|
||||||
x:Class="ModernKeePass.Pages.SaveDatabasePage"
|
|
||||||
mc:Ignorable="d">
|
|
||||||
<Page.DataContext>
|
|
||||||
<viewModels:SaveVm/>
|
|
||||||
</Page.DataContext>
|
|
||||||
|
|
||||||
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
|
|
||||||
<HyperlinkButton Content="Save and close" Click="SaveButton_OnClick" />
|
|
||||||
<TextBlock Style="{StaticResource BodyTextBlockStyle}" Margin="15,0,0,30">This will save and close the currently opened database.</TextBlock>
|
|
||||||
<HyperlinkButton Content="Save as..." Click="SaveAsButton_OnClick" />
|
|
||||||
<TextBlock Style="{StaticResource BodyTextBlockStyle}" Margin="15,0,0,30">This will save the currently opened database as a new file and leave it open.</TextBlock>
|
|
||||||
</StackPanel>
|
|
||||||
</Page>
|
|
@@ -1,30 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Runtime.InteropServices.WindowsRuntime;
|
|
||||||
using Windows.Foundation;
|
|
||||||
using Windows.Foundation.Collections;
|
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using Windows.UI.Xaml.Controls;
|
|
||||||
using Windows.UI.Xaml.Controls.Primitives;
|
|
||||||
using Windows.UI.Xaml.Data;
|
|
||||||
using Windows.UI.Xaml.Input;
|
|
||||||
using Windows.UI.Xaml.Media;
|
|
||||||
using Windows.UI.Xaml.Navigation;
|
|
||||||
|
|
||||||
// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
|
|
||||||
|
|
||||||
namespace ModernKeePass.Pages
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// An empty page that can be used on its own or navigated to within a Frame.
|
|
||||||
/// </summary>
|
|
||||||
public sealed partial class WelcomePage : Page
|
|
||||||
{
|
|
||||||
public WelcomePage()
|
|
||||||
{
|
|
||||||
this.InitializeComponent();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,29 +0,0 @@
|
|||||||
<Page
|
|
||||||
x:Class="ModernKeePass.Pages.SettingsDatabasePage"
|
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
||||||
xmlns:viewModels="using:ModernKeePass.ViewModels"
|
|
||||||
mc:Ignorable="d">
|
|
||||||
<Page.Resources>
|
|
||||||
<CollectionViewSource x:Name="RecycleBinGroups" Source="{Binding Groups}" />
|
|
||||||
<CollectionViewSource x:Name="Ciphers" Source="{Binding Ciphers}" />
|
|
||||||
<CollectionViewSource x:Name="Compressions" Source="{Binding Compressions}" />
|
|
||||||
<CollectionViewSource x:Name="KeyDerivations" Source="{Binding KeyDerivations}" />
|
|
||||||
</Page.Resources>
|
|
||||||
<Page.DataContext>
|
|
||||||
<viewModels:SettingsDatabaseVm />
|
|
||||||
</Page.DataContext>
|
|
||||||
|
|
||||||
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
|
|
||||||
<ToggleSwitch Header="Recycle bin" OffContent="Disabled" OnContent="Enabled" IsOn="{Binding HasRecycleBin, Mode=TwoWay}" />
|
|
||||||
<ComboBox ItemsSource="{Binding Source={StaticResource RecycleBinGroups}}" SelectedItem="{Binding SelectedItem, Mode=TwoWay}" IsEnabled="{Binding HasRecycleBin}" />
|
|
||||||
<TextBlock Text="Encryption Algorithm" FontSize="14" Margin="5,20,0,10" />
|
|
||||||
<ComboBox ItemsSource="{Binding Source={StaticResource Ciphers}}" SelectedIndex="{Binding CipherIndex, Mode=TwoWay}" />
|
|
||||||
<TextBlock Text="Compression Algorithm" FontSize="14" Margin="5,20,0,10" />
|
|
||||||
<ComboBox ItemsSource="{Binding Source={StaticResource Compressions}}" SelectedItem="{Binding CompressionName, Mode=TwoWay}" />
|
|
||||||
<TextBlock Text="Key Derivation Algorithm" FontSize="14" Margin="5,20,0,10" />
|
|
||||||
<ComboBox ItemsSource="{Binding Source={StaticResource KeyDerivations}}" SelectedItem="{Binding KeyDerivationName, Mode=TwoWay}" />
|
|
||||||
</StackPanel>
|
|
||||||
</Page>
|
|
@@ -1,14 +0,0 @@
|
|||||||
<Page
|
|
||||||
x:Class="ModernKeePass.Pages.SettingsSecurityPage"
|
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
||||||
xmlns:local="using:ModernKeePass.Controls"
|
|
||||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
||||||
mc:Ignorable="d">
|
|
||||||
|
|
||||||
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
|
|
||||||
<TextBlock Text="Change database security options" />
|
|
||||||
<local:CompositeKeyUserControl UpdateKey="True" />
|
|
||||||
</StackPanel>
|
|
||||||
</Page>
|
|
@@ -1,5 +1,4 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
// General Information about an assembly is controlled through the following
|
||||||
@@ -10,7 +9,7 @@ using System.Runtime.InteropServices;
|
|||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("wismna")]
|
[assembly: AssemblyCompany("wismna")]
|
||||||
[assembly: AssemblyProduct("ModernKeePass")]
|
[assembly: AssemblyProduct("ModernKeePass")]
|
||||||
[assembly: AssemblyCopyright("Copyright © 2017")]
|
[assembly: AssemblyCopyright("Copyright © 2018")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
@@ -24,6 +23,6 @@ using System.Runtime.InteropServices;
|
|||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
// by using the '*' as shown below:
|
// by using the '*' as shown below:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.9.0.0")]
|
[assembly: AssemblyVersion("1.14.0.0")]
|
||||||
[assembly: AssemblyFileVersion("1.9.0.0")]
|
[assembly: AssemblyFileVersion("1.14.0.0")]
|
||||||
[assembly: ComVisible(false)]
|
[assembly: ComVisible(false)]
|
8
ModernKeePass/ResourceDictionaries/Globals.xaml
Normal file
8
ModernKeePass/ResourceDictionaries/Globals.xaml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
<ResourceDictionary
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||||
|
<x:Double x:Key="MenuSize">60</x:Double>
|
||||||
|
<GridLength x:Key="MenuGridLength">60</GridLength>
|
||||||
|
<SolidColorBrush x:Key="MainColor" Color="{StaticResource SystemAccentColor}" />
|
||||||
|
<SolidColorBrush x:Key="TextColor" Color="{StaticResource SystemColorHighlightTextColor}" />
|
||||||
|
</ResourceDictionary>
|
@@ -7,22 +7,35 @@
|
|||||||
<Setter.Value>
|
<Setter.Value>
|
||||||
<ControlTemplate TargetType="ToggleButton">
|
<ControlTemplate TargetType="ToggleButton">
|
||||||
<ContentControl>
|
<ContentControl>
|
||||||
<Grid Background="{StaticResource ListViewItemSelectedBackgroundThemeBrush}" Margin="0" Width="50" Height="50">
|
<VisualStateManager.VisualStateGroups>
|
||||||
<Canvas x:Name="hampurger_menu" HorizontalAlignment="Center" Height="17" UseLayoutRounding="False" VerticalAlignment="Center" Width="28">
|
<VisualStateGroup x:Name="CommonStates">
|
||||||
<Canvas x:Name="Layer_1" Height="17" Canvas.Left="0" Width="28" Margin="0" RenderTransformOrigin="0.5,0.5">
|
<VisualState x:Name="Normal" />
|
||||||
|
<VisualState x:Name="PointerOver">
|
||||||
|
<Storyboard>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Grid"
|
||||||
|
Storyboard.TargetProperty="Opacity">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="0.8" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
</VisualStateGroup>
|
||||||
|
</VisualStateManager.VisualStateGroups>
|
||||||
|
<Grid x:Name="Grid" Background="{StaticResource MainColor}" Margin="0" Width="{StaticResource MenuSize}" Height="{StaticResource MenuSize}">
|
||||||
|
<Canvas x:Name="HamburgerMenu" HorizontalAlignment="Center" Height="17" UseLayoutRounding="False" VerticalAlignment="Center" Width="28">
|
||||||
|
<Canvas x:Name="Layer1" Height="17" Canvas.Left="0" Width="28" Margin="0" RenderTransformOrigin="0.5,0.5">
|
||||||
<Canvas.RenderTransform>
|
<Canvas.RenderTransform>
|
||||||
<CompositeTransform/>
|
<CompositeTransform/>
|
||||||
</Canvas.RenderTransform>
|
</Canvas.RenderTransform>
|
||||||
<Canvas.Projection>
|
<Canvas.Projection>
|
||||||
<PlaneProjection/>
|
<PlaneProjection/>
|
||||||
</Canvas.Projection>
|
</Canvas.Projection>
|
||||||
<Path x:Name="path" Data="M0,12.997 L30,12.997" Height="3" Stretch="Fill" StrokeThickness="3" Width="28" Stroke="{ThemeResource DefaultTextForegroundThemeBrush}" StrokeStartLineCap="Square" StrokeEndLineCap="Square" RenderTransformOrigin="0.5,0.5">
|
<Path x:Name="Path" Data="M0,12.997 L30,12.997" Height="2" Stretch="Fill" StrokeThickness="2" Width="28" Stroke="{ThemeResource DefaultTextForegroundThemeBrush}" StrokeStartLineCap="Square" StrokeEndLineCap="Square" RenderTransformOrigin="0.5,0.5">
|
||||||
<Path.RenderTransform>
|
<Path.RenderTransform>
|
||||||
<CompositeTransform/>
|
<CompositeTransform/>
|
||||||
</Path.RenderTransform>
|
</Path.RenderTransform>
|
||||||
</Path>
|
</Path>
|
||||||
<Path Data="M0,12.997 L30,12.997" Height="3" Stretch="Fill" StrokeThickness="3" Width="28" Stroke="{ThemeResource DefaultTextForegroundThemeBrush}" StrokeStartLineCap="Square" StrokeEndLineCap="Square" Canvas.Top="7"/>
|
<Path Data="M0,12.997 L30,12.997" Height="2" Stretch="Fill" StrokeThickness="2" Width="28" Stroke="{ThemeResource DefaultTextForegroundThemeBrush}" StrokeStartLineCap="Square" StrokeEndLineCap="Square" Canvas.Top="7"/>
|
||||||
<Path x:Name="path1" Data="M0,12.997 L30,12.997" Height="3" Stretch="Fill" StrokeThickness="3" Width="28" Stroke="{ThemeResource DefaultTextForegroundThemeBrush}" StrokeStartLineCap="Square" StrokeEndLineCap="Square" Canvas.Top="14" RenderTransformOrigin="0.5,0.5">
|
<Path x:Name="Path1" Data="M0,12.997 L30,12.997" Height="2" Stretch="Fill" StrokeThickness="2" Width="28" Stroke="{ThemeResource DefaultTextForegroundThemeBrush}" StrokeStartLineCap="Square" StrokeEndLineCap="Square" Canvas.Top="14" RenderTransformOrigin="0.5,0.5">
|
||||||
<Path.RenderTransform>
|
<Path.RenderTransform>
|
||||||
<CompositeTransform/>
|
<CompositeTransform/>
|
||||||
</Path.RenderTransform>
|
</Path.RenderTransform>
|
@@ -1,8 +1,6 @@
|
|||||||
<ResourceDictionary
|
<ResourceDictionary
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||||
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
|
|
||||||
xmlns:core="using:Microsoft.Xaml.Interactions.Core">
|
|
||||||
|
|
||||||
<!-- Style for Windows.UI.Xaml.Controls.ListViewItem with left selection indicator -->
|
<!-- Style for Windows.UI.Xaml.Controls.ListViewItem with left selection indicator -->
|
||||||
<Style TargetType="ListViewItem" x:Key="ListViewLeftIndicatorItemExpanded">
|
<Style TargetType="ListViewItem" x:Key="ListViewLeftIndicatorItemExpanded">
|
||||||
@@ -27,7 +25,7 @@
|
|||||||
<DoubleAnimation Storyboard.TargetName="PointerOverBorder"
|
<DoubleAnimation Storyboard.TargetName="PointerOverBorder"
|
||||||
Storyboard.TargetProperty="Opacity"
|
Storyboard.TargetProperty="Opacity"
|
||||||
Duration="0"
|
Duration="0"
|
||||||
To="1" />
|
To="0.5" />
|
||||||
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="SelectedEarmark"
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="SelectedEarmark"
|
||||||
Storyboard.TargetProperty="Fill">
|
Storyboard.TargetProperty="Fill">
|
||||||
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListViewItemSelectedPointerOverBackgroundThemeBrush}" />
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListViewItemSelectedPointerOverBackgroundThemeBrush}" />
|
||||||
@@ -193,7 +191,7 @@
|
|||||||
To="1" />
|
To="1" />
|
||||||
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="contentPresenter"
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="contentPresenter"
|
||||||
Storyboard.TargetProperty="Foreground">
|
Storyboard.TargetProperty="Foreground">
|
||||||
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ListViewItemSelectedForegroundThemeBrush}" />
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource MainColor}" />
|
||||||
</ObjectAnimationUsingKeyFrames>
|
</ObjectAnimationUsingKeyFrames>
|
||||||
</Storyboard>
|
</Storyboard>
|
||||||
</VisualState>
|
</VisualState>
|
||||||
@@ -360,13 +358,13 @@
|
|||||||
</Grid>
|
</Grid>
|
||||||
</Border>
|
</Border>
|
||||||
<Border x:Name="SelectedLeftIndicator"
|
<Border x:Name="SelectedLeftIndicator"
|
||||||
BorderBrush="{ThemeResource ListViewItemSelectedBackgroundThemeBrush}"
|
BorderBrush="{ThemeResource MainColor}"
|
||||||
BorderThickness="5,0,0,0"
|
BorderThickness="5,0,0,0"
|
||||||
Opacity="0"/>
|
Opacity="0"/>
|
||||||
<Rectangle x:Name="SelectedBorder"
|
<Rectangle x:Name="SelectedBorder"
|
||||||
IsHitTestVisible="False"
|
IsHitTestVisible="False"
|
||||||
Opacity="0"
|
Opacity="0"
|
||||||
Stroke="{ThemeResource ListViewItemSelectedBackgroundThemeBrush}"
|
Stroke="{ThemeResource MainColor}"
|
||||||
StrokeThickness="{ThemeResource ListViewItemSelectedBorderThemeThickness}"
|
StrokeThickness="{ThemeResource ListViewItemSelectedBorderThemeThickness}"
|
||||||
Margin="0" />
|
Margin="0" />
|
||||||
<Border x:Name="SelectedCheckMarkOuter"
|
<Border x:Name="SelectedCheckMarkOuter"
|
||||||
@@ -375,7 +373,7 @@
|
|||||||
VerticalAlignment="Top"
|
VerticalAlignment="Top"
|
||||||
Margin="4">
|
Margin="4">
|
||||||
<Grid x:Name="SelectedCheckMark" Opacity="0" Height="40" Width="40">
|
<Grid x:Name="SelectedCheckMark" Opacity="0" Height="40" Width="40">
|
||||||
<Path x:Name="SelectedEarmark" Data="M0,0 L40,0 L40,40 z" Fill="{ThemeResource ListViewItemSelectedBackgroundThemeBrush}" Stretch="Fill"/>
|
<Path x:Name="SelectedEarmark" Data="M0,0 L40,0 L40,40 z" Fill="{ThemeResource MainColor}" Stretch="Fill"/>
|
||||||
<Path Data="F1 M133.1,17.9 L137.2,13.2 L144.6,19.6 L156.4,5.8 L161.2,9.9 L145.6,28.4 z" Fill="{ThemeResource ListViewItemCheckThemeBrush}" Height="13" Stretch="Fill" Width="15" HorizontalAlignment="Right" Margin="0,5.5,5.5,0" VerticalAlignment="Top" FlowDirection="LeftToRight"/>
|
<Path Data="F1 M133.1,17.9 L137.2,13.2 L144.6,19.6 L156.4,5.8 L161.2,9.9 L145.6,28.4 z" Fill="{ThemeResource ListViewItemCheckThemeBrush}" Height="13" Stretch="Fill" Width="15" HorizontalAlignment="Right" Margin="0,5.5,5.5,0" VerticalAlignment="Top" FlowDirection="LeftToRight"/>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Border>
|
</Border>
|
@@ -1,7 +1,6 @@
|
|||||||
<ResourceDictionary
|
<ResourceDictionary
|
||||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||||
xmlns:local="using:ModernKeePass.Styles">
|
|
||||||
<!-- Default style for Windows.UI.Xaml.Controls.Button -->
|
<!-- Default style for Windows.UI.Xaml.Controls.Button -->
|
||||||
<Style TargetType="Button" x:Key="NoBorderButtonStyle">
|
<Style TargetType="Button" x:Key="NoBorderButtonStyle">
|
||||||
<Setter Property="Background" Value="{ThemeResource ButtonBackgroundThemeBrush}" />
|
<Setter Property="Background" Value="{ThemeResource ButtonBackgroundThemeBrush}" />
|
||||||
@@ -49,7 +48,7 @@
|
|||||||
<Storyboard>
|
<Storyboard>
|
||||||
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
|
||||||
Storyboard.TargetProperty="Background">
|
Storyboard.TargetProperty="Background">
|
||||||
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonDisabledBackgroundThemeBrush}" />
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource AppBarBackgroundThemeBrush}" />
|
||||||
</ObjectAnimationUsingKeyFrames>
|
</ObjectAnimationUsingKeyFrames>
|
||||||
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
|
||||||
Storyboard.TargetProperty="BorderBrush">
|
Storyboard.TargetProperty="BorderBrush">
|
@@ -0,0 +1,204 @@
|
|||||||
|
<ResourceDictionary
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||||
|
|
||||||
|
<!-- No border style for Windows.UI.Xaml.Controls.Primitives.ToggleButton -->
|
||||||
|
<Style TargetType="ToggleButton" x:Key="NoBorderToggleButtonStyle">
|
||||||
|
<Setter Property="Background" Value="{ThemeResource ToggleButtonBackgroundThemeBrush}" />
|
||||||
|
<Setter Property="Foreground" Value="{ThemeResource ToggleButtonForegroundThemeBrush}"/>
|
||||||
|
<Setter Property="BorderBrush" Value="{ThemeResource ToggleButtonBorderThemeBrush}" />
|
||||||
|
<Setter Property="BorderThickness" Value="{ThemeResource ToggleButtonBorderThemeThickness}" />
|
||||||
|
<Setter Property="Padding" Value="12,4,12,5" />
|
||||||
|
<Setter Property="HorizontalAlignment" Value="Left" />
|
||||||
|
<Setter Property="VerticalAlignment" Value="Center" />
|
||||||
|
<Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}" />
|
||||||
|
<Setter Property="FontWeight" Value="SemiBold" />
|
||||||
|
<Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}" />
|
||||||
|
<Setter Property="Template">
|
||||||
|
<Setter.Value>
|
||||||
|
<ControlTemplate TargetType="ToggleButton">
|
||||||
|
<Grid>
|
||||||
|
<VisualStateManager.VisualStateGroups>
|
||||||
|
<VisualStateGroup x:Name="CommonStates">
|
||||||
|
<VisualState x:Name="Normal" />
|
||||||
|
<VisualState x:Name="PointerOver">
|
||||||
|
<Storyboard>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
|
||||||
|
Storyboard.TargetProperty="Background">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonPointerOverBackgroundThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
<VisualState x:Name="Pressed">
|
||||||
|
<Storyboard>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
|
||||||
|
Storyboard.TargetProperty="Background">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonPressedBackgroundThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
|
||||||
|
Storyboard.TargetProperty="Foreground">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonPressedForegroundThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
<VisualState x:Name="Disabled">
|
||||||
|
<Storyboard>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
|
||||||
|
Storyboard.TargetProperty="BorderBrush">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonDisabledBorderThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
|
||||||
|
Storyboard.TargetProperty="Foreground">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonDisabledForegroundThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
<VisualState x:Name="Checked">
|
||||||
|
<Storyboard>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
|
||||||
|
Storyboard.TargetProperty="Background">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonCheckedBackgroundThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
|
||||||
|
Storyboard.TargetProperty="BorderBrush">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonCheckedBorderThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
|
||||||
|
Storyboard.TargetProperty="Foreground">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonCheckedForegroundThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
<VisualState x:Name="CheckedPointerOver">
|
||||||
|
<Storyboard>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
|
||||||
|
Storyboard.TargetProperty="Background">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonCheckedPointerOverBackgroundThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
|
||||||
|
Storyboard.TargetProperty="BorderBrush">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonCheckedPointerOverBorderThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
|
||||||
|
Storyboard.TargetProperty="Foreground">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonCheckedForegroundThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
<VisualState x:Name="CheckedPressed">
|
||||||
|
<Storyboard>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
|
||||||
|
Storyboard.TargetProperty="Background">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonCheckedPressedBackgroundThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
|
||||||
|
Storyboard.TargetProperty="BorderBrush">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonCheckedPressedBorderThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
|
||||||
|
Storyboard.TargetProperty="Foreground">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonCheckedPressedForegroundThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
<VisualState x:Name="CheckedDisabled">
|
||||||
|
<Storyboard>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
|
||||||
|
Storyboard.TargetProperty="Background">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonCheckedDisabledBackgroundThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
|
||||||
|
Storyboard.TargetProperty="BorderBrush">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonDisabledBorderThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
|
||||||
|
Storyboard.TargetProperty="Foreground">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonCheckedDisabledForegroundThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
<VisualState x:Name="Indeterminate" />
|
||||||
|
<VisualState x:Name="IndeterminatePointerOver">
|
||||||
|
<Storyboard>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
|
||||||
|
Storyboard.TargetProperty="Background">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonPointerOverBackgroundThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
<VisualState x:Name="IndeterminatePressed">
|
||||||
|
<Storyboard>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
|
||||||
|
Storyboard.TargetProperty="Background">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonPressedBackgroundThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
|
||||||
|
Storyboard.TargetProperty="Foreground">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonPressedForegroundThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
<VisualState x:Name="IndeterminateDisabled">
|
||||||
|
<Storyboard>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
|
||||||
|
Storyboard.TargetProperty="BorderBrush">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonDisabledBorderThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
|
||||||
|
Storyboard.TargetProperty="Foreground">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ToggleButtonDisabledForegroundThemeBrush}" />
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
</VisualStateGroup>
|
||||||
|
<VisualStateGroup x:Name="FocusStates">
|
||||||
|
<VisualState x:Name="Focused">
|
||||||
|
<Storyboard>
|
||||||
|
<DoubleAnimation Storyboard.TargetName="FocusVisualWhite"
|
||||||
|
Storyboard.TargetProperty="Opacity"
|
||||||
|
To="1"
|
||||||
|
Duration="0" />
|
||||||
|
<DoubleAnimation Storyboard.TargetName="FocusVisualBlack"
|
||||||
|
Storyboard.TargetProperty="Opacity"
|
||||||
|
To="1"
|
||||||
|
Duration="0" />
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
<VisualState x:Name="Unfocused" />
|
||||||
|
<VisualState x:Name="PointerFocused" />
|
||||||
|
</VisualStateGroup>
|
||||||
|
</VisualStateManager.VisualStateGroups>
|
||||||
|
<Border x:Name="Border"
|
||||||
|
Background="{TemplateBinding Background}"
|
||||||
|
BorderBrush="{TemplateBinding BorderBrush}"
|
||||||
|
BorderThickness="0"
|
||||||
|
Margin="0">
|
||||||
|
<ContentPresenter x:Name="ContentPresenter"
|
||||||
|
Content="{TemplateBinding Content}"
|
||||||
|
ContentTransitions="{TemplateBinding ContentTransitions}"
|
||||||
|
ContentTemplate="{TemplateBinding ContentTemplate}"
|
||||||
|
Margin="{TemplateBinding Padding}"
|
||||||
|
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
|
||||||
|
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
|
||||||
|
AutomationProperties.AccessibilityView="Raw"/>
|
||||||
|
</Border>
|
||||||
|
<Rectangle x:Name="FocusVisualWhite"
|
||||||
|
IsHitTestVisible="False"
|
||||||
|
Stroke="{ThemeResource FocusVisualWhiteStrokeThemeBrush}"
|
||||||
|
StrokeEndLineCap="Square"
|
||||||
|
StrokeDashArray="1,1"
|
||||||
|
Opacity="0"
|
||||||
|
StrokeDashOffset="1.5" />
|
||||||
|
<Rectangle x:Name="FocusVisualBlack"
|
||||||
|
IsHitTestVisible="False"
|
||||||
|
Stroke="{ThemeResource FocusVisualBlackStrokeThemeBrush}"
|
||||||
|
StrokeEndLineCap="Square"
|
||||||
|
StrokeDashArray="1,1"
|
||||||
|
Opacity="0"
|
||||||
|
StrokeDashOffset="0.5" />
|
||||||
|
</Grid>
|
||||||
|
</ControlTemplate>
|
||||||
|
</Setter.Value>
|
||||||
|
</Setter>
|
||||||
|
</Style>
|
||||||
|
</ResourceDictionary>
|
1236
ModernKeePass/ResourceDictionaries/Styles.xaml
Normal file
1236
ModernKeePass/ResourceDictionaries/Styles.xaml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -62,7 +62,7 @@
|
|||||||
</ObjectAnimationUsingKeyFrames>
|
</ObjectAnimationUsingKeyFrames>
|
||||||
</Storyboard>
|
</Storyboard>
|
||||||
</VisualState>
|
</VisualState>
|
||||||
<VisualState x:Name="Disabled">
|
<!--<VisualState x:Name="Disabled">
|
||||||
<Storyboard>
|
<Storyboard>
|
||||||
<DoubleAnimation Storyboard.TargetName="BackgroundElement"
|
<DoubleAnimation Storyboard.TargetName="BackgroundElement"
|
||||||
Storyboard.TargetProperty="Opacity"
|
Storyboard.TargetProperty="Opacity"
|
||||||
@@ -73,7 +73,7 @@
|
|||||||
To="0"
|
To="0"
|
||||||
Duration="0" />
|
Duration="0" />
|
||||||
</Storyboard>
|
</Storyboard>
|
||||||
</VisualState>
|
</VisualState>-->
|
||||||
</VisualStateGroup>
|
</VisualStateGroup>
|
||||||
</VisualStateManager.VisualStateGroups>
|
</VisualStateManager.VisualStateGroups>
|
||||||
<Border x:Name="BorderElement"
|
<Border x:Name="BorderElement"
|
||||||
@@ -89,6 +89,7 @@
|
|||||||
HorizontalAlignment="Center"
|
HorizontalAlignment="Center"
|
||||||
FontStyle="Normal"
|
FontStyle="Normal"
|
||||||
Text="{TemplateBinding Content}"
|
Text="{TemplateBinding Content}"
|
||||||
|
FontSize="{TemplateBinding FontSize}"
|
||||||
FontFamily="{ThemeResource SymbolThemeFontFamily}"
|
FontFamily="{ThemeResource SymbolThemeFontFamily}"
|
||||||
AutomationProperties.AccessibilityView="Raw"/>
|
AutomationProperties.AccessibilityView="Raw"/>
|
||||||
</Border>
|
</Border>
|
||||||
@@ -142,9 +143,28 @@
|
|||||||
Storyboard.TargetProperty="Opacity"
|
Storyboard.TargetProperty="Opacity"
|
||||||
Duration="0"
|
Duration="0"
|
||||||
To="{ThemeResource TextControlPointerOverBorderThemeOpacity}" />
|
To="{ThemeResource TextControlPointerOverBorderThemeOpacity}" />
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ActionButton"
|
||||||
|
Storyboard.TargetProperty="Visibility">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0">
|
||||||
|
<DiscreteObjectKeyFrame.Value>
|
||||||
|
<Visibility>Visible</Visibility>
|
||||||
|
</DiscreteObjectKeyFrame.Value>
|
||||||
|
</DiscreteObjectKeyFrame>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
<VisualState x:Name="Focused">
|
||||||
|
<Storyboard>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ActionButton"
|
||||||
|
Storyboard.TargetProperty="Visibility">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0">
|
||||||
|
<DiscreteObjectKeyFrame.Value>
|
||||||
|
<Visibility>Visible</Visibility>
|
||||||
|
</DiscreteObjectKeyFrame.Value>
|
||||||
|
</DiscreteObjectKeyFrame>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
</Storyboard>
|
</Storyboard>
|
||||||
</VisualState>
|
</VisualState>
|
||||||
<VisualState x:Name="Focused" />
|
|
||||||
</VisualStateGroup>
|
</VisualStateGroup>
|
||||||
<VisualStateGroup x:Name="ButtonStates">
|
<VisualStateGroup x:Name="ButtonStates">
|
||||||
<VisualState x:Name="ButtonVisible">
|
<VisualState x:Name="ButtonVisible">
|
||||||
@@ -199,6 +219,7 @@
|
|||||||
IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}"
|
IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}"
|
||||||
IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}"
|
IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}"
|
||||||
IsDeferredScrollingEnabled="{TemplateBinding ScrollViewer.IsDeferredScrollingEnabled}"
|
IsDeferredScrollingEnabled="{TemplateBinding ScrollViewer.IsDeferredScrollingEnabled}"
|
||||||
|
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
|
||||||
Margin="{TemplateBinding BorderThickness}"
|
Margin="{TemplateBinding BorderThickness}"
|
||||||
Padding="{TemplateBinding Padding}"
|
Padding="{TemplateBinding Padding}"
|
||||||
IsTabStop="False"
|
IsTabStop="False"
|
||||||
@@ -209,6 +230,7 @@
|
|||||||
Foreground="{ThemeResource TextBoxPlaceholderTextThemeBrush}"
|
Foreground="{ThemeResource TextBoxPlaceholderTextThemeBrush}"
|
||||||
Margin="{TemplateBinding BorderThickness}"
|
Margin="{TemplateBinding BorderThickness}"
|
||||||
Padding="{TemplateBinding Padding}"
|
Padding="{TemplateBinding Padding}"
|
||||||
|
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
|
||||||
IsTabStop="False"
|
IsTabStop="False"
|
||||||
Grid.ColumnSpan="2"
|
Grid.ColumnSpan="2"
|
||||||
Content="{TemplateBinding PlaceholderText}"
|
Content="{TemplateBinding PlaceholderText}"
|
||||||
@@ -222,7 +244,12 @@
|
|||||||
Visibility="Collapsed"
|
Visibility="Collapsed"
|
||||||
FontSize="{TemplateBinding FontSize}"
|
FontSize="{TemplateBinding FontSize}"
|
||||||
Content="{TemplateBinding ButtonSymbol}"
|
Content="{TemplateBinding ButtonSymbol}"
|
||||||
VerticalAlignment="Stretch"/>
|
IsEnabled="{TemplateBinding IsButtonEnabled}"
|
||||||
|
VerticalAlignment="Stretch">
|
||||||
|
<ToolTipService.ToolTip>
|
||||||
|
<ToolTip Content="{TemplateBinding ButtonTooltip}" />
|
||||||
|
</ToolTipService.ToolTip>
|
||||||
|
</Button>
|
||||||
</Grid>
|
</Grid>
|
||||||
</ControlTemplate>
|
</ControlTemplate>
|
||||||
</Setter.Value>
|
</Setter.Value>
|
226
ModernKeePass/Services/DatabaseService.cs
Normal file
226
ModernKeePass/Services/DatabaseService.cs
Normal file
@@ -0,0 +1,226 @@
|
|||||||
|
using System;
|
||||||
|
using Windows.Storage;
|
||||||
|
using Microsoft.HockeyApp;
|
||||||
|
using ModernKeePass.Exceptions;
|
||||||
|
using ModernKeePass.Interfaces;
|
||||||
|
using ModernKeePass.ViewModels;
|
||||||
|
using ModernKeePassLib;
|
||||||
|
using ModernKeePassLib.Collections;
|
||||||
|
using ModernKeePassLib.Cryptography.KeyDerivation;
|
||||||
|
using ModernKeePassLib.Interfaces;
|
||||||
|
using ModernKeePassLib.Keys;
|
||||||
|
using ModernKeePassLib.Security;
|
||||||
|
using ModernKeePassLib.Serialization;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Services
|
||||||
|
{
|
||||||
|
public class DatabaseService: SingletonServiceBase<DatabaseService>, IDatabaseService
|
||||||
|
{
|
||||||
|
private readonly PwDatabase _pwDatabase = new PwDatabase();
|
||||||
|
private readonly ISettingsService _settings;
|
||||||
|
private StorageFile _databaseFile;
|
||||||
|
private GroupVm _recycleBin;
|
||||||
|
private CompositeKey _compositeKey;
|
||||||
|
|
||||||
|
public GroupVm RootGroup { get; set; }
|
||||||
|
|
||||||
|
public GroupVm RecycleBin
|
||||||
|
{
|
||||||
|
get { return _recycleBin; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_recycleBin = value;
|
||||||
|
_pwDatabase.RecycleBinUuid = _recycleBin?.IdUuid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Name => _databaseFile?.Name;
|
||||||
|
|
||||||
|
public bool RecycleBinEnabled
|
||||||
|
{
|
||||||
|
get { return _pwDatabase.RecycleBinEnabled; }
|
||||||
|
set { _pwDatabase.RecycleBinEnabled = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public PwUuid DataCipher
|
||||||
|
{
|
||||||
|
get { return _pwDatabase.DataCipherUuid; }
|
||||||
|
set { _pwDatabase.DataCipherUuid = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public PwCompressionAlgorithm CompressionAlgorithm
|
||||||
|
{
|
||||||
|
get { return _pwDatabase.Compression; }
|
||||||
|
set { _pwDatabase.Compression = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public KdfParameters KeyDerivation
|
||||||
|
{
|
||||||
|
get { return _pwDatabase.KdfParameters; }
|
||||||
|
set { _pwDatabase.KdfParameters = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsOpen => _pwDatabase.IsOpen;
|
||||||
|
public bool IsFileOpen => !_pwDatabase.IsOpen && _databaseFile != null;
|
||||||
|
public bool IsClosed => _databaseFile == null;
|
||||||
|
public bool HasChanged { get; set; }
|
||||||
|
|
||||||
|
public DatabaseService() : this(SettingsService.Instance)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public DatabaseService(ISettingsService settings)
|
||||||
|
{
|
||||||
|
_settings = settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Open a KeePass database
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="databaseFile">The database file</param>
|
||||||
|
/// <param name="key">The database composite key</param>
|
||||||
|
/// <param name="createNew">True to create a new database before opening it</param>
|
||||||
|
/// <returns>An error message, if any</returns>
|
||||||
|
public void Open(StorageFile databaseFile, CompositeKey key, bool createNew = false)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (databaseFile == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(databaseFile));
|
||||||
|
}
|
||||||
|
if (key == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
_compositeKey = key;
|
||||||
|
var ioConnection = IOConnectionInfo.FromFile(databaseFile);
|
||||||
|
if (createNew)
|
||||||
|
{
|
||||||
|
_pwDatabase.New(ioConnection, key);
|
||||||
|
|
||||||
|
//Get settings default values
|
||||||
|
if (_settings.GetSetting<bool>("Sample")) CreateSampleData();
|
||||||
|
var fileFormat = _settings.GetSetting<string>("DefaultFileFormat");
|
||||||
|
switch (fileFormat)
|
||||||
|
{
|
||||||
|
case "4":
|
||||||
|
KeyDerivation = KdfPool.Get("Argon2").GetDefaultParameters();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else _pwDatabase.Open(ioConnection, key, new NullStatusLogger());
|
||||||
|
|
||||||
|
_databaseFile = databaseFile;
|
||||||
|
RootGroup = new GroupVm(_pwDatabase.RootGroup, null, RecycleBinEnabled ? _pwDatabase.RecycleBinUuid : null);
|
||||||
|
}
|
||||||
|
catch (InvalidCompositeKeyException ex)
|
||||||
|
{
|
||||||
|
HockeyClient.Current.TrackException(ex);
|
||||||
|
throw new ArgumentException(ex.Message, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ReOpen()
|
||||||
|
{
|
||||||
|
Open(_databaseFile, _compositeKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Commit the changes to the currently opened database to file
|
||||||
|
/// </summary>
|
||||||
|
public void Save()
|
||||||
|
{
|
||||||
|
if (!IsOpen) return;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_pwDatabase.Save(new NullStatusLogger());
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
throw new SaveException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Save the current database to another file and open it
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="file">The new database file</param>
|
||||||
|
public void Save(StorageFile file)
|
||||||
|
{
|
||||||
|
var oldFile = _databaseFile;
|
||||||
|
_databaseFile = file;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_pwDatabase.SaveAs(IOConnectionInfo.FromFile(_databaseFile), true, new NullStatusLogger());
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
_databaseFile = oldFile;
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Close the currently opened database
|
||||||
|
/// </summary>
|
||||||
|
public void Close(bool releaseFile = true)
|
||||||
|
{
|
||||||
|
_pwDatabase?.Close();
|
||||||
|
if (releaseFile) _databaseFile = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddDeletedItem(PwUuid id)
|
||||||
|
{
|
||||||
|
_pwDatabase.DeletedObjects.Add(new PwDeletedObject(id, DateTime.UtcNow));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CreateRecycleBin(string title)
|
||||||
|
{
|
||||||
|
RecycleBin = RootGroup.AddNewGroup(title);
|
||||||
|
RecycleBin.IsSelected = true;
|
||||||
|
RecycleBin.IconId = (int)PwIcon.TrashBin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateCompositeKey(CompositeKey newCompositeKey)
|
||||||
|
{
|
||||||
|
if (newCompositeKey == null) return;
|
||||||
|
_compositeKey = newCompositeKey;
|
||||||
|
_pwDatabase.MasterKey = newCompositeKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CreateSampleData()
|
||||||
|
{
|
||||||
|
_pwDatabase.RootGroup.AddGroup(new PwGroup(true, true, "Banking", PwIcon.Count), true);
|
||||||
|
_pwDatabase.RootGroup.AddGroup(new PwGroup(true, true, "Email", PwIcon.EMail), true);
|
||||||
|
_pwDatabase.RootGroup.AddGroup(new PwGroup(true, true, "Internet", PwIcon.World), true);
|
||||||
|
|
||||||
|
var pe = new PwEntry(true, true);
|
||||||
|
pe.Strings.Set(PwDefs.TitleField, new ProtectedString(_pwDatabase.MemoryProtection.ProtectTitle,
|
||||||
|
"Sample Entry"));
|
||||||
|
pe.Strings.Set(PwDefs.UserNameField, new ProtectedString(_pwDatabase.MemoryProtection.ProtectUserName,
|
||||||
|
"Username"));
|
||||||
|
pe.Strings.Set(PwDefs.UrlField, new ProtectedString(_pwDatabase.MemoryProtection.ProtectUrl,
|
||||||
|
PwDefs.HomepageUrl));
|
||||||
|
pe.Strings.Set(PwDefs.PasswordField, new ProtectedString(_pwDatabase.MemoryProtection.ProtectPassword,
|
||||||
|
"Password"));
|
||||||
|
pe.Strings.Set(PwDefs.NotesField, new ProtectedString(_pwDatabase.MemoryProtection.ProtectNotes,
|
||||||
|
"You may safely delete this sample"));
|
||||||
|
_pwDatabase.RootGroup.AddEntry(pe, true);
|
||||||
|
|
||||||
|
pe = new PwEntry(true, true);
|
||||||
|
pe.Strings.Set(PwDefs.TitleField, new ProtectedString(_pwDatabase.MemoryProtection.ProtectTitle,
|
||||||
|
"Sample Entry #2"));
|
||||||
|
pe.Strings.Set(PwDefs.UserNameField, new ProtectedString(_pwDatabase.MemoryProtection.ProtectUserName,
|
||||||
|
"Michael321"));
|
||||||
|
pe.Strings.Set(PwDefs.UrlField, new ProtectedString(_pwDatabase.MemoryProtection.ProtectUrl,
|
||||||
|
PwDefs.HelpUrl + "kb/testform.html"));
|
||||||
|
pe.Strings.Set(PwDefs.PasswordField, new ProtectedString(_pwDatabase.MemoryProtection.ProtectPassword,
|
||||||
|
"12345"));
|
||||||
|
pe.AutoType.Add(new AutoTypeAssociation("*Test Form - KeePass*", string.Empty));
|
||||||
|
_pwDatabase.RootGroup.AddEntry(pe, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
50
ModernKeePass/Services/RecentService.cs
Normal file
50
ModernKeePass/Services/RecentService.cs
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using ModernKeePass.Interfaces;
|
||||||
|
using Windows.Storage;
|
||||||
|
using Windows.Storage.AccessCache;
|
||||||
|
using ModernKeePass.ViewModels;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Services
|
||||||
|
{
|
||||||
|
public class RecentService : SingletonServiceBase<RecentService>, IRecentService
|
||||||
|
{
|
||||||
|
private readonly StorageItemMostRecentlyUsedList _mru = StorageApplicationPermissions.MostRecentlyUsedList;
|
||||||
|
|
||||||
|
public int EntryCount => _mru.Entries.Count;
|
||||||
|
|
||||||
|
public ObservableCollection<IRecentItem> GetAllFiles(bool removeIfNonExistant = true)
|
||||||
|
{
|
||||||
|
var result = new ObservableCollection<IRecentItem>();
|
||||||
|
foreach (var entry in _mru.Entries)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var file = _mru.GetFileAsync(entry.Token, AccessCacheOptions.SuppressAccessTimeUpdate).GetAwaiter().GetResult();
|
||||||
|
result.Add(new RecentItemVm(entry.Token, entry.Metadata, file));
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
if (removeIfNonExistant) _mru.Remove(entry.Token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Add(IStorageItem file, string metadata)
|
||||||
|
{
|
||||||
|
_mru.Add(file, metadata);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ClearAll()
|
||||||
|
{
|
||||||
|
_mru.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IStorageItem> GetFileAsync(string token)
|
||||||
|
{
|
||||||
|
return await _mru.GetFileAsync(token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
17
ModernKeePass/Services/ResourcesService.cs
Normal file
17
ModernKeePass/Services/ResourcesService.cs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
using Windows.ApplicationModel.Resources;
|
||||||
|
using ModernKeePass.Interfaces;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Services
|
||||||
|
{
|
||||||
|
public class ResourcesService: IResourceService
|
||||||
|
{
|
||||||
|
private const string ResourceFileName = "CodeBehind";
|
||||||
|
private readonly ResourceLoader _resourceLoader = ResourceLoader.GetForCurrentView();
|
||||||
|
|
||||||
|
public string GetResourceValue(string key)
|
||||||
|
{
|
||||||
|
var resource = _resourceLoader.GetString($"/{ResourceFileName}/{key}");
|
||||||
|
return resource;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
31
ModernKeePass/Services/SettingsService.cs
Normal file
31
ModernKeePass/Services/SettingsService.cs
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
using System;
|
||||||
|
using Windows.Foundation.Collections;
|
||||||
|
using Windows.Storage;
|
||||||
|
using ModernKeePass.Interfaces;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Services
|
||||||
|
{
|
||||||
|
public class SettingsService : SingletonServiceBase<SettingsService>, ISettingsService
|
||||||
|
{
|
||||||
|
private readonly IPropertySet _values = ApplicationData.Current.LocalSettings.Values;
|
||||||
|
|
||||||
|
public T GetSetting<T>(string property, T defaultValue = default(T))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return (T)Convert.ChangeType(_values[property], typeof(T));
|
||||||
|
}
|
||||||
|
catch (InvalidCastException)
|
||||||
|
{
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PutSetting<T>(string property, T value)
|
||||||
|
{
|
||||||
|
if (_values.ContainsKey(property))
|
||||||
|
_values[property] = value;
|
||||||
|
else _values.Add(property, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
14
ModernKeePass/Services/SingletonServiceBase.cs
Normal file
14
ModernKeePass/Services/SingletonServiceBase.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace ModernKeePass.Services
|
||||||
|
{
|
||||||
|
public abstract class SingletonServiceBase<T> where T : new()
|
||||||
|
{
|
||||||
|
protected SingletonServiceBase() { }
|
||||||
|
|
||||||
|
private static readonly Lazy<T> LazyInstance =
|
||||||
|
new Lazy<T>(() => new T());
|
||||||
|
|
||||||
|
public static T Instance => LazyInstance.Value;
|
||||||
|
}
|
||||||
|
}
|
300
ModernKeePass/Strings/en-US/CodeBehind.resw
Normal file
300
ModernKeePass/Strings/en-US/CodeBehind.resw
Normal file
@@ -0,0 +1,300 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<data name="CompositeKeyDefaultKeyFile" xml:space="preserve">
|
||||||
|
<value>Select key file from disk...</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyErrorOpen" xml:space="preserve">
|
||||||
|
<value>Error: </value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyErrorUserKeyFile" xml:space="preserve">
|
||||||
|
<value>- wrong key file</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyErrorUserPassword" xml:space="preserve">
|
||||||
|
<value>- password incorrect</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyOpening" xml:space="preserve">
|
||||||
|
<value>Opening...</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyUpdated" xml:space="preserve">
|
||||||
|
<value>Database composite key updated.</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateAlreadyPurchasedMessage" xml:space="preserve">
|
||||||
|
<value>Your product has already been purchased.</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateAlreadyPurchasedTitle" xml:space="preserve">
|
||||||
|
<value>Purchase</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateNothingToFulfillMessage" xml:space="preserve">
|
||||||
|
<value>No purchased product to fulfill</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateNothingToFulfillTitle" xml:space="preserve">
|
||||||
|
<value>Fulfillment</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateNotPurchasedMessage" xml:space="preserve">
|
||||||
|
<value>The purchase failed because we haven't confirmed fulfillment of a previous purchase.</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateNotPurchasedTitle" xml:space="preserve">
|
||||||
|
<value>Purchase</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonatePurchasePendingMessage" xml:space="preserve">
|
||||||
|
<value>The purchase is pending so we cannot fulfill the product.</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonatePurchasePendingTitle" xml:space="preserve">
|
||||||
|
<value>Purchase</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonatePurchaseRevertedMessage" xml:space="preserve">
|
||||||
|
<value>Your purchase has been reverted.</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonatePurchaseRevertedTitle" xml:space="preserve">
|
||||||
|
<value>Purchase</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateServerErrorMessage" xml:space="preserve">
|
||||||
|
<value>Impossible to contact the Windows Store, there was an error when fulfilling.</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateServerErrorTitle" xml:space="preserve">
|
||||||
|
<value>Error</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateSucceededMessage" xml:space="preserve">
|
||||||
|
<value>Your donation was successful.</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateSucceededTitle" xml:space="preserve">
|
||||||
|
<value>Thank you!</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntityDeleteActionButton" xml:space="preserve">
|
||||||
|
<value>Delete</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntityDeleteCancelButton" xml:space="preserve">
|
||||||
|
<value>Cancel</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntityDeleteTitle" xml:space="preserve">
|
||||||
|
<value>Warning</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntityDeleting" xml:space="preserve">
|
||||||
|
<value>Deleting</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntityRestoredTitle" xml:space="preserve">
|
||||||
|
<value>Restored</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryDeleted" xml:space="preserve">
|
||||||
|
<value>Entry permanently removed</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryDeletingConfirmation" xml:space="preserve">
|
||||||
|
<value>Are you sure you want to delete this entry?</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryRecycled" xml:space="preserve">
|
||||||
|
<value>Entry moved to the Recycle bin</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryRecyclingConfirmation" xml:space="preserve">
|
||||||
|
<value>Are you sure you want to send this entry to the recycle bin?</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryRestored" xml:space="preserve">
|
||||||
|
<value>Entry returned to its original group</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupDeleted" xml:space="preserve">
|
||||||
|
<value>Group permanently removed</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupDeletingConfirmation" xml:space="preserve">
|
||||||
|
<value>Are you sure you want to delete the whole group and all its entries?</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupRecycled" xml:space="preserve">
|
||||||
|
<value>Group moved to the Recycle bin</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupRecyclingConfirmation" xml:space="preserve">
|
||||||
|
<value>Are you sure you want to send the whole group and all its entries to the recycle bin?</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupRestored" xml:space="preserve">
|
||||||
|
<value>Group returned to its original group</value>
|
||||||
|
</data>
|
||||||
|
<data name="MainMenuItemAbout" xml:space="preserve">
|
||||||
|
<value>About</value>
|
||||||
|
</data>
|
||||||
|
<data name="MainMenuItemDonate" xml:space="preserve">
|
||||||
|
<value>Donate</value>
|
||||||
|
</data>
|
||||||
|
<data name="MainMenuItemNew" xml:space="preserve">
|
||||||
|
<value>New</value>
|
||||||
|
</data>
|
||||||
|
<data name="MainMenuItemOpen" xml:space="preserve">
|
||||||
|
<value>Open</value>
|
||||||
|
</data>
|
||||||
|
<data name="MainMenuItemRecent" xml:space="preserve">
|
||||||
|
<value>Recent</value>
|
||||||
|
</data>
|
||||||
|
<data name="MainMenuItemSave" xml:space="preserve">
|
||||||
|
<value>Save</value>
|
||||||
|
</data>
|
||||||
|
<data name="MainMenuItemSettings" xml:space="preserve">
|
||||||
|
<value>Settings</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsMenuGroupApplication" xml:space="preserve">
|
||||||
|
<value>Application</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsMenuGroupDatabase" xml:space="preserve">
|
||||||
|
<value>Database</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsMenuItemGeneral" xml:space="preserve">
|
||||||
|
<value>General</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsMenuItemNew" xml:space="preserve">
|
||||||
|
<value>New</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsMenuItemSecurity" xml:space="preserve">
|
||||||
|
<value>Security</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyErrorUserAccount" xml:space="preserve">
|
||||||
|
<value>- user account</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsMenuItemSave" xml:space="preserve">
|
||||||
|
<value>Saving</value>
|
||||||
|
</data>
|
||||||
|
<data name="RecycleBinTitle" xml:space="preserve">
|
||||||
|
<value>Recycle Bin</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryCurrent" xml:space="preserve">
|
||||||
|
<value>Current</value>
|
||||||
|
</data>
|
||||||
|
<data name="MessageDialogDBOpenButtonDiscard" xml:space="preserve">
|
||||||
|
<value>Discard</value>
|
||||||
|
</data>
|
||||||
|
<data name="MessageDialogDBOpenButtonSave" xml:space="preserve">
|
||||||
|
<value>Save changes</value>
|
||||||
|
</data>
|
||||||
|
<data name="MessageDialogDBOpenDesc" xml:space="preserve">
|
||||||
|
<value>Database {0} is currently opened. What would you wish to do?</value>
|
||||||
|
</data>
|
||||||
|
<data name="MessageDialogDBOpenTitle" xml:space="preserve">
|
||||||
|
<value>Opened database</value>
|
||||||
|
</data>
|
||||||
|
<data name="MessageDialogSaveErrorButtonDiscard" xml:space="preserve">
|
||||||
|
<value>Discard</value>
|
||||||
|
</data>
|
||||||
|
<data name="MessageDialogSaveErrorButtonSaveAs" xml:space="preserve">
|
||||||
|
<value>Save as</value>
|
||||||
|
</data>
|
||||||
|
<data name="MessageDialogSaveErrorFileTypeDesc" xml:space="preserve">
|
||||||
|
<value>KeePass 2.x database</value>
|
||||||
|
</data>
|
||||||
|
<data name="MessageDialogSaveErrorTitle" xml:space="preserve">
|
||||||
|
<value>Save error</value>
|
||||||
|
</data>
|
||||||
|
<data name="ToastSavedMessage" xml:space="preserve">
|
||||||
|
<value>Database successfully saved!</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
468
ModernKeePass/Strings/en-US/Resources.resw
Normal file
468
ModernKeePass/Strings/en-US/Resources.resw
Normal file
@@ -0,0 +1,468 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<data name="AboutCredits1.Text" xml:space="preserve">
|
||||||
|
<value>Dominik Reichl for the KeePass application and file format</value>
|
||||||
|
</data>
|
||||||
|
<data name="AboutCredits2.Text" xml:space="preserve">
|
||||||
|
<value>David Lechner for his PCL adapatation of the KeePass Library and his correlated tests</value>
|
||||||
|
</data>
|
||||||
|
<data name="AboutCreditsLabel.Text" xml:space="preserve">
|
||||||
|
<value>Credits</value>
|
||||||
|
</data>
|
||||||
|
<data name="AboutDesc.Text" xml:space="preserve">
|
||||||
|
<value>A modern password manager for the Windows Store</value>
|
||||||
|
</data>
|
||||||
|
<data name="AboutHomepage.Text" xml:space="preserve">
|
||||||
|
<value>Homepage:</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBarDelete.Label" xml:space="preserve">
|
||||||
|
<value>Delete</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBarEdit.Label" xml:space="preserve">
|
||||||
|
<value>Edit</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBarHome.Label" xml:space="preserve">
|
||||||
|
<value>Home</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBarRestore.Label" xml:space="preserve">
|
||||||
|
<value>Restore</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBarSave.Label" xml:space="preserve">
|
||||||
|
<value>Save</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBarSettings.Label" xml:space="preserve">
|
||||||
|
<value>Settings</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBarSort.Label" xml:space="preserve">
|
||||||
|
<value>Sort</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBarSortEntries.Text" xml:space="preserve">
|
||||||
|
<value>Entries</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBarSortGroups.Text" xml:space="preserve">
|
||||||
|
<value>Groups</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyNewButton.ButtonLabel" xml:space="preserve">
|
||||||
|
<value>Create</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyNewKeyFileTooltip.Content" xml:space="preserve">
|
||||||
|
<value>Create new key file</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyOpenButton.ButtonLabel" xml:space="preserve">
|
||||||
|
<value>Open</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyPassword.PlaceholderText" xml:space="preserve">
|
||||||
|
<value>Password</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyUserAccount.Text" xml:space="preserve">
|
||||||
|
<value>Windows User Account</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateButton.Content" xml:space="preserve">
|
||||||
|
<value>Donate</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateDesc.Text" xml:space="preserve">
|
||||||
|
<value>Like this app? Why not make a small donation to support my work and help me keep it ad-free :) ?</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryExpirationDate.Content" xml:space="preserve">
|
||||||
|
<value>Expiration date</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryExpirationTooltip.Content" xml:space="preserve">
|
||||||
|
<value>Password has expired</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryItemCopyLogin.Text" xml:space="preserve">
|
||||||
|
<value>Copy login</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryItemCopyPassword.Text" xml:space="preserve">
|
||||||
|
<value>Copy password</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryItemCopyUrl.Text" xml:space="preserve">
|
||||||
|
<value>Navigate to URL</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryLogin.Text" xml:space="preserve">
|
||||||
|
<value>User name or login</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryNotes.Text" xml:space="preserve">
|
||||||
|
<value>Notes</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryPassword.Text" xml:space="preserve">
|
||||||
|
<value>Password</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryShowPassword.Content" xml:space="preserve">
|
||||||
|
<value>Show password</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupCreateEntry.Text" xml:space="preserve">
|
||||||
|
<value>Create new entry</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupFilter.PlaceholderText" xml:space="preserve">
|
||||||
|
<value>Filter...</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupSearch.PlaceholderText" xml:space="preserve">
|
||||||
|
<value>Search...</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupTitle.PlaceholderText" xml:space="preserve">
|
||||||
|
<value>New group name...</value>
|
||||||
|
</data>
|
||||||
|
<data name="NewCreateButton.Content" xml:space="preserve">
|
||||||
|
<value>Create new...</value>
|
||||||
|
</data>
|
||||||
|
<data name="NewCreateDesc.Text" xml:space="preserve">
|
||||||
|
<value>Create a new password database to the location of your chosing.</value>
|
||||||
|
</data>
|
||||||
|
<data name="OpenBrowseButton.Content" xml:space="preserve">
|
||||||
|
<value>Browse files...</value>
|
||||||
|
</data>
|
||||||
|
<data name="OpenBrowseDesc.Text" xml:space="preserve">
|
||||||
|
<value>Open an existing password database from your PC.</value>
|
||||||
|
</data>
|
||||||
|
<data name="OpenUrlButton.Content" xml:space="preserve">
|
||||||
|
<value>From Url...</value>
|
||||||
|
</data>
|
||||||
|
<data name="OpenUrlDesc.Text" xml:space="preserve">
|
||||||
|
<value>Open an existing password database from an Internet location (not yet implemented).</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorAlso.Text" xml:space="preserve">
|
||||||
|
<value>Also add these characters:</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorBrackets.Content" xml:space="preserve">
|
||||||
|
<value>Brackets ([], {}, (), ...)</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorButton.Content" xml:space="preserve">
|
||||||
|
<value>Generate</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorDigits.Content" xml:space="preserve">
|
||||||
|
<value>Digits (0, 1, 2, ...)</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorLength.Text" xml:space="preserve">
|
||||||
|
<value>Password Length:</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorLower.Content" xml:space="preserve">
|
||||||
|
<value>Lower case (a, b, c, ...)</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorMinus.Content" xml:space="preserve">
|
||||||
|
<value>Minus (-)</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorSpace.Content" xml:space="preserve">
|
||||||
|
<value>Space ( )</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorSpecial.Content" xml:space="preserve">
|
||||||
|
<value>Special (!, $, %, ...)</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorTooltip.Content" xml:space="preserve">
|
||||||
|
<value>Generate password</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorUnderscore.Content" xml:space="preserve">
|
||||||
|
<value>Underscore (_)</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorUpper.Content" xml:space="preserve">
|
||||||
|
<value>Upper case (A, B, C, ...)</value>
|
||||||
|
</data>
|
||||||
|
<data name="RecentClear.Text" xml:space="preserve">
|
||||||
|
<value>Clear all</value>
|
||||||
|
</data>
|
||||||
|
<data name="ReorderEntriesLabel.Text" xml:space="preserve">
|
||||||
|
<value>Drag and drop entries to reorder them</value>
|
||||||
|
</data>
|
||||||
|
<data name="SaveAsButton.Content" xml:space="preserve">
|
||||||
|
<value>Save as...</value>
|
||||||
|
</data>
|
||||||
|
<data name="SaveAsDesc.Text" xml:space="preserve">
|
||||||
|
<value>This will save the currently opened database as a new file and leave it open.</value>
|
||||||
|
</data>
|
||||||
|
<data name="SaveButton.Content" xml:space="preserve">
|
||||||
|
<value>Save and close</value>
|
||||||
|
</data>
|
||||||
|
<data name="SaveDesc.Text" xml:space="preserve">
|
||||||
|
<value>This will save and close the currently opened database.</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsDatabaseCompression.Text" xml:space="preserve">
|
||||||
|
<value>Compression Algorithm</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsDatabaseEncryption.Text" xml:space="preserve">
|
||||||
|
<value>Encryption Algorithm</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsDatabaseKdf.Text" xml:space="preserve">
|
||||||
|
<value>Key Derivation Algorithm</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsDatabaseRecycleBin.Header" xml:space="preserve">
|
||||||
|
<value>Recycle bin</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsDatabaseRecycleBin.OffContent" xml:space="preserve">
|
||||||
|
<value>Disabled</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsDatabaseRecycleBin.OnContent" xml:space="preserve">
|
||||||
|
<value>Enabled</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsDatabaseRecycleBinCreate.Content" xml:space="preserve">
|
||||||
|
<value>Create a new group</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsDatabaseRecycleBinExisting.Content" xml:space="preserve">
|
||||||
|
<value>Use an existing group</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsNewDatabaseDesc.Text" xml:space="preserve">
|
||||||
|
<value>Here, you can change some default options when creating a database.</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsNewDatabaseKdf.Text" xml:space="preserve">
|
||||||
|
<value>KDBX database file version</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsNewDatabaseKdfMoreInfo.Text" xml:space="preserve">
|
||||||
|
<value>Higher is better, but there may be compatibility issues with older applications</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsNewDatabaseSample.Header" xml:space="preserve">
|
||||||
|
<value>Create sample data</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsNewDatabaseSample.OffContent" xml:space="preserve">
|
||||||
|
<value>No</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsNewDatabaseSample.OnContent" xml:space="preserve">
|
||||||
|
<value>Yes</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsSaveDatabaseSuspend.OffContent" xml:space="preserve">
|
||||||
|
<value>Don't save</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsSaveDatabaseSuspend.OnContent" xml:space="preserve">
|
||||||
|
<value>Save</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsSaveDatabaseSuspendDesc.Text" xml:space="preserve">
|
||||||
|
<value>This settings is generally recommended. If you enable it, database will automatically be saved on application suspension and closing. However, if your database is huge, saving may be deemed too long by Windows, which will then forcibly kill the app.</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsSaveDatabaseSuspendTitle.Text" xml:space="preserve">
|
||||||
|
<value>Auto-save on suspend?</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsSecurityDesc1.Text" xml:space="preserve">
|
||||||
|
<value>Here, you may change your database password, key file, or both. Just click on on</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsSecurityDesc2.Text" xml:space="preserve">
|
||||||
|
<value>Update master key</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsSecurityDesc3.Text" xml:space="preserve">
|
||||||
|
<value>when you're done. Please make sure to remember the password you choose here!</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsSecurityTitle.Text" xml:space="preserve">
|
||||||
|
<value>Change database security options</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsSecurityUpdateButton.ButtonLabel" xml:space="preserve">
|
||||||
|
<value>Update master key</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsTitle.Text" xml:space="preserve">
|
||||||
|
<value>Settings</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsWelcomeDesc.Text" xml:space="preserve">
|
||||||
|
<value>Here, you may change the application or the database settings.</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsWelcomeHowto.Text" xml:space="preserve">
|
||||||
|
<value>Select a setting pane on the left to access the options.</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsWelcomeTitle.Text" xml:space="preserve">
|
||||||
|
<value>Settings</value>
|
||||||
|
</data>
|
||||||
|
<data name="WelcomeNew.Text" xml:space="preserve">
|
||||||
|
<value>Want to create a new password database? Do it here.</value>
|
||||||
|
</data>
|
||||||
|
<data name="WelcomeOpen.Text" xml:space="preserve">
|
||||||
|
<value>Have an existing password database? Open it here.</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupsLeftListView.ButtonLabel" xml:space="preserve">
|
||||||
|
<value>New group</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupsLeftListView.HeaderLabel" xml:space="preserve">
|
||||||
|
<value>Groups</value>
|
||||||
|
</data>
|
||||||
|
<data name="HistoryLeftListView.HeaderLabel" xml:space="preserve">
|
||||||
|
<value>History</value>
|
||||||
|
</data>
|
||||||
|
<data name="ToastCopyLogin.Message" xml:space="preserve">
|
||||||
|
<value>Login successfully copied!</value>
|
||||||
|
</data>
|
||||||
|
<data name="ToastCopyPassword.Message" xml:space="preserve">
|
||||||
|
<value>Password successfully copied!</value>
|
||||||
|
</data>
|
||||||
|
<data name="ToastCopyUrl.Message" xml:space="preserve">
|
||||||
|
<value>URL successfully copied!</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryBackgroundColor.Text" xml:space="preserve">
|
||||||
|
<value>Background color</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryForegroundColor.Text" xml:space="preserve">
|
||||||
|
<value>Foreground color</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntrySymbol.Text" xml:space="preserve">
|
||||||
|
<value>Icon</value>
|
||||||
|
</data>
|
||||||
|
<data name="AddEntryTooltip.Content" xml:space="preserve">
|
||||||
|
<value>Create a new entry</value>
|
||||||
|
</data>
|
||||||
|
<data name="HamburgerMenuHomeLabel.Text" xml:space="preserve">
|
||||||
|
<value>Home</value>
|
||||||
|
</data>
|
||||||
|
<data name="HamburgerMenuHomeTooltip.Content" xml:space="preserve">
|
||||||
|
<value>Home</value>
|
||||||
|
</data>
|
||||||
|
<data name="HamburgerMenuSettingsLabel.Text" xml:space="preserve">
|
||||||
|
<value>Settings</value>
|
||||||
|
</data>
|
||||||
|
<data name="HamburgerMenuSettingsTooltip.Content" xml:space="preserve">
|
||||||
|
<value>Settings</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuDeleteButton.Content" xml:space="preserve">
|
||||||
|
<value>Delete</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuDeleteFlyout.Text" xml:space="preserve">
|
||||||
|
<value>Delete</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuEditButton.Content" xml:space="preserve">
|
||||||
|
<value>Edit</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuEditFlyout.Text" xml:space="preserve">
|
||||||
|
<value>Edit</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuMoreButton.Content" xml:space="preserve">
|
||||||
|
<value>More</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuRestoreButton.Content" xml:space="preserve">
|
||||||
|
<value>Restore</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuRestoreFlyout.Text" xml:space="preserve">
|
||||||
|
<value>Restore</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuSaveButton.Content" xml:space="preserve">
|
||||||
|
<value>Save</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuSaveFlyout.Text" xml:space="preserve">
|
||||||
|
<value>Save</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuSortButton.Content" xml:space="preserve">
|
||||||
|
<value>Sort</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuSortEntriesFlyout.Text" xml:space="preserve">
|
||||||
|
<value>Sort entries</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuSortGroupsFlyout.Text" xml:space="preserve">
|
||||||
|
<value>Sort groups</value>
|
||||||
|
</data>
|
||||||
|
<data name="ToastUpdateDatabase.Message" xml:space="preserve">
|
||||||
|
<value>Database successfully updated</value>
|
||||||
|
</data>
|
||||||
|
<data name="ToastUpdateDatabase.Title" xml:space="preserve">
|
||||||
|
<value>Composite Key</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryTitle.PlaceholderText" xml:space="preserve">
|
||||||
|
<value>New entry name...</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
300
ModernKeePass/Strings/fr-FR/CodeBehind.resw
Normal file
300
ModernKeePass/Strings/fr-FR/CodeBehind.resw
Normal file
@@ -0,0 +1,300 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<data name="CompositeKeyDefaultKeyFile" xml:space="preserve">
|
||||||
|
<value>Choisissez un fichier...</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyErrorOpen" xml:space="preserve">
|
||||||
|
<value>Erreur: </value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyErrorUserKeyFile" xml:space="preserve">
|
||||||
|
<value>- mauvais fichier de clé</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyErrorUserPassword" xml:space="preserve">
|
||||||
|
<value>- mot de passe incorrect</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyOpening" xml:space="preserve">
|
||||||
|
<value>Ouverture...</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyUpdated" xml:space="preserve">
|
||||||
|
<value>Clé composite de la base de données mise à jour.</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateAlreadyPurchasedMessage" xml:space="preserve">
|
||||||
|
<value>Vous avez déjà acheté ce produit.</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateAlreadyPurchasedTitle" xml:space="preserve">
|
||||||
|
<value>Achat</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateNothingToFulfillMessage" xml:space="preserve">
|
||||||
|
<value>Il n'y a aucun produit acheté à valider.</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateNothingToFulfillTitle" xml:space="preserve">
|
||||||
|
<value>Validation</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateNotPurchasedMessage" xml:space="preserve">
|
||||||
|
<value>L'achat a échoué parce que nous n'avons pas pu valider un achat précédent.</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateNotPurchasedTitle" xml:space="preserve">
|
||||||
|
<value>Achat</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonatePurchasePendingMessage" xml:space="preserve">
|
||||||
|
<value>Un achat est en cours donc nous ne pouvons le valider.</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonatePurchasePendingTitle" xml:space="preserve">
|
||||||
|
<value>Achat</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonatePurchaseRevertedMessage" xml:space="preserve">
|
||||||
|
<value>Votre achat a été annulé.</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonatePurchaseRevertedTitle" xml:space="preserve">
|
||||||
|
<value>Achat</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateServerErrorMessage" xml:space="preserve">
|
||||||
|
<value>Impossible de contacter le Windows Store, l'achat n'a pas été réalisé.</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateServerErrorTitle" xml:space="preserve">
|
||||||
|
<value>Erreur</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateSucceededMessage" xml:space="preserve">
|
||||||
|
<value>Votre don a été enregistré.</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateSucceededTitle" xml:space="preserve">
|
||||||
|
<value>Merci!</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntityDeleteActionButton" xml:space="preserve">
|
||||||
|
<value>Supprimer</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntityDeleteCancelButton" xml:space="preserve">
|
||||||
|
<value>Annuler</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntityDeleteTitle" xml:space="preserve">
|
||||||
|
<value>Attention</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntityDeleting" xml:space="preserve">
|
||||||
|
<value>Suppression</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntityRestoredTitle" xml:space="preserve">
|
||||||
|
<value>Restauré</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryDeleted" xml:space="preserve">
|
||||||
|
<value>Entrée supprimée définitivement</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryDeletingConfirmation" xml:space="preserve">
|
||||||
|
<value>Êtes-vous sûr de vouloir supprimer cette entrée ?</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryRecycled" xml:space="preserve">
|
||||||
|
<value>Entrée placée dans la Corbeille</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryRecyclingConfirmation" xml:space="preserve">
|
||||||
|
<value>Êtes-vous sûr de vouloir placer cette entrée dans la Corbeille ?</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryRestored" xml:space="preserve">
|
||||||
|
<value>Entrée replacée dans son groupe d'origine</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupDeleted" xml:space="preserve">
|
||||||
|
<value>Groupe supprimé définitivement</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupDeletingConfirmation" xml:space="preserve">
|
||||||
|
<value>Êtes-vous sûr de vouloir supprimer ce groupe et toutes ses entrées ?</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupRecycled" xml:space="preserve">
|
||||||
|
<value>Groupe placé dans la Corbeille</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupRecyclingConfirmation" xml:space="preserve">
|
||||||
|
<value>Êtes-vous sûr de vouloir envoyer ce groupe et toutes ses entrées vers la Corbeille ?</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupRestored" xml:space="preserve">
|
||||||
|
<value>Groupe replacé à sa place originelle</value>
|
||||||
|
</data>
|
||||||
|
<data name="MainMenuItemAbout" xml:space="preserve">
|
||||||
|
<value>A propos</value>
|
||||||
|
</data>
|
||||||
|
<data name="MainMenuItemDonate" xml:space="preserve">
|
||||||
|
<value>Donation</value>
|
||||||
|
</data>
|
||||||
|
<data name="MainMenuItemNew" xml:space="preserve">
|
||||||
|
<value>Nouveau</value>
|
||||||
|
</data>
|
||||||
|
<data name="MainMenuItemOpen" xml:space="preserve">
|
||||||
|
<value>Ouvrir</value>
|
||||||
|
</data>
|
||||||
|
<data name="MainMenuItemRecent" xml:space="preserve">
|
||||||
|
<value>Récents</value>
|
||||||
|
</data>
|
||||||
|
<data name="MainMenuItemSave" xml:space="preserve">
|
||||||
|
<value>Sauvegarder</value>
|
||||||
|
</data>
|
||||||
|
<data name="MainMenuItemSettings" xml:space="preserve">
|
||||||
|
<value>Paramètres</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsMenuGroupApplication" xml:space="preserve">
|
||||||
|
<value>Application</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsMenuGroupDatabase" xml:space="preserve">
|
||||||
|
<value>Base de données</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsMenuItemGeneral" xml:space="preserve">
|
||||||
|
<value>Général</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsMenuItemNew" xml:space="preserve">
|
||||||
|
<value>Nouveau</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsMenuItemSecurity" xml:space="preserve">
|
||||||
|
<value>Sécurité</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyErrorUserAccount" xml:space="preserve">
|
||||||
|
<value>- compte utilisateur</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsMenuItemSave" xml:space="preserve">
|
||||||
|
<value>Sauvegardes</value>
|
||||||
|
</data>
|
||||||
|
<data name="RecycleBinTitle" xml:space="preserve">
|
||||||
|
<value>Corbeille</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryCurrent" xml:space="preserve">
|
||||||
|
<value>Courante</value>
|
||||||
|
</data>
|
||||||
|
<data name="MessageDialogDBOpenButtonDiscard" xml:space="preserve">
|
||||||
|
<value>Abandonner</value>
|
||||||
|
</data>
|
||||||
|
<data name="MessageDialogDBOpenButtonSave" xml:space="preserve">
|
||||||
|
<value>Sauvegarder</value>
|
||||||
|
</data>
|
||||||
|
<data name="MessageDialogDBOpenDesc" xml:space="preserve">
|
||||||
|
<value>La base de données {0} est actuellement ouverte. Que souhaitez-vous faire ?</value>
|
||||||
|
</data>
|
||||||
|
<data name="MessageDialogDBOpenTitle" xml:space="preserve">
|
||||||
|
<value>Base de données ouverte</value>
|
||||||
|
</data>
|
||||||
|
<data name="MessageDialogSaveErrorButtonDiscard" xml:space="preserve">
|
||||||
|
<value>Abandonner</value>
|
||||||
|
</data>
|
||||||
|
<data name="MessageDialogSaveErrorButtonSaveAs" xml:space="preserve">
|
||||||
|
<value>Sauvegarder sous</value>
|
||||||
|
</data>
|
||||||
|
<data name="MessageDialogSaveErrorFileTypeDesc" xml:space="preserve">
|
||||||
|
<value>Base de données KeePass 2.x</value>
|
||||||
|
</data>
|
||||||
|
<data name="MessageDialogSaveErrorTitle" xml:space="preserve">
|
||||||
|
<value>Erreur de sauvegarde</value>
|
||||||
|
</data>
|
||||||
|
<data name="ToastSavedMessage" xml:space="preserve">
|
||||||
|
<value>Base de données sauvegardée avec succès !</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
468
ModernKeePass/Strings/fr-FR/Resources.resw
Normal file
468
ModernKeePass/Strings/fr-FR/Resources.resw
Normal file
@@ -0,0 +1,468 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<data name="AboutCredits1.Text" xml:space="preserve">
|
||||||
|
<value>Dominik Reichl pour l'application KeePass et le format de fichier</value>
|
||||||
|
</data>
|
||||||
|
<data name="AboutCredits2.Text" xml:space="preserve">
|
||||||
|
<value>David Lechner pour son adaptation PCL de la blibliothèque KeePass et ses tests associés</value>
|
||||||
|
</data>
|
||||||
|
<data name="AboutCreditsLabel.Text" xml:space="preserve">
|
||||||
|
<value>Crédits</value>
|
||||||
|
</data>
|
||||||
|
<data name="AboutDesc.Text" xml:space="preserve">
|
||||||
|
<value>Un gestionnaire de mot de passes moderne pour le Windows Store</value>
|
||||||
|
</data>
|
||||||
|
<data name="AboutHomepage.Text" xml:space="preserve">
|
||||||
|
<value>Page d'accueil :</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBarDelete.Label" xml:space="preserve">
|
||||||
|
<value>Supprimer</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBarEdit.Label" xml:space="preserve">
|
||||||
|
<value>Editer</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBarHome.Label" xml:space="preserve">
|
||||||
|
<value>Accueil</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBarRestore.Label" xml:space="preserve">
|
||||||
|
<value>Restaurer</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBarSave.Label" xml:space="preserve">
|
||||||
|
<value>Sauvegarder</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBarSettings.Label" xml:space="preserve">
|
||||||
|
<value>Paramètres</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBarSort.Label" xml:space="preserve">
|
||||||
|
<value>Trier</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBarSortEntries.Text" xml:space="preserve">
|
||||||
|
<value>Entrées</value>
|
||||||
|
</data>
|
||||||
|
<data name="AppBarSortGroups.Text" xml:space="preserve">
|
||||||
|
<value>Groupes</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyNewButton.ButtonLabel" xml:space="preserve">
|
||||||
|
<value>Créer</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyNewKeyFileTooltip.Content" xml:space="preserve">
|
||||||
|
<value>Créer un nouveau fichier de clé</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyOpenButton.ButtonLabel" xml:space="preserve">
|
||||||
|
<value>Ouvrir</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyPassword.PlaceholderText" xml:space="preserve">
|
||||||
|
<value>Mot de passe</value>
|
||||||
|
</data>
|
||||||
|
<data name="CompositeKeyUserAccount.Text" xml:space="preserve">
|
||||||
|
<value>Compte Utilisateur Windows</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateButton.Content" xml:space="preserve">
|
||||||
|
<value>Donner</value>
|
||||||
|
</data>
|
||||||
|
<data name="DonateDesc.Text" xml:space="preserve">
|
||||||
|
<value>Vous aimez cette app? Pourquoi ne pas faire un petit don afin de m'encourager et d'éviter le recours aux publicités :) ?</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryExpirationDate.Content" xml:space="preserve">
|
||||||
|
<value>Date d'expiration</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryExpirationTooltip.Content" xml:space="preserve">
|
||||||
|
<value>Le mot de passe a expiré</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryItemCopyLogin.Text" xml:space="preserve">
|
||||||
|
<value>Copier le login</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryItemCopyPassword.Text" xml:space="preserve">
|
||||||
|
<value>Copier le mot de passe</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryItemCopyUrl.Text" xml:space="preserve">
|
||||||
|
<value>Naviguer vers l'URL</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryLogin.Text" xml:space="preserve">
|
||||||
|
<value>Nom d'utilisateur ou login</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryNotes.Text" xml:space="preserve">
|
||||||
|
<value>Notes</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryPassword.Text" xml:space="preserve">
|
||||||
|
<value>Mot de passe</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryShowPassword.Content" xml:space="preserve">
|
||||||
|
<value>Afficher le mot de passe</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupCreateEntry.Text" xml:space="preserve">
|
||||||
|
<value>Créer une nouvelle entrée</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupFilter.PlaceholderText" xml:space="preserve">
|
||||||
|
<value>Filtrer...</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupSearch.PlaceholderText" xml:space="preserve">
|
||||||
|
<value>Rechercher...</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupTitle.PlaceholderText" xml:space="preserve">
|
||||||
|
<value>Nom du nouveau groupe...</value>
|
||||||
|
</data>
|
||||||
|
<data name="NewCreateButton.Content" xml:space="preserve">
|
||||||
|
<value>Créer une nouvelle...</value>
|
||||||
|
</data>
|
||||||
|
<data name="NewCreateDesc.Text" xml:space="preserve">
|
||||||
|
<value>Créer une nouvelle base de données de mots de passe à l'endroit de votre choix.</value>
|
||||||
|
</data>
|
||||||
|
<data name="OpenBrowseButton.Content" xml:space="preserve">
|
||||||
|
<value>Parcourir les fichiers...</value>
|
||||||
|
</data>
|
||||||
|
<data name="OpenBrowseDesc.Text" xml:space="preserve">
|
||||||
|
<value>Ouvrir une base de données de mots de passe existante sur votre PC.</value>
|
||||||
|
</data>
|
||||||
|
<data name="OpenUrlButton.Content" xml:space="preserve">
|
||||||
|
<value>Depuis une URL...</value>
|
||||||
|
</data>
|
||||||
|
<data name="OpenUrlDesc.Text" xml:space="preserve">
|
||||||
|
<value>Ouvrir une base de données de mots de passe depuis Internet (pas encore implementé).</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorAlso.Text" xml:space="preserve">
|
||||||
|
<value>Ajouter aussi ces caractères :</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorBrackets.Content" xml:space="preserve">
|
||||||
|
<value>Parenthèses ([], {}, (), ...)</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorButton.Content" xml:space="preserve">
|
||||||
|
<value>Générer</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorDigits.Content" xml:space="preserve">
|
||||||
|
<value>Chiffres (0, 1, 2, ...)</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorLength.Text" xml:space="preserve">
|
||||||
|
<value>Longueur de mot de passe :</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorLower.Content" xml:space="preserve">
|
||||||
|
<value>Minuscules (a, b, c, ...)</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorMinus.Content" xml:space="preserve">
|
||||||
|
<value>Moins (-)</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorSpace.Content" xml:space="preserve">
|
||||||
|
<value>Espace ( )</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorSpecial.Content" xml:space="preserve">
|
||||||
|
<value>Spéciaux (!, $, %, ...)</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorTooltip.Content" xml:space="preserve">
|
||||||
|
<value>Générer le mot de passe</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorUnderscore.Content" xml:space="preserve">
|
||||||
|
<value>Underscore (_)</value>
|
||||||
|
</data>
|
||||||
|
<data name="PasswordGeneratorUpper.Content" xml:space="preserve">
|
||||||
|
<value>Majuscules (A, B, C, ...)</value>
|
||||||
|
</data>
|
||||||
|
<data name="RecentClear.Text" xml:space="preserve">
|
||||||
|
<value>Supprimer tout</value>
|
||||||
|
</data>
|
||||||
|
<data name="ReorderEntriesLabel.Text" xml:space="preserve">
|
||||||
|
<value>Glissez-déposez les entrées pour les réorganiser</value>
|
||||||
|
</data>
|
||||||
|
<data name="SaveAsButton.Content" xml:space="preserve">
|
||||||
|
<value>Sauvegarder sous...</value>
|
||||||
|
</data>
|
||||||
|
<data name="SaveAsDesc.Text" xml:space="preserve">
|
||||||
|
<value>Cela va sauvegarder la base de données dans un nouveau fichier et l'ouvrir.</value>
|
||||||
|
</data>
|
||||||
|
<data name="SaveButton.Content" xml:space="preserve">
|
||||||
|
<value>Sauvegarder et fermer</value>
|
||||||
|
</data>
|
||||||
|
<data name="SaveDesc.Text" xml:space="preserve">
|
||||||
|
<value>Cela va sauvegarder et fermer la base de données.</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsDatabaseCompression.Text" xml:space="preserve">
|
||||||
|
<value>Algorithme de compression</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsDatabaseEncryption.Text" xml:space="preserve">
|
||||||
|
<value>Algorithme de chiffrement</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsDatabaseKdf.Text" xml:space="preserve">
|
||||||
|
<value>Algorithme de dérivation de clé</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsDatabaseRecycleBin.Header" xml:space="preserve">
|
||||||
|
<value>Corbeille</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsDatabaseRecycleBin.OffContent" xml:space="preserve">
|
||||||
|
<value>Désactivé</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsDatabaseRecycleBin.OnContent" xml:space="preserve">
|
||||||
|
<value>Activé</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsDatabaseRecycleBinCreate.Content" xml:space="preserve">
|
||||||
|
<value>Créer un nouveau groupe</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsDatabaseRecycleBinExisting.Content" xml:space="preserve">
|
||||||
|
<value>Utiliser un groupe existant</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsNewDatabaseDesc.Text" xml:space="preserve">
|
||||||
|
<value>Ici, vous pouvez changer certains options lors de la création d'une nouvelle base de données</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsNewDatabaseKdf.Text" xml:space="preserve">
|
||||||
|
<value>Version de fichier KDBX</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsNewDatabaseKdfMoreInfo.Text" xml:space="preserve">
|
||||||
|
<value>Le plus élévé est le mieux, mais vous pourriez rencontrer des problèmes de compatibilité avec des application plus anciennes</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsNewDatabaseSample.Header" xml:space="preserve">
|
||||||
|
<value>Créer des données d'exemple</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsNewDatabaseSample.OffContent" xml:space="preserve">
|
||||||
|
<value>Non</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsNewDatabaseSample.OnContent" xml:space="preserve">
|
||||||
|
<value>Oui</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsSaveDatabaseSuspend.OffContent" xml:space="preserve">
|
||||||
|
<value>Ne pas sauvegarder</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsSaveDatabaseSuspend.OnContent" xml:space="preserve">
|
||||||
|
<value>Sauvegarder</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsSaveDatabaseSuspendDesc.Text" xml:space="preserve">
|
||||||
|
<value>Ce paramètre est généralement recommandé. Si vous l'activez, la base de données sera sauvegardée automatiquement lors de la suspension et de la fermeture. Cependant, si votre base de données est très volumineuse, il se peut que Windows estime que cela prend trop de temps et tue l'application.</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsSaveDatabaseSuspendTitle.Text" xml:space="preserve">
|
||||||
|
<value>Sauvegarder automatiquement lors de la suspension ?</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsSecurityDesc1.Text" xml:space="preserve">
|
||||||
|
<value>Ici, vous pouvez changer le mot de passe maître, le fichier de clé, ou les deux. Cliquez simplement sur</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsSecurityDesc2.Text" xml:space="preserve">
|
||||||
|
<value>Mettre à jour la clé maître</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsSecurityDesc3.Text" xml:space="preserve">
|
||||||
|
<value>quand vous avez fini. Retenez bien le mot de passe que vous utilisez !</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsSecurityTitle.Text" xml:space="preserve">
|
||||||
|
<value>Changer les options de sécurité de la base de données</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsSecurityUpdateButton.ButtonLabel" xml:space="preserve">
|
||||||
|
<value>Mettre à jour la clé maître</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsTitle.Text" xml:space="preserve">
|
||||||
|
<value>Paramètres</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsWelcomeDesc.Text" xml:space="preserve">
|
||||||
|
<value>Ici, vous pouvez changer les options de l'application ou de la base de données.</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsWelcomeHowto.Text" xml:space="preserve">
|
||||||
|
<value>Choisissez un élément dans le menu de gauche.</value>
|
||||||
|
</data>
|
||||||
|
<data name="SettingsWelcomeTitle.Text" xml:space="preserve">
|
||||||
|
<value>Paramètres</value>
|
||||||
|
</data>
|
||||||
|
<data name="WelcomeNew.Text" xml:space="preserve">
|
||||||
|
<value>Pour créer une nouvelle base de données de mots de passe, c'est ici.</value>
|
||||||
|
</data>
|
||||||
|
<data name="WelcomeOpen.Text" xml:space="preserve">
|
||||||
|
<value>Pour ouvrir une base de données existante, c'est ici.</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupsLeftListView.ButtonLabel" xml:space="preserve">
|
||||||
|
<value>Nouveau groupe</value>
|
||||||
|
</data>
|
||||||
|
<data name="GroupsLeftListView.HeaderLabel" xml:space="preserve">
|
||||||
|
<value>Groupes</value>
|
||||||
|
</data>
|
||||||
|
<data name="HistoryLeftListView.HeaderLabel" xml:space="preserve">
|
||||||
|
<value>Historique</value>
|
||||||
|
</data>
|
||||||
|
<data name="ToastCopyLogin.Message" xml:space="preserve">
|
||||||
|
<value>Login copié avec succès !</value>
|
||||||
|
</data>
|
||||||
|
<data name="ToastCopyPassword.Message" xml:space="preserve">
|
||||||
|
<value>Mot de passe copié avec succès !</value>
|
||||||
|
</data>
|
||||||
|
<data name="ToastCopyUrl.Message" xml:space="preserve">
|
||||||
|
<value>URL copié avec succès !</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryBackgroundColor.Text" xml:space="preserve">
|
||||||
|
<value>Couleur d'arrière plan</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryForegroundColor.Text" xml:space="preserve">
|
||||||
|
<value>Couleur du texte</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntrySymbol.Text" xml:space="preserve">
|
||||||
|
<value>Icône</value>
|
||||||
|
</data>
|
||||||
|
<data name="AddEntryTooltip.Content" xml:space="preserve">
|
||||||
|
<value>Créer une nouvelle entrée</value>
|
||||||
|
</data>
|
||||||
|
<data name="HamburgerMenuHomeLabel.Text" xml:space="preserve">
|
||||||
|
<value>Accueil</value>
|
||||||
|
</data>
|
||||||
|
<data name="HamburgerMenuHomeTooltip.Content" xml:space="preserve">
|
||||||
|
<value>Accueil</value>
|
||||||
|
</data>
|
||||||
|
<data name="HamburgerMenuSettingsLabel.Text" xml:space="preserve">
|
||||||
|
<value>Paramètres</value>
|
||||||
|
</data>
|
||||||
|
<data name="HamburgerMenuSettingsTooltip.Content" xml:space="preserve">
|
||||||
|
<value>Paramètres</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuDeleteButton.Content" xml:space="preserve">
|
||||||
|
<value>Supprimer</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuDeleteFlyout.Text" xml:space="preserve">
|
||||||
|
<value>Supprimer</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuEditButton.Content" xml:space="preserve">
|
||||||
|
<value>Editer</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuEditFlyout.Text" xml:space="preserve">
|
||||||
|
<value>Editer</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuMoreButton.Content" xml:space="preserve">
|
||||||
|
<value>Plus</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuRestoreButton.Content" xml:space="preserve">
|
||||||
|
<value>Restaurer</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuRestoreFlyout.Text" xml:space="preserve">
|
||||||
|
<value>Restaurer</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuSaveButton.Content" xml:space="preserve">
|
||||||
|
<value>Sauvegarder</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuSaveFlyout.Text" xml:space="preserve">
|
||||||
|
<value>Sauvegarder</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuSortButton.Content" xml:space="preserve">
|
||||||
|
<value>Trier</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuSortEntriesFlyout.Text" xml:space="preserve">
|
||||||
|
<value>Trier les entrées</value>
|
||||||
|
</data>
|
||||||
|
<data name="TopMenuSortGroupsFlyout.Text" xml:space="preserve">
|
||||||
|
<value>Trier les groupes</value>
|
||||||
|
</data>
|
||||||
|
<data name="ToastUpdateDatabase.Message" xml:space="preserve">
|
||||||
|
<value>Base de données mise à jour</value>
|
||||||
|
</data>
|
||||||
|
<data name="ToastUpdateDatabase.Title" xml:space="preserve">
|
||||||
|
<value>Clé maître</value>
|
||||||
|
</data>
|
||||||
|
<data name="EntryTitle.PlaceholderText" xml:space="preserve">
|
||||||
|
<value>Nom de la nouvelle entrée...</value>
|
||||||
|
</data>
|
||||||
|
</root>
|
@@ -11,7 +11,7 @@ namespace ModernKeePass.TemplateSelectors
|
|||||||
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
|
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
|
||||||
{
|
{
|
||||||
var itemsControl = ItemsControl.ItemsControlFromItemContainer(container);
|
var itemsControl = ItemsControl.ItemsControlFromItemContainer(container);
|
||||||
var returnTemplate = itemsControl.IndexFromContainer(container) == 0 ? FirstItem : OtherItem;
|
var returnTemplate = itemsControl?.IndexFromContainer(container) == 0 ? FirstItem : OtherItem;
|
||||||
return returnTemplate;
|
return returnTemplate;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -0,0 +1,18 @@
|
|||||||
|
using Windows.UI.Xaml;
|
||||||
|
using Windows.UI.Xaml.Controls;
|
||||||
|
using ModernKeePass.Interfaces;
|
||||||
|
|
||||||
|
namespace ModernKeePass.TemplateSelectors
|
||||||
|
{
|
||||||
|
public class SelectableDataTemplateSelector: DataTemplateSelector
|
||||||
|
{
|
||||||
|
public DataTemplate TrueItem { get; set; }
|
||||||
|
public DataTemplate FalseItem { get; set; }
|
||||||
|
|
||||||
|
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
|
||||||
|
{
|
||||||
|
var isSelectableItem = item as ISelectableModel;
|
||||||
|
return isSelectableItem != null && isSelectableItem.IsSelected ? TrueItem : FalseItem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -4,17 +4,24 @@ namespace ModernKeePass.ViewModels
|
|||||||
{
|
{
|
||||||
public class AboutVm
|
public class AboutVm
|
||||||
{
|
{
|
||||||
public string Name { get; } = Package.Current.DisplayName;
|
private readonly Package _package;
|
||||||
|
|
||||||
|
public string Name => _package.DisplayName;
|
||||||
|
|
||||||
public string Version
|
public string Version
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
var package = Package.Current;
|
var version = _package.Id.Version;
|
||||||
var version = package.Id.Version;
|
|
||||||
|
|
||||||
return $"{version.Major}.{version.Minor}";
|
return $"{version.Major}.{version.Minor}";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AboutVm() : this(Package.Current) { }
|
||||||
|
|
||||||
|
public AboutVm(Package package)
|
||||||
|
{
|
||||||
|
_package = package;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,7 +1,10 @@
|
|||||||
using System.Text;
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using Windows.Storage;
|
using Windows.Storage;
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
|
using ModernKeePass.Interfaces;
|
||||||
|
using ModernKeePass.Services;
|
||||||
using ModernKeePassLib.Cryptography;
|
using ModernKeePassLib.Cryptography;
|
||||||
using ModernKeePassLib.Keys;
|
using ModernKeePassLib.Keys;
|
||||||
using ModernKeePassLib.Serialization;
|
using ModernKeePassLib.Serialization;
|
||||||
@@ -18,14 +21,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
Success = 5
|
Success = 5
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly App _app = Application.Current as App;
|
public IDatabaseService Database { get; set; }
|
||||||
private bool _hasPassword;
|
|
||||||
private bool _hasKeyFile;
|
|
||||||
private string _password = string.Empty;
|
|
||||||
private string _status;
|
|
||||||
private StatusTypes _statusType;
|
|
||||||
private StorageFile _keyFile;
|
|
||||||
private string _keyFileText = "Select key file from disk...";
|
|
||||||
|
|
||||||
public bool HasPassword
|
public bool HasPassword
|
||||||
{
|
{
|
||||||
@@ -47,7 +43,17 @@ namespace ModernKeePass.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsValid => HasPassword || HasKeyFile && KeyFile != null;
|
public bool HasUserAccount
|
||||||
|
{
|
||||||
|
get { return _hasUserAccount; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
SetProperty(ref _hasUserAccount, value);
|
||||||
|
OnPropertyChanged("IsValid");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsValid => !_isOpening && (HasPassword || HasKeyFile && KeyFile != null || HasUserAccount);
|
||||||
|
|
||||||
public string Status
|
public string Status
|
||||||
{
|
{
|
||||||
@@ -69,6 +75,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
_password = value;
|
_password = value;
|
||||||
OnPropertyChanged("PasswordComplexityIndicator");
|
OnPropertyChanged("PasswordComplexityIndicator");
|
||||||
StatusType = (int)StatusTypes.Normal;
|
StatusType = (int)StatusTypes.Normal;
|
||||||
|
Status = string.Empty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,31 +97,62 @@ namespace ModernKeePass.ViewModels
|
|||||||
}
|
}
|
||||||
|
|
||||||
public GroupVm RootGroup { get; set; }
|
public GroupVm RootGroup { get; set; }
|
||||||
|
|
||||||
public double PasswordComplexityIndicator => QualityEstimation.EstimatePasswordBits(Password?.ToCharArray());
|
public double PasswordComplexityIndicator => QualityEstimation.EstimatePasswordBits(Password?.ToCharArray());
|
||||||
|
|
||||||
public bool OpenDatabase(bool createNew)
|
private bool _hasPassword;
|
||||||
|
private bool _hasKeyFile;
|
||||||
|
private bool _hasUserAccount;
|
||||||
|
private bool _isOpening;
|
||||||
|
private string _password = string.Empty;
|
||||||
|
private string _status;
|
||||||
|
private StatusTypes _statusType;
|
||||||
|
private StorageFile _keyFile;
|
||||||
|
private string _keyFileText;
|
||||||
|
private readonly IResourceService _resource;
|
||||||
|
|
||||||
|
public CompositeKeyVm() : this(DatabaseService.Instance, new ResourcesService()) { }
|
||||||
|
|
||||||
|
public CompositeKeyVm(IDatabaseService database, IResourceService resource)
|
||||||
{
|
{
|
||||||
_app.Database.Open(CreateCompositeKey(), createNew);
|
_resource = resource;
|
||||||
switch (_app.Database.Status)
|
_keyFileText = _resource.GetResourceValue("CompositeKeyDefaultKeyFile");
|
||||||
|
Database = database;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<bool> OpenDatabase(StorageFile databaseFile, bool createNew)
|
||||||
{
|
{
|
||||||
case DatabaseHelper.DatabaseStatus.Opened:
|
try
|
||||||
RootGroup = _app.Database.RootGroup;
|
{
|
||||||
|
_isOpening = true;
|
||||||
|
Database.Open(databaseFile, CreateCompositeKey(), createNew);
|
||||||
|
await Task.Run(() => RootGroup = Database.RootGroup);
|
||||||
return true;
|
return true;
|
||||||
case DatabaseHelper.DatabaseStatus.CompositeKeyError:
|
}
|
||||||
var errorMessage = new StringBuilder("Error: wrong ");
|
catch (ArgumentException)
|
||||||
if (HasPassword) errorMessage.Append("password");
|
{
|
||||||
if (HasPassword && HasKeyFile) errorMessage.Append(" or ");
|
var errorMessage = new StringBuilder($"{_resource.GetResourceValue("CompositeKeyErrorOpen")}\n");
|
||||||
if (HasKeyFile) errorMessage.Append("key file");
|
if (HasPassword) errorMessage.AppendLine(_resource.GetResourceValue("CompositeKeyErrorUserPassword"));
|
||||||
|
if (HasKeyFile) errorMessage.AppendLine(_resource.GetResourceValue("CompositeKeyErrorUserKeyFile"));
|
||||||
|
if (HasUserAccount) errorMessage.AppendLine(_resource.GetResourceValue("CompositeKeyErrorUserAccount"));
|
||||||
UpdateStatus(errorMessage.ToString(), StatusTypes.Error);
|
UpdateStatus(errorMessage.ToString(), StatusTypes.Error);
|
||||||
break;
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
var error = $"{_resource.GetResourceValue("CompositeKeyErrorOpen")}{e.Message}";
|
||||||
|
UpdateStatus(error, StatusTypes.Error);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_isOpening = false;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateKey()
|
public void UpdateKey()
|
||||||
{
|
{
|
||||||
_app.Database.UpdateCompositeKey(CreateCompositeKey());
|
Database.UpdateCompositeKey(CreateCompositeKey());
|
||||||
UpdateStatus("Database composite key updated.", StatusTypes.Success);
|
UpdateStatus(_resource.GetResourceValue("CompositeKeyUpdated"), StatusTypes.Success);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void CreateKeyFile(StorageFile file)
|
public void CreateKeyFile(StorageFile file)
|
||||||
@@ -135,6 +173,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
var compositeKey = new CompositeKey();
|
var compositeKey = new CompositeKey();
|
||||||
if (HasPassword) compositeKey.AddUserKey(new KcpPassword(Password));
|
if (HasPassword) compositeKey.AddUserKey(new KcpPassword(Password));
|
||||||
if (HasKeyFile && KeyFile != null) compositeKey.AddUserKey(new KcpKeyFile(IOConnectionInfo.FromFile(KeyFile)));
|
if (HasKeyFile && KeyFile != null) compositeKey.AddUserKey(new KcpKeyFile(IOConnectionInfo.FromFile(KeyFile)));
|
||||||
|
if (HasUserAccount) compositeKey.AddUserKey(new KcpUserAccount());
|
||||||
return compositeKey;
|
return compositeKey;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,10 +1,11 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Text;
|
using System.Drawing;
|
||||||
using Windows.UI.Xaml;
|
using System.Windows.Input;
|
||||||
using Windows.UI.Xaml.Controls;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
using ModernKeePass.Mappings;
|
using ModernKeePass.Services;
|
||||||
using ModernKeePassLib;
|
using ModernKeePassLib;
|
||||||
using ModernKeePassLib.Cryptography.PasswordGenerator;
|
using ModernKeePassLib.Cryptography.PasswordGenerator;
|
||||||
using ModernKeePassLib.Security;
|
using ModernKeePassLib.Security;
|
||||||
@@ -12,20 +13,13 @@ using ModernKeePassLib.Cryptography;
|
|||||||
|
|
||||||
namespace ModernKeePass.ViewModels
|
namespace ModernKeePass.ViewModels
|
||||||
{
|
{
|
||||||
public class EntryVm : INotifyPropertyChanged, IPwEntity
|
public class EntryVm : INotifyPropertyChanged, IPwEntity, ISelectableModel
|
||||||
{
|
{
|
||||||
public GroupVm ParentGroup { get; private set; }
|
public GroupVm ParentGroup { get; private set; }
|
||||||
|
|
||||||
public GroupVm PreviousGroup { get; private set; }
|
public GroupVm PreviousGroup { get; private set; }
|
||||||
|
|
||||||
public System.Drawing.Color? BackgroundColor => _pwEntry?.BackgroundColor;
|
|
||||||
public System.Drawing.Color? ForegroundColor => _pwEntry?.ForegroundColor;
|
|
||||||
public bool IsRevealPasswordEnabled => !string.IsNullOrEmpty(Password);
|
public bool IsRevealPasswordEnabled => !string.IsNullOrEmpty(Password);
|
||||||
public bool HasExpired => HasExpirationDate && _pwEntry.ExpiryTime < DateTime.Now;
|
public bool HasExpired => HasExpirationDate && _pwEntry.ExpiryTime < DateTime.Now;
|
||||||
public double PasswordComplexityIndicator => QualityEstimation.EstimatePasswordBits(Password.ToCharArray());
|
public double PasswordComplexityIndicator => QualityEstimation.EstimatePasswordBits(Password?.ToCharArray());
|
||||||
public bool IsFirstItem => _pwEntry == null;
|
|
||||||
|
|
||||||
|
|
||||||
public bool UpperCasePatternSelected { get; set; } = true;
|
public bool UpperCasePatternSelected { get; set; } = true;
|
||||||
public bool LowerCasePatternSelected { get; set; } = true;
|
public bool LowerCasePatternSelected { get; set; } = true;
|
||||||
public bool DigitsPatternSelected { get; set; } = true;
|
public bool DigitsPatternSelected { get; set; } = true;
|
||||||
@@ -36,6 +30,13 @@ namespace ModernKeePass.ViewModels
|
|||||||
public bool BracketsPatternSelected { get; set; }
|
public bool BracketsPatternSelected { get; set; }
|
||||||
public string CustomChars { get; set; } = string.Empty;
|
public string CustomChars { get; set; } = string.Empty;
|
||||||
public PwUuid IdUuid => _pwEntry?.Uuid;
|
public PwUuid IdUuid => _pwEntry?.Uuid;
|
||||||
|
public string Id => _pwEntry?.Uuid.ToHexString();
|
||||||
|
public bool IsRecycleOnDelete => _database.RecycleBinEnabled && !ParentGroup.IsSelected;
|
||||||
|
public IEnumerable<IPwEntity> BreadCrumb => new List<IPwEntity>(ParentGroup.BreadCrumb) {ParentGroup};
|
||||||
|
/// <summary>
|
||||||
|
/// Determines if the Entry is current or from history
|
||||||
|
/// </summary>
|
||||||
|
public bool IsSelected { get; set; } = true;
|
||||||
|
|
||||||
public double PasswordLength
|
public double PasswordLength
|
||||||
{
|
{
|
||||||
@@ -46,22 +47,18 @@ namespace ModernKeePass.ViewModels
|
|||||||
NotifyPropertyChanged("PasswordLength");
|
NotifyPropertyChanged("PasswordLength");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Name
|
public string Name
|
||||||
{
|
{
|
||||||
get
|
get { return GetEntryValue(PwDefs.TitleField); }
|
||||||
{
|
set { SetEntryValue(PwDefs.TitleField, new ProtectedString(true, value)); }
|
||||||
var title = GetEntryValue(PwDefs.TitleField);
|
|
||||||
return title == null ? "< New entry >" : title;
|
|
||||||
}
|
|
||||||
set { SetEntryValue(PwDefs.TitleField, value); }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Id => _pwEntry?.Uuid.ToHexString();
|
|
||||||
|
|
||||||
public string UserName
|
public string UserName
|
||||||
{
|
{
|
||||||
get { return GetEntryValue(PwDefs.UserNameField); }
|
get { return GetEntryValue(PwDefs.UserNameField); }
|
||||||
set { SetEntryValue(PwDefs.UserNameField, value); }
|
set { SetEntryValue(PwDefs.UserNameField, new ProtectedString(true, value)); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Password
|
public string Password
|
||||||
@@ -69,31 +66,33 @@ namespace ModernKeePass.ViewModels
|
|||||||
get { return GetEntryValue(PwDefs.PasswordField); }
|
get { return GetEntryValue(PwDefs.PasswordField); }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
SetEntryValue(PwDefs.PasswordField, value);
|
SetEntryValue(PwDefs.PasswordField, new ProtectedString(true, value));
|
||||||
NotifyPropertyChanged("Password");
|
NotifyPropertyChanged("Password");
|
||||||
NotifyPropertyChanged("PasswordComplexityIndicator");
|
NotifyPropertyChanged("PasswordComplexityIndicator");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Url
|
public string Url
|
||||||
{
|
{
|
||||||
get { return GetEntryValue(PwDefs.UrlField); }
|
get { return GetEntryValue(PwDefs.UrlField); }
|
||||||
set { SetEntryValue(PwDefs.UrlField, value); }
|
set { SetEntryValue(PwDefs.UrlField, new ProtectedString(true, value)); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Notes
|
public string Notes
|
||||||
{
|
{
|
||||||
get { return GetEntryValue(PwDefs.NotesField); }
|
get { return GetEntryValue(PwDefs.NotesField); }
|
||||||
set { SetEntryValue(PwDefs.NotesField, value); }
|
set { SetEntryValue(PwDefs.NotesField, new ProtectedString(true, value)); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public Symbol IconSymbol
|
public int IconId
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (_pwEntry == null) return Symbol.Add;
|
if (HasExpired) return (int) PwIcon.Expired;
|
||||||
if (HasExpired) return Symbol.Priority;
|
if (_pwEntry?.IconId != null) return (int) _pwEntry?.IconId;
|
||||||
var result = PwIconToSegoeMapping.GetSymbolFromIcon(_pwEntry.IconId);
|
return -1;
|
||||||
return result == Symbol.More ? Symbol.Permissions : result;
|
|
||||||
}
|
}
|
||||||
|
set { _pwEntry.IconId = (PwIcon)value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public DateTimeOffset ExpiryDate
|
public DateTimeOffset ExpiryDate
|
||||||
@@ -110,7 +109,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
|
|
||||||
public bool IsEditMode
|
public bool IsEditMode
|
||||||
{
|
{
|
||||||
get { return _isEditMode; }
|
get { return IsSelected && _isEditMode; }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
_isEditMode = value;
|
_isEditMode = value;
|
||||||
@@ -118,6 +117,16 @@ namespace ModernKeePass.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsVisible
|
||||||
|
{
|
||||||
|
get { return _isVisible; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_isVisible = value;
|
||||||
|
NotifyPropertyChanged("IsVisible");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public bool IsRevealPassword
|
public bool IsRevealPassword
|
||||||
{
|
{
|
||||||
get { return _isRevealPassword; }
|
get { return _isRevealPassword; }
|
||||||
@@ -137,23 +146,54 @@ namespace ModernKeePass.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Path
|
public IEnumerable<IPwEntity> History
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
var path = new StringBuilder(ParentGroup.Path);
|
var history = new Stack<EntryVm>();
|
||||||
path.Append($" > {ParentGroup.Name}");
|
foreach (var historyEntry in _pwEntry.History)
|
||||||
return path.ToString();
|
{
|
||||||
|
history.Push(new EntryVm(historyEntry, ParentGroup) {IsSelected = false});
|
||||||
|
}
|
||||||
|
history.Push(this);
|
||||||
|
|
||||||
|
return history;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Color? BackgroundColor
|
||||||
|
{
|
||||||
|
get { return _pwEntry?.BackgroundColor; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value != null) _pwEntry.BackgroundColor = (Color) value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public Color? ForegroundColor
|
||||||
|
{
|
||||||
|
get { return _pwEntry?.ForegroundColor; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value != null) _pwEntry.ForegroundColor = (Color)value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICommand SaveCommand { get; }
|
||||||
|
public ICommand GeneratePasswordCommand { get; }
|
||||||
|
public ICommand UndoDeleteCommand { get; }
|
||||||
|
public ICommand GoBackCommand { get; set; }
|
||||||
|
|
||||||
public event PropertyChangedEventHandler PropertyChanged;
|
public event PropertyChangedEventHandler PropertyChanged;
|
||||||
|
|
||||||
private readonly PwEntry _pwEntry;
|
private readonly PwEntry _pwEntry;
|
||||||
private readonly App _app = Application.Current as App;
|
private readonly IDatabaseService _database;
|
||||||
|
private readonly IResourceService _resource;
|
||||||
private bool _isEditMode;
|
private bool _isEditMode;
|
||||||
|
private bool _isDirty;
|
||||||
private bool _isRevealPassword;
|
private bool _isRevealPassword;
|
||||||
private double _passwordLength = 25;
|
private double _passwordLength = 25;
|
||||||
|
private bool _isVisible = true;
|
||||||
|
|
||||||
private void NotifyPropertyChanged(string propertyName)
|
private void NotifyPropertyChanged(string propertyName)
|
||||||
{
|
{
|
||||||
@@ -161,15 +201,24 @@ namespace ModernKeePass.ViewModels
|
|||||||
}
|
}
|
||||||
|
|
||||||
public EntryVm() { }
|
public EntryVm() { }
|
||||||
public EntryVm(PwEntry entry, GroupVm parent)
|
|
||||||
|
internal EntryVm(PwEntry entry, GroupVm parent) : this(entry, parent, DatabaseService.Instance, new ResourcesService()) { }
|
||||||
|
|
||||||
|
public EntryVm(PwEntry entry, GroupVm parent, IDatabaseService database, IResourceService resource)
|
||||||
{
|
{
|
||||||
|
_database = database;
|
||||||
|
_resource = resource;
|
||||||
_pwEntry = entry;
|
_pwEntry = entry;
|
||||||
ParentGroup = parent;
|
ParentGroup = parent;
|
||||||
|
|
||||||
|
SaveCommand = new RelayCommand(() => _database.Save());
|
||||||
|
GeneratePasswordCommand = new RelayCommand(GeneratePassword);
|
||||||
|
UndoDeleteCommand = new RelayCommand(() => Move(PreviousGroup));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void GeneratePassword()
|
public void GeneratePassword()
|
||||||
{
|
{
|
||||||
var pwProfile = new PwProfile()
|
var pwProfile = new PwProfile
|
||||||
{
|
{
|
||||||
GeneratorType = PasswordGeneratorType.CharSet,
|
GeneratorType = PasswordGeneratorType.CharSet,
|
||||||
Length = (uint)PasswordLength,
|
Length = (uint)PasswordLength,
|
||||||
@@ -190,59 +239,67 @@ namespace ModernKeePass.ViewModels
|
|||||||
ProtectedString password;
|
ProtectedString password;
|
||||||
PwGenerator.Generate(out password, pwProfile, null, new CustomPwGeneratorPool());
|
PwGenerator.Generate(out password, pwProfile, null, new CustomPwGeneratorPool());
|
||||||
|
|
||||||
_pwEntry?.Strings.Set(PwDefs.PasswordField, password);
|
SetEntryValue(PwDefs.PasswordField, password);
|
||||||
NotifyPropertyChanged("Password");
|
NotifyPropertyChanged("Password");
|
||||||
NotifyPropertyChanged("IsRevealPasswordEnabled");
|
NotifyPropertyChanged("IsRevealPasswordEnabled");
|
||||||
NotifyPropertyChanged("PasswordComplexityIndicator");
|
NotifyPropertyChanged("PasswordComplexityIndicator");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void MarkForDelete(string recycleBinTitle)
|
||||||
|
{
|
||||||
|
if (_database.RecycleBinEnabled && _database.RecycleBin?.IdUuid == null)
|
||||||
|
_database.CreateRecycleBin(recycleBinTitle);
|
||||||
|
Move(_database.RecycleBinEnabled && !ParentGroup.IsSelected ? _database.RecycleBin : null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Move(GroupVm destination)
|
||||||
|
{
|
||||||
|
PreviousGroup = ParentGroup;
|
||||||
|
PreviousGroup.Entries.Remove(this);
|
||||||
|
if (destination == null)
|
||||||
|
{
|
||||||
|
_database.AddDeletedItem(IdUuid);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ParentGroup = destination;
|
||||||
|
ParentGroup.Entries.Add(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CommitDelete()
|
||||||
|
{
|
||||||
|
_pwEntry.ParentGroup.Entries.Remove(_pwEntry);
|
||||||
|
if (!_database.RecycleBinEnabled || PreviousGroup.IsSelected) _database.AddDeletedItem(IdUuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PwEntry GetPwEntry()
|
||||||
|
{
|
||||||
|
return _pwEntry;
|
||||||
|
}
|
||||||
|
public void Reset()
|
||||||
|
{
|
||||||
|
_isDirty = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return IsSelected ? _resource.GetResourceValue("EntryCurrent") : _pwEntry.LastModificationTime.ToString("g");
|
||||||
|
}
|
||||||
|
|
||||||
private string GetEntryValue(string key)
|
private string GetEntryValue(string key)
|
||||||
{
|
{
|
||||||
return _pwEntry?.Strings.GetSafe(key).ReadString();
|
return _pwEntry?.Strings.GetSafe(key).ReadString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetEntryValue(string key, string newValue)
|
private void SetEntryValue(string key, ProtectedString newValue)
|
||||||
{
|
{
|
||||||
_pwEntry?.Strings.Set(key, new ProtectedString(true, newValue));
|
if (!_isDirty)
|
||||||
}
|
|
||||||
|
|
||||||
public void MarkForDelete()
|
|
||||||
{
|
{
|
||||||
if (_app.Database.RecycleBinEnabled && _app.Database.RecycleBin?.IdUuid == null)
|
_pwEntry.Touch(true);
|
||||||
_app.Database.CreateRecycleBin();
|
_pwEntry?.CreateBackup(null);
|
||||||
Move(_app.Database.RecycleBinEnabled && !ParentGroup.IsSelected ? _app.Database.RecycleBin : null);
|
|
||||||
}
|
}
|
||||||
|
_pwEntry?.Strings.Set(key, newValue);
|
||||||
public void UndoDelete()
|
_isDirty = true;
|
||||||
{
|
|
||||||
Move(PreviousGroup);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Move(GroupVm destination)
|
|
||||||
{
|
|
||||||
PreviousGroup = ParentGroup;
|
|
||||||
PreviousGroup.Entries.Remove(this);
|
|
||||||
PreviousGroup.RemovePwEntry(_pwEntry);
|
|
||||||
if (destination == null)
|
|
||||||
{
|
|
||||||
_app.Database.AddDeletedItem(IdUuid);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
ParentGroup = destination;
|
|
||||||
ParentGroup.Entries.Add(this);
|
|
||||||
ParentGroup.AddPwEntry(_pwEntry);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void CommitDelete()
|
|
||||||
{
|
|
||||||
_pwEntry.ParentGroup.Entries.Remove(_pwEntry);
|
|
||||||
if (_app.Database.RecycleBinEnabled && !PreviousGroup.IsSelected) _app.Database.RecycleBin.AddPwEntry(_pwEntry);
|
|
||||||
else _app.Database.AddDeletedItem(IdUuid);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Save()
|
|
||||||
{
|
|
||||||
_app.Database.Save();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,12 +1,13 @@
|
|||||||
using System.Collections.ObjectModel;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.ObjectModel;
|
||||||
|
using System.Collections.Specialized;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Threading.Tasks;
|
||||||
using Windows.UI.Text;
|
using System.Windows.Input;
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using Windows.UI.Xaml.Controls;
|
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
using ModernKeePass.Mappings;
|
using ModernKeePass.Services;
|
||||||
using ModernKeePassLib;
|
using ModernKeePassLib;
|
||||||
|
|
||||||
namespace ModernKeePass.ViewModels
|
namespace ModernKeePass.ViewModels
|
||||||
@@ -15,57 +16,69 @@ namespace ModernKeePass.ViewModels
|
|||||||
{
|
{
|
||||||
public GroupVm ParentGroup { get; private set; }
|
public GroupVm ParentGroup { get; private set; }
|
||||||
public GroupVm PreviousGroup { get; private set; }
|
public GroupVm PreviousGroup { get; private set; }
|
||||||
public ObservableCollection<EntryVm> Entries { get; set; } = new ObservableCollection<EntryVm>();
|
|
||||||
|
public ObservableCollection<EntryVm> Entries
|
||||||
|
{
|
||||||
|
get { return _entries; }
|
||||||
|
private set { SetProperty(ref _entries, value); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<EntryVm> SubEntries
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
var subEntries = new List<EntryVm>();
|
||||||
|
subEntries.AddRange(Entries);
|
||||||
|
foreach (var group in Groups)
|
||||||
|
{
|
||||||
|
subEntries.AddRange(group.SubEntries);
|
||||||
|
}
|
||||||
|
|
||||||
|
return subEntries;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public ObservableCollection<GroupVm> Groups { get; set; } = new ObservableCollection<GroupVm>();
|
public ObservableCollection<GroupVm> Groups { get; set; } = new ObservableCollection<GroupVm>();
|
||||||
|
|
||||||
public int EntryCount => Entries.Count() - 1;
|
|
||||||
public FontWeight FontWeight => _pwGroup == null ? FontWeights.Bold : FontWeights.Normal;
|
|
||||||
public int GroupCount => Groups.Count - 1;
|
|
||||||
public PwUuid IdUuid => _pwGroup?.Uuid;
|
public PwUuid IdUuid => _pwGroup?.Uuid;
|
||||||
public string Id => IdUuid?.ToHexString();
|
public string Id => IdUuid?.ToHexString();
|
||||||
public bool IsNotRoot => ParentGroup != null;
|
public bool IsNotRoot => ParentGroup != null;
|
||||||
|
|
||||||
public bool ShowRestore => IsNotRoot && ParentGroup.IsSelected;
|
public bool ShowRestore => IsNotRoot && ParentGroup.IsSelected;
|
||||||
|
|
||||||
|
public bool IsRecycleOnDelete => _database.RecycleBinEnabled && !IsSelected && !ParentGroup.IsSelected;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Is the Group the database Recycle Bin?
|
/// Is the Group the database Recycle Bin?
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsSelected
|
public bool IsSelected
|
||||||
{
|
{
|
||||||
get { return _app.Database.RecycleBinEnabled && _app.Database.RecycleBin?.Id == Id; }
|
get { return _database != null && _database.RecycleBinEnabled && _database.RecycleBin?.Id == Id; }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (value && _pwGroup != null) _app.Database.RecycleBin = this;
|
if (value && _pwGroup != null) _database.RecycleBin = this;
|
||||||
/*else if (value && _pwGroup == null)
|
|
||||||
{
|
|
||||||
var recycleBin = _app.Database.RootGroup.AddNewGroup("Recycle bin");
|
|
||||||
recycleBin.IsSelected = true;
|
|
||||||
recycleBin.IconSymbol = Symbol.Delete;
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public IOrderedEnumerable<IGrouping<char, EntryVm>> EntriesZoomedOut => from e in Entries
|
public IOrderedEnumerable<IGrouping<char, EntryVm>> EntriesZoomedOut => from e in Entries
|
||||||
where !e.IsFirstItem
|
group e by e.Name.ToUpper().FirstOrDefault() into grp
|
||||||
group e by e.Name.FirstOrDefault() into grp
|
|
||||||
orderby grp.Key
|
orderby grp.Key
|
||||||
select grp;
|
select grp;
|
||||||
|
|
||||||
public string Name
|
public string Name
|
||||||
{
|
{
|
||||||
get { return _pwGroup == null ? "< New group >" : _pwGroup.Name; }
|
get { return _pwGroup == null ? string.Empty : _pwGroup.Name; }
|
||||||
set { _pwGroup.Name = value; }
|
set { _pwGroup.Name = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public Symbol IconSymbol
|
public int IconId
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (_pwGroup == null) return Symbol.Add;
|
if (_pwGroup?.IconId != null) return (int) _pwGroup?.IconId;
|
||||||
var result = PwIconToSegoeMapping.GetSymbolFromIcon(_pwGroup.IconId);
|
return -1;
|
||||||
return result == Symbol.More ? Symbol.Folder : result;
|
|
||||||
}
|
}
|
||||||
set { _pwGroup.IconId = PwIconToSegoeMapping.GetIconFromSymbol(value); }
|
set { _pwGroup.IconId = (PwIcon)value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsEditMode
|
public bool IsEditMode
|
||||||
@@ -74,33 +87,80 @@ namespace ModernKeePass.ViewModels
|
|||||||
set { SetProperty(ref _isEditMode, value); }
|
set { SetProperty(ref _isEditMode, value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Path
|
public bool IsMenuClosed
|
||||||
|
{
|
||||||
|
get { return _isMenuClosed; }
|
||||||
|
set { SetProperty(ref _isMenuClosed, value); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<IPwEntity> BreadCrumb
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (ParentGroup == null) return string.Empty;
|
var groups = new Stack<GroupVm>();
|
||||||
var path = new StringBuilder(ParentGroup.Path);
|
var group = this;
|
||||||
path.Append($" > {ParentGroup.Name}");
|
while (group.ParentGroup != null)
|
||||||
return path.ToString();
|
{
|
||||||
|
group = group.ParentGroup;
|
||||||
|
groups.Push(group);
|
||||||
|
}
|
||||||
|
|
||||||
|
return groups;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ICommand SaveCommand { get; }
|
||||||
|
public ICommand SortEntriesCommand { get; }
|
||||||
|
public ICommand SortGroupsCommand { get; }
|
||||||
|
public ICommand UndoDeleteCommand { get; }
|
||||||
|
public ICommand GoBackCommand { get; set; }
|
||||||
|
|
||||||
private readonly PwGroup _pwGroup;
|
private readonly PwGroup _pwGroup;
|
||||||
private readonly App _app = Application.Current as App;
|
private readonly IDatabaseService _database;
|
||||||
private bool _isEditMode;
|
private bool _isEditMode;
|
||||||
|
private PwEntry _reorderedEntry;
|
||||||
|
private ObservableCollection<EntryVm> _entries = new ObservableCollection<EntryVm>();
|
||||||
|
private bool _isMenuClosed = true;
|
||||||
|
|
||||||
public GroupVm() {}
|
public GroupVm() {}
|
||||||
|
|
||||||
public GroupVm(PwGroup pwGroup, GroupVm parent, PwUuid recycleBinId = null)
|
internal GroupVm(PwGroup pwGroup, GroupVm parent, PwUuid recycleBinId = null) : this(pwGroup, parent,
|
||||||
|
DatabaseService.Instance, recycleBinId)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
public GroupVm(PwGroup pwGroup, GroupVm parent, IDatabaseService database, PwUuid recycleBinId = null)
|
||||||
{
|
{
|
||||||
_pwGroup = pwGroup;
|
_pwGroup = pwGroup;
|
||||||
|
_database = database;
|
||||||
ParentGroup = parent;
|
ParentGroup = parent;
|
||||||
|
|
||||||
if (recycleBinId != null && _pwGroup.Uuid.Equals(recycleBinId)) _app.Database.RecycleBin = this;
|
SaveCommand = new RelayCommand(() => _database.Save());
|
||||||
Entries = new ObservableCollection<EntryVm>(pwGroup.Entries.Select(e => new EntryVm(e, this)).OrderBy(e => e.Name));
|
SortEntriesCommand = new RelayCommand(async () =>
|
||||||
Entries.Insert(0, new EntryVm ());
|
await SortEntriesAsync().ConfigureAwait(false));
|
||||||
Groups = new ObservableCollection<GroupVm>(pwGroup.Groups.Select(g => new GroupVm(g, this, recycleBinId)).OrderBy(g => g.Name));
|
SortGroupsCommand = new RelayCommand(async () =>
|
||||||
Groups.Insert(0, new GroupVm ());
|
await SortGroupsAsync().ConfigureAwait(false));
|
||||||
|
UndoDeleteCommand = new RelayCommand(() => Move(PreviousGroup));
|
||||||
|
|
||||||
|
if (recycleBinId != null && _pwGroup.Uuid.Equals(recycleBinId)) _database.RecycleBin = this;
|
||||||
|
Entries = new ObservableCollection<EntryVm>(pwGroup.Entries.Select(e => new EntryVm(e, this)));
|
||||||
|
Entries.CollectionChanged += Entries_CollectionChanged;
|
||||||
|
Groups = new ObservableCollection<GroupVm>(pwGroup.Groups.Select(g => new GroupVm(g, this, recycleBinId)));
|
||||||
|
}
|
||||||
|
|
||||||
|
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 (_reorderedEntry == null) _pwGroup.AddEntry(((EntryVm) e.NewItems[0]).GetPwEntry(), true);
|
||||||
|
else _pwGroup.Entries.Insert((uint)e.NewStartingIndex, _reorderedEntry);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public GroupVm AddNewGroup(string name = "")
|
public GroupVm AddNewGroup(string name = "")
|
||||||
@@ -115,30 +175,19 @@ namespace ModernKeePass.ViewModels
|
|||||||
public EntryVm AddNewEntry()
|
public EntryVm AddNewEntry()
|
||||||
{
|
{
|
||||||
var pwEntry = new PwEntry(true, true);
|
var pwEntry = new PwEntry(true, true);
|
||||||
_pwGroup.AddEntry(pwEntry, true);
|
|
||||||
var newEntry = new EntryVm(pwEntry, this) {IsEditMode = true};
|
var newEntry = new EntryVm(pwEntry, this) {IsEditMode = true};
|
||||||
|
newEntry.GeneratePassword();
|
||||||
Entries.Add(newEntry);
|
Entries.Add(newEntry);
|
||||||
return newEntry;
|
return newEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddPwEntry(PwEntry entry)
|
public void MarkForDelete(string recycleBinTitle)
|
||||||
{
|
{
|
||||||
_pwGroup.AddEntry(entry, true);
|
if (_database.RecycleBinEnabled && _database.RecycleBin?.IdUuid == null)
|
||||||
|
_database.CreateRecycleBin(recycleBinTitle);
|
||||||
|
Move(_database.RecycleBinEnabled && !IsSelected ? _database.RecycleBin : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RemovePwEntry(PwEntry entry)
|
|
||||||
{
|
|
||||||
_pwGroup.Entries.Remove(entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void MarkForDelete()
|
|
||||||
{
|
|
||||||
if (_app.Database.RecycleBinEnabled && _app.Database.RecycleBin?.IdUuid == null)
|
|
||||||
_app.Database.CreateRecycleBin();
|
|
||||||
Move(_app.Database.RecycleBinEnabled && !IsSelected ? _app.Database.RecycleBin : null);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void UndoDelete()
|
public void UndoDelete()
|
||||||
{
|
{
|
||||||
Move(PreviousGroup);
|
Move(PreviousGroup);
|
||||||
@@ -151,7 +200,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
PreviousGroup._pwGroup.Groups.Remove(_pwGroup);
|
PreviousGroup._pwGroup.Groups.Remove(_pwGroup);
|
||||||
if (destination == null)
|
if (destination == null)
|
||||||
{
|
{
|
||||||
_app.Database.AddDeletedItem(IdUuid);
|
_database.AddDeletedItem(IdUuid);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ParentGroup = destination;
|
ParentGroup = destination;
|
||||||
@@ -162,18 +211,42 @@ namespace ModernKeePass.ViewModels
|
|||||||
public void CommitDelete()
|
public void CommitDelete()
|
||||||
{
|
{
|
||||||
_pwGroup.ParentGroup.Groups.Remove(_pwGroup);
|
_pwGroup.ParentGroup.Groups.Remove(_pwGroup);
|
||||||
if (_app.Database.RecycleBinEnabled && !PreviousGroup.IsSelected) _app.Database.RecycleBin._pwGroup.AddGroup(_pwGroup, true);
|
if (_database.RecycleBinEnabled && !PreviousGroup.IsSelected) _database.RecycleBin._pwGroup.AddGroup(_pwGroup, true);
|
||||||
else _app.Database.AddDeletedItem(IdUuid);
|
else _database.AddDeletedItem(IdUuid);
|
||||||
}
|
|
||||||
|
|
||||||
public void Save()
|
|
||||||
{
|
|
||||||
_app.Database.Save();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return Name;
|
return Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task SortEntriesAsync()
|
||||||
|
{
|
||||||
|
var comparer = new PwEntryComparer(PwDefs.TitleField, true, false);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_pwGroup.Entries.Sort(comparer);
|
||||||
|
Entries = new ObservableCollection<EntryVm>(Entries.OrderBy(e => e.Name));
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
await MessageDialogHelper.ShowErrorDialog(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task SortGroupsAsync()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_pwGroup.SortSubGroups(false);
|
||||||
|
Groups = new ObservableCollection<GroupVm>(Groups.OrderBy(g => g.Name).ThenBy(g => g._pwGroup == null));
|
||||||
|
OnPropertyChanged("Groups");
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
await MessageDialogHelper.ShowErrorDialog(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -11,7 +11,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
|
|
||||||
public string Title { get; set; }
|
public string Title { get; set; }
|
||||||
|
|
||||||
public int Group { get; set; } = 0;
|
public string Group { get; set; } = "_";
|
||||||
public Type PageType { get; set; }
|
public Type PageType { get; set; }
|
||||||
public Symbol SymbolIcon { get; set; }
|
public Symbol SymbolIcon { get; set; }
|
||||||
public bool IsEnabled { get; set; } = true;
|
public bool IsEnabled { get; set; } = true;
|
||||||
|
@@ -1,22 +1,15 @@
|
|||||||
using Windows.Storage;
|
using System.Threading.Tasks;
|
||||||
|
using Windows.Storage;
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using Windows.Storage.AccessCache;
|
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
|
using ModernKeePass.Services;
|
||||||
|
|
||||||
namespace ModernKeePass.ViewModels
|
namespace ModernKeePass.ViewModels
|
||||||
{
|
{
|
||||||
public class RecentItemVm: NotifyPropertyChangedBase, ISelectableModel
|
public class RecentItemVm: NotifyPropertyChangedBase, ISelectableModel, IRecentItem
|
||||||
{
|
{
|
||||||
private bool _isSelected;
|
private bool _isSelected;
|
||||||
|
|
||||||
public RecentItemVm() {}
|
|
||||||
public RecentItemVm(AccessListEntry entry, StorageFile file)
|
|
||||||
{
|
|
||||||
Token = entry.Token;
|
|
||||||
Name = entry.Metadata;
|
|
||||||
DatabaseFile = file;
|
|
||||||
}
|
|
||||||
|
|
||||||
public StorageFile DatabaseFile { get; }
|
public StorageFile DatabaseFile { get; }
|
||||||
public string Token { get; }
|
public string Token { get; }
|
||||||
public string Name { get; }
|
public string Name { get; }
|
||||||
@@ -27,5 +20,23 @@ namespace ModernKeePass.ViewModels
|
|||||||
get { return _isSelected; }
|
get { return _isSelected; }
|
||||||
set { SetProperty(ref _isSelected, value); }
|
set { SetProperty(ref _isSelected, value); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public RecentItemVm() {}
|
||||||
|
public RecentItemVm(string token, string metadata, IStorageItem file)
|
||||||
|
{
|
||||||
|
Token = token;
|
||||||
|
Name = metadata;
|
||||||
|
DatabaseFile = file as StorageFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateAccessTime()
|
||||||
|
{
|
||||||
|
UpdateAccessTime(RecentService.Instance).Wait();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateAccessTime(IRecentService recent)
|
||||||
|
{
|
||||||
|
await recent.GetFileAsync(Token);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -2,29 +2,37 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Windows.Storage;
|
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
|
using ModernKeePass.Services;
|
||||||
using ModernKeePassLib;
|
using ModernKeePassLib;
|
||||||
using ModernKeePassLib.Cryptography.Cipher;
|
using ModernKeePassLib.Cryptography.Cipher;
|
||||||
using ModernKeePassLib.Cryptography.KeyDerivation;
|
using ModernKeePassLib.Cryptography.KeyDerivation;
|
||||||
|
|
||||||
namespace ModernKeePass.ViewModels
|
namespace ModernKeePass.ViewModels
|
||||||
{
|
{
|
||||||
|
// TODO: implement Kdf settings
|
||||||
public class SettingsDatabaseVm: NotifyPropertyChangedBase, IHasSelectableObject
|
public class SettingsDatabaseVm: NotifyPropertyChangedBase, IHasSelectableObject
|
||||||
{
|
{
|
||||||
private readonly App _app = Application.Current as App;
|
private readonly IDatabaseService _database;
|
||||||
private readonly ApplicationDataContainer _localSettings = ApplicationData.Current.LocalSettings;
|
|
||||||
private GroupVm _selectedItem;
|
private GroupVm _selectedItem;
|
||||||
|
|
||||||
public bool HasRecycleBin
|
public bool HasRecycleBin
|
||||||
{
|
{
|
||||||
get { return _app.Database.RecycleBinEnabled; }
|
get { return _database.RecycleBinEnabled; }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
_app.Database.RecycleBinEnabled = value;
|
_database.RecycleBinEnabled = value;
|
||||||
OnPropertyChanged();
|
OnPropertyChanged("HasRecycleBin");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsNewRecycleBin
|
||||||
|
{
|
||||||
|
get { return _database.RecycleBin == null; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (value) _database.RecycleBin = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,26 +55,26 @@ namespace ModernKeePass.ViewModels
|
|||||||
{
|
{
|
||||||
for (var inx = 0; inx < CipherPool.GlobalPool.EngineCount; ++inx)
|
for (var inx = 0; inx < CipherPool.GlobalPool.EngineCount; ++inx)
|
||||||
{
|
{
|
||||||
if (CipherPool.GlobalPool[inx].CipherUuid.Equals(_app.Database.DataCipher)) return inx;
|
if (CipherPool.GlobalPool[inx].CipherUuid.Equals(_database.DataCipher)) return inx;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
set { _app.Database.DataCipher = CipherPool.GlobalPool[value].CipherUuid; }
|
set { _database.DataCipher = CipherPool.GlobalPool[value].CipherUuid; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public IEnumerable<string> Compressions => Enum.GetNames(typeof(PwCompressionAlgorithm)).Take((int)PwCompressionAlgorithm.Count);
|
public IEnumerable<string> Compressions => Enum.GetNames(typeof(PwCompressionAlgorithm)).Take((int)PwCompressionAlgorithm.Count);
|
||||||
|
|
||||||
public string CompressionName
|
public string CompressionName
|
||||||
{
|
{
|
||||||
get { return Enum.GetName(typeof(PwCompressionAlgorithm), _app.Database.CompressionAlgorithm); }
|
get { return Enum.GetName(typeof(PwCompressionAlgorithm), _database.CompressionAlgorithm); }
|
||||||
set { _app.Database.CompressionAlgorithm = (PwCompressionAlgorithm)Enum.Parse(typeof(PwCompressionAlgorithm), value); }
|
set { _database.CompressionAlgorithm = (PwCompressionAlgorithm)Enum.Parse(typeof(PwCompressionAlgorithm), value); }
|
||||||
}
|
}
|
||||||
public IEnumerable<string> KeyDerivations => KdfPool.Engines.Select(e => e.Name);
|
public IEnumerable<string> KeyDerivations => KdfPool.Engines.Select(e => e.Name);
|
||||||
|
|
||||||
public string KeyDerivationName
|
public string KeyDerivationName
|
||||||
{
|
{
|
||||||
get { return KdfPool.Get(_app.Database.KeyDerivation.KdfUuid).Name; }
|
get { return KdfPool.Get(_database.KeyDerivation.KdfUuid).Name; }
|
||||||
set { _app.Database.KeyDerivation = KdfPool.Engines.FirstOrDefault(e => e.Name == value)?.GetDefaultParameters(); }
|
set { _database.KeyDerivation = KdfPool.Engines.FirstOrDefault(e => e.Name == value)?.GetDefaultParameters(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
public ISelectableModel SelectedItem
|
public ISelectableModel SelectedItem
|
||||||
@@ -74,7 +82,7 @@ namespace ModernKeePass.ViewModels
|
|||||||
get { return Groups.FirstOrDefault(g => g.IsSelected); }
|
get { return Groups.FirstOrDefault(g => g.IsSelected); }
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
if (_selectedItem == value) return;
|
if (_selectedItem == value || IsNewRecycleBin) return;
|
||||||
if (_selectedItem != null)
|
if (_selectedItem != null)
|
||||||
{
|
{
|
||||||
_selectedItem.IsSelected = false;
|
_selectedItem.IsSelected = false;
|
||||||
@@ -89,22 +97,12 @@ namespace ModernKeePass.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public SettingsDatabaseVm()
|
public SettingsDatabaseVm() : this(DatabaseService.Instance) { }
|
||||||
{
|
|
||||||
Groups = _app?.Database.RootGroup.Groups;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Move to another setting class (or a static class)
|
public SettingsDatabaseVm(IDatabaseService database)
|
||||||
private T GetSetting<T>(string property)
|
|
||||||
{
|
{
|
||||||
try
|
_database = database;
|
||||||
{
|
Groups = _database?.RootGroup.Groups;
|
||||||
return (T) Convert.ChangeType(_localSettings.Values[property], typeof(T));
|
|
||||||
}
|
|
||||||
catch (InvalidCastException)
|
|
||||||
{
|
|
||||||
return default(T);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
33
ModernKeePass/ViewModels/Items/SettingsNewVm.cs
Normal file
33
ModernKeePass/ViewModels/Items/SettingsNewVm.cs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using ModernKeePass.Interfaces;
|
||||||
|
using ModernKeePass.Services;
|
||||||
|
|
||||||
|
namespace ModernKeePass.ViewModels
|
||||||
|
{
|
||||||
|
public class SettingsNewVm
|
||||||
|
{
|
||||||
|
private readonly ISettingsService _settings;
|
||||||
|
|
||||||
|
public SettingsNewVm() : this(SettingsService.Instance)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
public SettingsNewVm(ISettingsService settings)
|
||||||
|
{
|
||||||
|
_settings = settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsCreateSample
|
||||||
|
{
|
||||||
|
get { return _settings.GetSetting<bool>("Sample"); }
|
||||||
|
set { _settings.PutSetting("Sample", value); }
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<string> FileFormats => new []{"2", "4"};
|
||||||
|
|
||||||
|
public string FileFormatVersion
|
||||||
|
{
|
||||||
|
get { return _settings.GetSetting<string>("DefaultFileFormat"); }
|
||||||
|
set { _settings.PutSetting("DefaultFileFormat", value); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
24
ModernKeePass/ViewModels/Items/SettingsSaveVm.cs
Normal file
24
ModernKeePass/ViewModels/Items/SettingsSaveVm.cs
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
using ModernKeePass.Interfaces;
|
||||||
|
using ModernKeePass.Services;
|
||||||
|
|
||||||
|
namespace ModernKeePass.ViewModels
|
||||||
|
{
|
||||||
|
public class SettingsSaveVm
|
||||||
|
{
|
||||||
|
private readonly ISettingsService _settings;
|
||||||
|
|
||||||
|
public SettingsSaveVm() : this(SettingsService.Instance)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
public SettingsSaveVm(ISettingsService settings)
|
||||||
|
{
|
||||||
|
_settings = settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsSaveSuspend
|
||||||
|
{
|
||||||
|
get { return _settings.GetSetting("SaveSuspend", true); }
|
||||||
|
set { _settings.PutSetting("SaveSuspend", value); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,23 +1,23 @@
|
|||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using Windows.ApplicationModel;
|
using Windows.ApplicationModel;
|
||||||
using Windows.Storage.AccessCache;
|
using Windows.Storage;
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using Windows.UI.Xaml.Controls;
|
using Windows.UI.Xaml.Controls;
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
using ModernKeePass.Pages;
|
using ModernKeePass.Services;
|
||||||
|
using ModernKeePass.Views;
|
||||||
|
|
||||||
namespace ModernKeePass.ViewModels
|
namespace ModernKeePass.ViewModels
|
||||||
{
|
{
|
||||||
public class MainVm : NotifyPropertyChangedBase, IHasSelectableObject
|
public class MainVm : NotifyPropertyChangedBase, IHasSelectableObject
|
||||||
{
|
{
|
||||||
private IOrderedEnumerable<IGrouping<int, MainMenuItemVm>> _mainMenuItems;
|
private IOrderedEnumerable<IGrouping<string, MainMenuItemVm>> _mainMenuItems;
|
||||||
private MainMenuItemVm _selectedItem;
|
private MainMenuItemVm _selectedItem;
|
||||||
|
|
||||||
public string Name { get; } = Package.Current.DisplayName;
|
public string Name { get; } = Package.Current.DisplayName;
|
||||||
|
|
||||||
public IOrderedEnumerable<IGrouping<int, MainMenuItemVm>> MainMenuItems
|
public IOrderedEnumerable<IGrouping<string, MainMenuItemVm>> MainMenuItems
|
||||||
{
|
{
|
||||||
get { return _mainMenuItems; }
|
get { return _mainMenuItems; }
|
||||||
set { SetProperty(ref _mainMenuItems, value); }
|
set { SetProperty(ref _mainMenuItems, value); }
|
||||||
@@ -45,47 +45,89 @@ namespace ModernKeePass.ViewModels
|
|||||||
|
|
||||||
public MainVm() {}
|
public MainVm() {}
|
||||||
|
|
||||||
public MainVm(Frame referenceFrame, Frame destinationFrame)
|
internal MainVm(Frame referenceFrame, Frame destinationFrame, StorageFile databaseFile = null) : this(referenceFrame, destinationFrame,
|
||||||
|
DatabaseService.Instance, new ResourcesService(), RecentService.Instance, databaseFile)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
public MainVm(Frame referenceFrame, Frame destinationFrame, IDatabaseService database, IResourceService resource, IRecentService recent, StorageFile databaseFile = null)
|
||||||
{
|
{
|
||||||
var app = (App)Application.Current;
|
var isDatabaseOpen = database != null && database.IsOpen;
|
||||||
var mru = StorageApplicationPermissions.MostRecentlyUsedList;
|
|
||||||
var isDatabaseOpen = app.Database != null && app.Database.Status == DatabaseHelper.DatabaseStatus.Opened;
|
|
||||||
|
|
||||||
var mainMenuItems = new ObservableCollection<MainMenuItemVm>
|
var mainMenuItems = new ObservableCollection<MainMenuItemVm>
|
||||||
{
|
{
|
||||||
new MainMenuItemVm
|
new MainMenuItemVm
|
||||||
{
|
{
|
||||||
Title = "Open", PageType = typeof(OpenDatabasePage), Destination = destinationFrame, Parameter = referenceFrame, SymbolIcon = Symbol.Page2,
|
Title = resource.GetResourceValue("MainMenuItemOpen"),
|
||||||
IsSelected = app.Database.Status == DatabaseHelper.DatabaseStatus.Opening
|
PageType = typeof(OpenDatabasePage),
|
||||||
|
Destination = destinationFrame,
|
||||||
|
Parameter = databaseFile,
|
||||||
|
SymbolIcon = Symbol.Page2,
|
||||||
|
IsSelected = databaseFile != null
|
||||||
},
|
},
|
||||||
new MainMenuItemVm
|
new MainMenuItemVm
|
||||||
{
|
{
|
||||||
Title = "New" , PageType = typeof(NewDatabasePage), Destination = destinationFrame, Parameter = referenceFrame, SymbolIcon = Symbol.Add
|
Title = resource.GetResourceValue("MainMenuItemNew"),
|
||||||
|
PageType = typeof(NewDatabasePage),
|
||||||
|
Destination = destinationFrame,
|
||||||
|
Parameter = referenceFrame,
|
||||||
|
SymbolIcon = Symbol.Add
|
||||||
},
|
},
|
||||||
new MainMenuItemVm
|
new MainMenuItemVm
|
||||||
{
|
{
|
||||||
Title = "Save" , PageType = typeof(SaveDatabasePage), Destination = destinationFrame, Parameter = referenceFrame, SymbolIcon = Symbol.Save,
|
Title = resource.GetResourceValue("MainMenuItemSave"),
|
||||||
IsSelected = isDatabaseOpen, IsEnabled = isDatabaseOpen
|
PageType = typeof(SaveDatabasePage),
|
||||||
},
|
Destination = destinationFrame,
|
||||||
new MainMenuItemVm {
|
Parameter = referenceFrame,
|
||||||
Title = "Recent" , PageType = typeof(RecentDatabasesPage), Destination = destinationFrame, Parameter = referenceFrame, SymbolIcon = Symbol.Copy,
|
SymbolIcon = Symbol.Save,
|
||||||
IsSelected = (app.Database == null || app.Database.Status == DatabaseHelper.DatabaseStatus.Closed) && mru.Entries.Count > 0, IsEnabled = mru.Entries.Count > 0
|
IsSelected = isDatabaseOpen,
|
||||||
|
IsEnabled = isDatabaseOpen
|
||||||
},
|
},
|
||||||
new MainMenuItemVm
|
new MainMenuItemVm
|
||||||
{
|
{
|
||||||
Title = "About" , PageType = typeof(AboutPage), Destination = destinationFrame, SymbolIcon = Symbol.Help
|
Title = resource.GetResourceValue("MainMenuItemRecent"),
|
||||||
|
PageType = typeof(RecentDatabasesPage),
|
||||||
|
Destination = destinationFrame,
|
||||||
|
Parameter = referenceFrame,
|
||||||
|
SymbolIcon = Symbol.Copy,
|
||||||
|
IsSelected =
|
||||||
|
(database == null || !database.IsOpen) &&
|
||||||
|
recent.EntryCount > 0,
|
||||||
|
IsEnabled = recent.EntryCount > 0
|
||||||
|
},
|
||||||
|
new MainMenuItemVm
|
||||||
|
{
|
||||||
|
Title = resource.GetResourceValue("MainMenuItemSettings"),
|
||||||
|
PageType = typeof(SettingsPage),
|
||||||
|
Destination = referenceFrame,
|
||||||
|
SymbolIcon = Symbol.Setting
|
||||||
|
},
|
||||||
|
new MainMenuItemVm
|
||||||
|
{
|
||||||
|
Title = resource.GetResourceValue("MainMenuItemAbout"),
|
||||||
|
PageType = typeof(AboutPage),
|
||||||
|
Destination = destinationFrame,
|
||||||
|
SymbolIcon = Symbol.Help
|
||||||
|
},
|
||||||
|
new MainMenuItemVm
|
||||||
|
{
|
||||||
|
Title = resource.GetResourceValue("MainMenuItemDonate"),
|
||||||
|
PageType = typeof(DonatePage),
|
||||||
|
Destination = destinationFrame,
|
||||||
|
SymbolIcon = Symbol.Shop
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
// Auto-select the Recent Items menu item if the conditions are met
|
// Auto-select the Recent Items menu item if the conditions are met
|
||||||
SelectedItem = mainMenuItems.FirstOrDefault(m => m.IsSelected);
|
SelectedItem = mainMenuItems.FirstOrDefault(m => m.IsSelected);
|
||||||
if (app.Database != null && app.Database.Status == DatabaseHelper.DatabaseStatus.Opened)
|
|
||||||
|
// Add currently opened database to the menu
|
||||||
|
if (database != null && database.IsOpen)
|
||||||
mainMenuItems.Add(new MainMenuItemVm
|
mainMenuItems.Add(new MainMenuItemVm
|
||||||
{
|
{
|
||||||
Title = app.Database.Name,
|
Title = database.Name,
|
||||||
PageType = typeof(GroupDetailPage),
|
PageType = typeof(GroupDetailPage),
|
||||||
Destination = referenceFrame,
|
Destination = referenceFrame,
|
||||||
Parameter = app.Database.RootGroup,
|
Parameter = database.RootGroup,
|
||||||
Group = 1,
|
Group = "Databases",
|
||||||
SymbolIcon = Symbol.ProtectedDocument
|
SymbolIcon = Symbol.ProtectedDocument
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -1,50 +1,43 @@
|
|||||||
using System.ComponentModel;
|
using Windows.Storage;
|
||||||
using Windows.Storage;
|
|
||||||
using Windows.Storage.AccessCache;
|
|
||||||
using Windows.UI.Xaml;
|
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
|
using ModernKeePass.Interfaces;
|
||||||
|
using ModernKeePass.Services;
|
||||||
|
|
||||||
namespace ModernKeePass.ViewModels
|
namespace ModernKeePass.ViewModels
|
||||||
{
|
{
|
||||||
public class OpenVm: INotifyPropertyChanged
|
public class OpenVm: NotifyPropertyChangedBase
|
||||||
{
|
{
|
||||||
public bool ShowPasswordBox
|
public bool IsFileSelected => DatabaseFile != null;
|
||||||
{
|
|
||||||
get { return ((App)Application.Current).Database.Status == DatabaseHelper.DatabaseStatus.Opening; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Name
|
public string Name => DatabaseFile?.DisplayName;
|
||||||
{
|
|
||||||
get { return ((App)Application.Current).Database.Name; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public OpenVm()
|
public StorageFile DatabaseFile { get; private set; }
|
||||||
{
|
|
||||||
var app = Application.Current as App;
|
|
||||||
if (app?.Database == null || app.Database.Status != DatabaseHelper.DatabaseStatus.Opening) return;
|
|
||||||
OpenFile(app.Database.DatabaseFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
public event PropertyChangedEventHandler PropertyChanged;
|
public OpenVm() : this(null) { }
|
||||||
|
|
||||||
protected void NotifyPropertyChanged(string propertyName)
|
public OpenVm(StorageFile file)
|
||||||
{
|
{
|
||||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
if (!IsFileSelected) return;
|
||||||
|
OpenFile(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OpenFile(StorageFile file)
|
public void OpenFile(StorageFile file)
|
||||||
{
|
{
|
||||||
var database = ((App)Application.Current).Database;
|
OpenFile(file, RecentService.Instance);
|
||||||
database.DatabaseFile = file;
|
|
||||||
NotifyPropertyChanged("Name");
|
|
||||||
NotifyPropertyChanged("ShowPasswordBox");
|
|
||||||
AddToRecentList(file);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddToRecentList(StorageFile file)
|
public void OpenFile(StorageFile file, IRecentService recent)
|
||||||
{
|
{
|
||||||
var mru = StorageApplicationPermissions.MostRecentlyUsedList;
|
DatabaseFile = file;
|
||||||
mru.Add(file, file.DisplayName);
|
OnPropertyChanged("Name");
|
||||||
|
OnPropertyChanged("IsFileSelected");
|
||||||
|
OnPropertyChanged("DatabaseFile");
|
||||||
|
AddToRecentList(file, recent);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddToRecentList(StorageFile file, IRecentService recent)
|
||||||
|
{
|
||||||
|
recent.Add(file, file.DisplayName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,17 +1,18 @@
|
|||||||
using System;
|
using System.Collections.ObjectModel;
|
||||||
using System.Collections.ObjectModel;
|
using System.Windows.Input;
|
||||||
using Windows.Storage.AccessCache;
|
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
|
using ModernKeePass.Services;
|
||||||
|
|
||||||
namespace ModernKeePass.ViewModels
|
namespace ModernKeePass.ViewModels
|
||||||
{
|
{
|
||||||
public class RecentVm : NotifyPropertyChangedBase, IHasSelectableObject
|
public class RecentVm : NotifyPropertyChangedBase, IHasSelectableObject
|
||||||
{
|
{
|
||||||
|
private readonly IRecentService _recent;
|
||||||
private ISelectableModel _selectedItem;
|
private ISelectableModel _selectedItem;
|
||||||
private ObservableCollection<RecentItemVm> _recentItems = new ObservableCollection<RecentItemVm>();
|
private ObservableCollection<IRecentItem> _recentItems = new ObservableCollection<IRecentItem>();
|
||||||
|
|
||||||
public ObservableCollection<RecentItemVm> RecentItems
|
public ObservableCollection<IRecentItem> RecentItems
|
||||||
{
|
{
|
||||||
get { return _recentItems; }
|
get { return _recentItems; }
|
||||||
set { SetProperty(ref _recentItems, value); }
|
set { SetProperty(ref _recentItems, value); }
|
||||||
@@ -35,25 +36,25 @@ namespace ModernKeePass.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public RecentVm()
|
public ICommand ClearAllCommand { get; }
|
||||||
|
|
||||||
|
public RecentVm() : this (RecentService.Instance)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
public RecentVm(IRecentService recent)
|
||||||
{
|
{
|
||||||
// TODO: opening the files actually changes the MRU order
|
_recent = recent;
|
||||||
var mru = StorageApplicationPermissions.MostRecentlyUsedList;
|
ClearAllCommand = new RelayCommand(ClearAll);
|
||||||
foreach (var entry in mru.Entries)
|
|
||||||
{
|
RecentItems = _recent.GetAllFiles();
|
||||||
try
|
|
||||||
{
|
|
||||||
var file = mru.GetFileAsync(entry.Token).GetAwaiter().GetResult();
|
|
||||||
RecentItems.Add(new RecentItemVm(entry, file));
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
mru.Remove(entry.Token);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (RecentItems.Count > 0)
|
if (RecentItems.Count > 0)
|
||||||
SelectedItem = RecentItems[0];
|
SelectedItem = RecentItems[0] as RecentItemVm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ClearAll()
|
||||||
|
{
|
||||||
|
_recent.ClearAll();
|
||||||
|
RecentItems.Clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,20 +1,28 @@
|
|||||||
using Windows.Storage;
|
using Windows.Storage;
|
||||||
using Windows.UI.Xaml;
|
using ModernKeePass.Interfaces;
|
||||||
|
using ModernKeePass.Services;
|
||||||
|
|
||||||
namespace ModernKeePass.ViewModels
|
namespace ModernKeePass.ViewModels
|
||||||
{
|
{
|
||||||
public class SaveVm
|
public class SaveVm
|
||||||
{
|
{
|
||||||
public void Save(bool close = true)
|
private readonly IDatabaseService _database;
|
||||||
|
public SaveVm() : this(DatabaseService.Instance) { }
|
||||||
|
|
||||||
|
public SaveVm(IDatabaseService database)
|
||||||
{
|
{
|
||||||
var app = (App)Application.Current;
|
_database = database;
|
||||||
if (close && app.Database.Save()) app.Database.Close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void Save(StorageFile file)
|
public void Save(bool close = true)
|
||||||
{
|
{
|
||||||
var app = (App)Application.Current;
|
_database.Save();
|
||||||
app.Database.Save(file);
|
if (close) _database.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Save(StorageFile file)
|
||||||
|
{
|
||||||
|
_database.Save(file);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -3,15 +3,23 @@ using System.Linq;
|
|||||||
using Windows.UI.Xaml.Controls;
|
using Windows.UI.Xaml.Controls;
|
||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
using ModernKeePass.Pages;
|
using ModernKeePass.Views;
|
||||||
|
using ModernKeePass.Services;
|
||||||
|
|
||||||
namespace ModernKeePass.ViewModels
|
namespace ModernKeePass.ViewModels
|
||||||
{
|
{
|
||||||
public class SettingsVM : NotifyPropertyChangedBase, IHasSelectableObject
|
public class SettingsVm : NotifyPropertyChangedBase, IHasSelectableObject
|
||||||
{
|
{
|
||||||
private ListMenuItemVm _selectedItem;
|
private ListMenuItemVm _selectedItem;
|
||||||
|
|
||||||
public ObservableCollection<ListMenuItemVm> MenuItems { get; set; }
|
private IOrderedEnumerable<IGrouping<string, ListMenuItemVm>> _menuItems;
|
||||||
|
|
||||||
|
public IOrderedEnumerable<IGrouping<string, ListMenuItemVm>> MenuItems
|
||||||
|
{
|
||||||
|
get { return _menuItems; }
|
||||||
|
set { SetProperty(ref _menuItems, value); }
|
||||||
|
}
|
||||||
|
|
||||||
public ISelectableModel SelectedItem
|
public ISelectableModel SelectedItem
|
||||||
{
|
{
|
||||||
get { return _selectedItem; }
|
get { return _selectedItem; }
|
||||||
@@ -32,15 +40,47 @@ namespace ModernKeePass.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public SettingsVM()
|
public SettingsVm() : this(DatabaseService.Instance, new ResourcesService()) { }
|
||||||
|
|
||||||
|
public SettingsVm(IDatabaseService database, IResourceService resource)
|
||||||
{
|
{
|
||||||
MenuItems = new ObservableCollection<ListMenuItemVm>
|
var menuItems = new ObservableCollection<ListMenuItemVm>
|
||||||
{
|
{
|
||||||
new ListMenuItemVm { Title = "Database", SymbolIcon = Symbol.Setting, PageType = typeof(SettingsDatabasePage), IsSelected = true },
|
new ListMenuItemVm
|
||||||
new ListMenuItemVm { Title = "Security", SymbolIcon = Symbol.Permissions, PageType = typeof(SettingsSecurityPage) },
|
{
|
||||||
//new ListMenuItemVm { Title = "General", SymbolIcon = Symbol.Edit, PageType = typeof(SettingsGeneralPage) }
|
Title = resource.GetResourceValue("SettingsMenuItemNew"),
|
||||||
|
Group = resource.GetResourceValue("SettingsMenuGroupApplication"),
|
||||||
|
SymbolIcon = Symbol.Add,
|
||||||
|
PageType = typeof(SettingsNewDatabasePage),
|
||||||
|
IsSelected = true
|
||||||
|
},
|
||||||
|
new ListMenuItemVm
|
||||||
|
{
|
||||||
|
Title = resource.GetResourceValue("SettingsMenuItemSave"),
|
||||||
|
Group = resource.GetResourceValue("SettingsMenuGroupApplication"),
|
||||||
|
SymbolIcon = Symbol.Save,
|
||||||
|
PageType = typeof(SettingsSavePage)
|
||||||
|
},
|
||||||
|
new ListMenuItemVm
|
||||||
|
{
|
||||||
|
Title = resource.GetResourceValue("SettingsMenuItemGeneral"),
|
||||||
|
Group = resource.GetResourceValue("SettingsMenuGroupDatabase"),
|
||||||
|
SymbolIcon = Symbol.Setting,
|
||||||
|
PageType = typeof(SettingsDatabasePage),
|
||||||
|
IsEnabled = database.IsOpen
|
||||||
|
},
|
||||||
|
new ListMenuItemVm
|
||||||
|
{
|
||||||
|
Title = resource.GetResourceValue("SettingsMenuItemSecurity"),
|
||||||
|
Group = resource.GetResourceValue("SettingsMenuGroupDatabase"),
|
||||||
|
SymbolIcon = Symbol.Permissions,
|
||||||
|
PageType = typeof(SettingsSecurityPage),
|
||||||
|
IsEnabled = database.IsOpen
|
||||||
|
}
|
||||||
};
|
};
|
||||||
SelectedItem = MenuItems.FirstOrDefault(m => m.IsSelected);
|
SelectedItem = menuItems.FirstOrDefault(m => m.IsSelected);
|
||||||
|
|
||||||
|
MenuItems = from item in menuItems group item by item.Group into grp orderby grp.Key select grp;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -6,7 +6,7 @@ using Windows.UI.Xaml.Navigation;
|
|||||||
using ModernKeePass.Common;
|
using ModernKeePass.Common;
|
||||||
using ModernKeePass.Interfaces;
|
using ModernKeePass.Interfaces;
|
||||||
|
|
||||||
namespace ModernKeePass.Pages.BasePages
|
namespace ModernKeePass.Views.BasePages
|
||||||
{
|
{
|
||||||
public class LayoutAwarePageBase: Page
|
public class LayoutAwarePageBase: Page
|
||||||
{
|
{
|
||||||
@@ -62,24 +62,21 @@ namespace ModernKeePass.Pages.BasePages
|
|||||||
/// session. The state will be null the first time a page is visited.</param>
|
/// session. The state will be null the first time a page is visited.</param>
|
||||||
protected void navigationHelper_LoadState(object sender, LoadStateEventArgs e)
|
protected void navigationHelper_LoadState(object sender, LoadStateEventArgs e)
|
||||||
{
|
{
|
||||||
// TODO: Assign a bindable group to Me.DefaultViewModel("Group")
|
|
||||||
// TODO: Assign a collection of bindable items to Me.DefaultViewModel("Items")
|
|
||||||
|
|
||||||
if (e.PageState == null)
|
if (e.PageState == null)
|
||||||
{
|
{
|
||||||
// When this is a new page, select the first item automatically unless logical page
|
// When this is a new page, select the first item automatically unless logical page
|
||||||
// navigation is being used (see the logical page navigation #region below.)
|
// navigation is being used (see the logical page navigation #region below.)
|
||||||
if (!UsingLogicalPageNavigation() && ListViewSource.View != null)
|
if (!UsingLogicalPageNavigation())
|
||||||
{
|
{
|
||||||
ListViewSource.View.MoveCurrentToFirst();
|
ListViewSource.View?.MoveCurrentToFirst();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Restore the previously saved state associated with this page
|
// Restore the previously saved state associated with this page
|
||||||
if (e.PageState.ContainsKey("SelectedItem") && ListViewSource.View != null)
|
if (e.PageState.ContainsKey("SelectedItem"))
|
||||||
{
|
{
|
||||||
ListViewSource.View.MoveCurrentTo(e.PageState["SelectedItem"]);
|
ListViewSource.View?.MoveCurrentTo(e.PageState["SelectedItem"]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -9,21 +9,25 @@
|
|||||||
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
|
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
|
||||||
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
|
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
|
||||||
xmlns:actions="using:ModernKeePass.Actions"
|
xmlns:actions="using:ModernKeePass.Actions"
|
||||||
|
xmlns:userControls="using:ModernKeePass.Views.UserControls"
|
||||||
x:Name="PageRoot"
|
x:Name="PageRoot"
|
||||||
x:Class="ModernKeePass.Pages.EntryDetailPage"
|
x:Class="ModernKeePass.Views.EntryDetailPage"
|
||||||
mc:Ignorable="d">
|
mc:Ignorable="d"
|
||||||
|
SizeChanged="EntryDetailPage_OnSizeChanged">
|
||||||
<Page.Resources>
|
<Page.Resources>
|
||||||
<converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
|
<converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" />
|
||||||
<converters:InverseBooleanToVisibilityConverter x:Key="InverseBooleanToVisibilityConverter" />
|
<converters:InverseBooleanToVisibilityConverter x:Key="InverseBooleanToVisibilityConverter" />
|
||||||
<converters:ProgressBarLegalValuesConverter x:Key="ProgressBarLegalValuesConverter" />
|
<converters:ProgressBarLegalValuesConverter x:Key="ProgressBarLegalValuesConverter" />
|
||||||
<converters:DoubleToSolidColorBrushConverter x:Key="DoubleToForegroungBrushComplexityConverter" />
|
<converters:DoubleToSolidColorBrushConverter x:Key="DoubleToForegroungBrushComplexityConverter" />
|
||||||
<converters:NullToBooleanConverter x:Key="NullToBooleanConverter" />
|
<converters:NullToBooleanConverter x:Key="NullToBooleanConverter" />
|
||||||
|
<converters:ColorToBrushConverter x:Key="ColorToBrushConverter" />
|
||||||
|
<converters:IntToSymbolConverter x:Key="IntToSymbolConverter" />
|
||||||
<Style TargetType="PasswordBox" x:Name="PasswordBoxWithButtonStyle">
|
<Style TargetType="PasswordBox" x:Name="PasswordBoxWithButtonStyle">
|
||||||
<Setter Property="MinWidth" Value="{ThemeResource TextControlThemeMinWidth}" />
|
<Setter Property="MinWidth" Value="{ThemeResource TextControlThemeMinWidth}" />
|
||||||
<Setter Property="MinHeight" Value="{ThemeResource TextControlThemeMinHeight}" />
|
<Setter Property="MinHeight" Value="{ThemeResource TextControlThemeMinHeight}" />
|
||||||
<Setter Property="Foreground" Value="{ThemeResource TextBoxForegroundThemeBrush}" />
|
<Setter Property="Foreground" Value="{ThemeResource TextBoxForegroundThemeBrush}" />
|
||||||
<Setter Property="Background" Value="{ThemeResource TextBoxBackgroundThemeBrush}" />
|
<Setter Property="Background" Value="{ThemeResource TextBoxBackgroundThemeBrush}" />
|
||||||
<Setter Property="SelectionHighlightColor" Value="{ThemeResource TextSelectionHighlightColorThemeBrush}" />
|
<Setter Property="SelectionHighlightColor" Value="{ThemeResource MainColor}" />
|
||||||
<Setter Property="BorderBrush" Value="{ThemeResource TextBoxBorderThemeBrush}" />
|
<Setter Property="BorderBrush" Value="{ThemeResource TextBoxBorderThemeBrush}" />
|
||||||
<Setter Property="BorderThickness" Value="{ThemeResource TextControlBorderThemeThickness}" />
|
<Setter Property="BorderThickness" Value="{ThemeResource TextControlBorderThemeThickness}" />
|
||||||
<Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}" />
|
<Setter Property="FontFamily" Value="{ThemeResource ContentControlThemeFontFamily}" />
|
||||||
@@ -114,7 +118,7 @@
|
|||||||
<Storyboard>
|
<Storyboard>
|
||||||
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundElement"
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="BackgroundElement"
|
||||||
Storyboard.TargetProperty="Background">
|
Storyboard.TargetProperty="Background">
|
||||||
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource TextBoxButtonPressedBackgroundThemeBrush}" />
|
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource MainColor}" />
|
||||||
</ObjectAnimationUsingKeyFrames>
|
</ObjectAnimationUsingKeyFrames>
|
||||||
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="BorderElement"
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="BorderElement"
|
||||||
Storyboard.TargetProperty="BorderBrush">
|
Storyboard.TargetProperty="BorderBrush">
|
||||||
@@ -271,16 +275,17 @@
|
|||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
Background="{TemplateBinding Background}"
|
Background="{TemplateBinding Background}"
|
||||||
Margin="{TemplateBinding BorderThickness}"
|
Margin="{TemplateBinding BorderThickness}"
|
||||||
Grid.ColumnSpan="3"
|
Grid.ColumnSpan="3"/>
|
||||||
Grid.RowSpan="1"/>
|
|
||||||
<Border x:Name="BorderElement"
|
<Border x:Name="BorderElement"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
|
Grid.Column="0"
|
||||||
BorderBrush="{TemplateBinding BorderBrush}"
|
BorderBrush="{TemplateBinding BorderBrush}"
|
||||||
BorderThickness="{TemplateBinding BorderThickness}"
|
BorderThickness="{TemplateBinding BorderThickness}"
|
||||||
Grid.ColumnSpan="3"
|
Grid.ColumnSpan="3"/>
|
||||||
Grid.RowSpan="1"/>
|
<ContentPresenter
|
||||||
<ContentPresenter x:Name="HeaderContentPresenter"
|
x:Name="HeaderContentPresenter"
|
||||||
Grid.Row="0"
|
Grid.Row="0"
|
||||||
|
Grid.Column="0"
|
||||||
Foreground="{ThemeResource TextBoxForegroundHeaderThemeBrush}"
|
Foreground="{ThemeResource TextBoxForegroundHeaderThemeBrush}"
|
||||||
Margin="0,4,0,4"
|
Margin="0,4,0,4"
|
||||||
Grid.ColumnSpan="3"
|
Grid.ColumnSpan="3"
|
||||||
@@ -289,6 +294,7 @@
|
|||||||
FontWeight="Semilight" />
|
FontWeight="Semilight" />
|
||||||
<ScrollViewer x:Name="ContentElement"
|
<ScrollViewer x:Name="ContentElement"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
|
Grid.Column="0"
|
||||||
HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}"
|
HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}"
|
||||||
HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
|
HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}"
|
||||||
VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}"
|
VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}"
|
||||||
@@ -300,8 +306,10 @@
|
|||||||
IsTabStop="False"
|
IsTabStop="False"
|
||||||
ZoomMode="Disabled"
|
ZoomMode="Disabled"
|
||||||
AutomationProperties.AccessibilityView="Raw"/>
|
AutomationProperties.AccessibilityView="Raw"/>
|
||||||
<ContentControl x:Name="PlaceholderTextContentPresenter"
|
<ContentControl
|
||||||
|
x:Name="PlaceholderTextContentPresenter"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
|
Grid.Column="0"
|
||||||
Foreground="{ThemeResource TextBoxPlaceholderTextThemeBrush}"
|
Foreground="{ThemeResource TextBoxPlaceholderTextThemeBrush}"
|
||||||
Margin="{TemplateBinding BorderThickness}"
|
Margin="{TemplateBinding BorderThickness}"
|
||||||
Padding="{TemplateBinding Padding}"
|
Padding="{TemplateBinding Padding}"
|
||||||
@@ -337,30 +345,27 @@
|
|||||||
</interactivity:Interaction.Behaviors>
|
</interactivity:Interaction.Behaviors>
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<TextBlock>
|
<TextBlock>
|
||||||
<Run Text="Password Length: "/>
|
<Run x:Uid="PasswordGeneratorLength" />
|
||||||
<Run Text="{Binding PasswordLength}" />
|
<Run Text="{Binding PasswordLength}" />
|
||||||
</TextBlock>
|
</TextBlock>
|
||||||
<Slider Value="{Binding PasswordLength, Mode=TwoWay}" Margin="0,-10,0,-20" />
|
<Slider Value="{Binding PasswordLength, Mode=TwoWay}" Margin="0,-10,0,-20" />
|
||||||
<CheckBox IsChecked="{Binding UpperCasePatternSelected, Mode=TwoWay}" Content="Upper case (A, B, C, ...)"/>
|
<CheckBox IsChecked="{Binding UpperCasePatternSelected, Mode=TwoWay}" x:Uid="PasswordGeneratorUpper" />
|
||||||
<CheckBox IsChecked="{Binding LowerCasePatternSelected, Mode=TwoWay}" Content="Lower case (a, b, c, ...)"/>
|
<CheckBox IsChecked="{Binding LowerCasePatternSelected, Mode=TwoWay}" x:Uid="PasswordGeneratorLower" />
|
||||||
<CheckBox IsChecked="{Binding DigitsPatternSelected, Mode=TwoWay}" Content="Digits (0, 1, 2, ...)"/>
|
<CheckBox IsChecked="{Binding DigitsPatternSelected, Mode=TwoWay}" x:Uid="PasswordGeneratorDigits" />
|
||||||
<CheckBox IsChecked="{Binding MinusPatternSelected, Mode=TwoWay}" Content="Minus (-)"/>
|
<CheckBox IsChecked="{Binding MinusPatternSelected, Mode=TwoWay}" x:Uid="PasswordGeneratorMinus" />
|
||||||
<CheckBox IsChecked="{Binding UnderscorePatternSelected, Mode=TwoWay}" Content="Underscore (_)"/>
|
<CheckBox IsChecked="{Binding UnderscorePatternSelected, Mode=TwoWay}" x:Uid="PasswordGeneratorUnderscore" />
|
||||||
<CheckBox IsChecked="{Binding SpacePatternSelected, Mode=TwoWay}" Content="Space ( )"/>
|
<CheckBox IsChecked="{Binding SpacePatternSelected, Mode=TwoWay}" x:Uid="PasswordGeneratorSpace" />
|
||||||
<CheckBox IsChecked="{Binding SpecialPatternSelected, Mode=TwoWay}" Content="Special (!, $, %, ...)"/>
|
<CheckBox IsChecked="{Binding SpecialPatternSelected, Mode=TwoWay}" x:Uid="PasswordGeneratorSpecial" />
|
||||||
<CheckBox IsChecked="{Binding BracketsPatternSelected, Mode=TwoWay}" Content="Brackets ([], {}, (), ...)"/>
|
<CheckBox IsChecked="{Binding BracketsPatternSelected, Mode=TwoWay}" x:Uid="PasswordGeneratorBrackets" />
|
||||||
<TextBlock Text="Also add these characters:" Margin="0,5,0,0"/>
|
<TextBlock x:Uid="PasswordGeneratorAlso" Margin="0,5,0,0"/>
|
||||||
<TextBox Text="{Binding CustomChars, Mode=TwoWay}" />
|
<TextBox Text="{Binding CustomChars, Mode=TwoWay}" />
|
||||||
<Button Content="Generate">
|
<Button x:Uid="PasswordGeneratorButton" Command="{Binding GeneratePasswordCommand}" />
|
||||||
<interactivity:Interaction.Behaviors>
|
|
||||||
<core:EventTriggerBehavior EventName="Click">
|
|
||||||
<core:CallMethodAction TargetObject="{Binding}" MethodName="GeneratePassword"/>
|
|
||||||
</core:EventTriggerBehavior>
|
|
||||||
</interactivity:Interaction.Behaviors>
|
|
||||||
</Button>
|
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Flyout>
|
</Flyout>
|
||||||
</Button.Flyout>
|
</Button.Flyout>
|
||||||
|
<ToolTipService.ToolTip>
|
||||||
|
<ToolTip x:Uid="PasswordGeneratorTooltip" />
|
||||||
|
</ToolTipService.ToolTip>
|
||||||
</Button>
|
</Button>
|
||||||
</Grid>
|
</Grid>
|
||||||
</ControlTemplate>
|
</ControlTemplate>
|
||||||
@@ -371,42 +376,6 @@
|
|||||||
<Page.DataContext>
|
<Page.DataContext>
|
||||||
<viewModels:EntryVm />
|
<viewModels:EntryVm />
|
||||||
</Page.DataContext>
|
</Page.DataContext>
|
||||||
<Page.BottomAppBar>
|
|
||||||
<CommandBar x:Name="CommandBar" VerticalAlignment="Center">
|
|
||||||
<CommandBar.SecondaryCommands>
|
|
||||||
<AppBarButton Icon="Save" Label="Save">
|
|
||||||
<interactivity:Interaction.Behaviors>
|
|
||||||
<core:EventTriggerBehavior EventName="Click">
|
|
||||||
<core:CallMethodAction TargetObject="{Binding}" MethodName="Save"/>
|
|
||||||
<core:ChangePropertyAction TargetObject="{Binding ElementName=CommandBar}" PropertyName="IsOpen" Value="False" />
|
|
||||||
</core:EventTriggerBehavior>
|
|
||||||
</interactivity:Interaction.Behaviors>
|
|
||||||
</AppBarButton>
|
|
||||||
<AppBarButton Icon="Setting" Label="Settings">
|
|
||||||
<interactivity:Interaction.Behaviors>
|
|
||||||
<core:EventTriggerBehavior EventName="Click">
|
|
||||||
<core:NavigateToPageAction TargetPage="ModernKeePass.Pages.SettingsPage" />
|
|
||||||
</core:EventTriggerBehavior>
|
|
||||||
</interactivity:Interaction.Behaviors>
|
|
||||||
</AppBarButton>
|
|
||||||
</CommandBar.SecondaryCommands>
|
|
||||||
<AppBarToggleButton Icon="Edit" Label="Edit" IsChecked="{Binding IsEditMode, Mode=TwoWay}">
|
|
||||||
<interactivity:Interaction.Behaviors>
|
|
||||||
<core:EventTriggerBehavior EventName="Click">
|
|
||||||
<core:ChangePropertyAction TargetObject="{Binding ElementName=CommandBar}" PropertyName="IsOpen" Value="False" />
|
|
||||||
</core:EventTriggerBehavior>
|
|
||||||
</interactivity:Interaction.Behaviors>
|
|
||||||
</AppBarToggleButton>
|
|
||||||
<AppBarButton Icon="Undo" Label="Restore" Visibility="{Binding ParentGroup.IsSelected, Converter={StaticResource BooleanToVisibilityConverter}}" IsEnabled="{Binding PreviousGroup, Converter={StaticResource NullToBooleanConverter}}" Click="RestoreButton_Click">
|
|
||||||
<interactivity:Interaction.Behaviors>
|
|
||||||
<core:EventTriggerBehavior EventName="Click">
|
|
||||||
<core:CallMethodAction MethodName="UndoDelete" TargetObject="{Binding}" />
|
|
||||||
</core:EventTriggerBehavior>
|
|
||||||
</interactivity:Interaction.Behaviors>
|
|
||||||
</AppBarButton>
|
|
||||||
<AppBarButton Icon="Delete" Label="Delete" Click="DeleteButton_Click" />
|
|
||||||
</CommandBar>
|
|
||||||
</Page.BottomAppBar>
|
|
||||||
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
|
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
|
||||||
<Grid.ChildrenTransitions>
|
<Grid.ChildrenTransitions>
|
||||||
<TransitionCollection>
|
<TransitionCollection>
|
||||||
@@ -414,11 +383,18 @@
|
|||||||
</TransitionCollection>
|
</TransitionCollection>
|
||||||
</Grid.ChildrenTransitions>
|
</Grid.ChildrenTransitions>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="50"/>
|
<RowDefinition Height="{StaticResource MenuGridLength}"/>
|
||||||
<RowDefinition Height="*"/>
|
<RowDefinition Height="*"/>
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
|
<Grid Grid.Row="1">
|
||||||
<StackPanel x:Name="stackPanel" Grid.Row="1" Margin="20,0,0,0" >
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="{StaticResource MenuGridLength}" x:Name="LeftListViewColumn" />
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<userControls:HamburgerMenuUserControl x:Uid="HistoryLeftListView" ItemsSource="{Binding History}" ResizeTarget="{Binding ElementName=LeftListViewColumn}" SelectionChanged="HamburgerMenuUserControl_OnSelectionChanged" />
|
||||||
|
<Grid x:Name="StackPanel" Grid.Column="1">
|
||||||
|
<ScrollViewer VerticalScrollBarVisibility="Auto">
|
||||||
|
<StackPanel Margin="20,0,0,20">
|
||||||
<StackPanel.Resources>
|
<StackPanel.Resources>
|
||||||
<Style TargetType="TextBlock">
|
<Style TargetType="TextBlock">
|
||||||
<Setter Property="Margin" Value="0,20,0,0"/>
|
<Setter Property="Margin" Value="0,20,0,0"/>
|
||||||
@@ -427,81 +403,174 @@
|
|||||||
<Setter Property="Margin" Value="0,20,0,0"/>
|
<Setter Property="Margin" Value="0,20,0,0"/>
|
||||||
</Style>
|
</Style>
|
||||||
</StackPanel.Resources>
|
</StackPanel.Resources>
|
||||||
<TextBlock TextWrapping="Wrap" Text="User name or login" FontSize="18"/>
|
<TextBlock x:Uid="EntryLogin" TextWrapping="Wrap" FontSize="18" />
|
||||||
<local:TextBoxWithButton HorizontalAlignment="Left" Text="{Binding UserName, Mode=TwoWay}" Width="350" Height="32" Style="{StaticResource TextBoxWithButtonStyle}" ButtonSymbol="">
|
<local:TextBoxWithButton HorizontalAlignment="Left" Text="{Binding UserName, Mode=TwoWay}" Width="350" Height="32" Style="{StaticResource TextBoxWithButtonStyle}" SelectionHighlightColor="{StaticResource MainColor}" ButtonSymbol="" ButtonTooltip="Copy" IsEnabled="{Binding IsSelected}">
|
||||||
<interactivity:Interaction.Behaviors>
|
<interactivity:Interaction.Behaviors>
|
||||||
<core:EventTriggerBehavior EventName="ButtonClick">
|
<core:EventTriggerBehavior EventName="ButtonClick">
|
||||||
<actions:ClipboardAction Text="{Binding UserName}" />
|
<actions:ClipboardAction Text="{Binding UserName}" />
|
||||||
|
<actions:ToastAction x:Uid="ToastCopyLogin" Title="{Binding Name}" />
|
||||||
</core:EventTriggerBehavior>
|
</core:EventTriggerBehavior>
|
||||||
</interactivity:Interaction.Behaviors>
|
</interactivity:Interaction.Behaviors>
|
||||||
</local:TextBoxWithButton>
|
</local:TextBoxWithButton>
|
||||||
<TextBlock TextWrapping="Wrap" Text="Password" FontSize="18"/>
|
<TextBlock x:Uid="EntryPassword" TextWrapping="Wrap" FontSize="18" />
|
||||||
<PasswordBox HorizontalAlignment="Left" Password="{Binding Password, Mode=TwoWay}" Width="350" Height="32" IsPasswordRevealButtonEnabled="True" Visibility="{Binding IsRevealPassword, Converter={StaticResource InverseBooleanToVisibilityConverter}}" Style="{StaticResource PasswordBoxWithButtonStyle}" />
|
<PasswordBox HorizontalAlignment="Left" Password="{Binding Password, Mode=TwoWay}" Width="350" Height="32" IsPasswordRevealButtonEnabled="True" Visibility="{Binding IsRevealPassword, Converter={StaticResource InverseBooleanToVisibilityConverter}}" Style="{StaticResource PasswordBoxWithButtonStyle}" IsEnabled="{Binding IsSelected}" />
|
||||||
<local:TextBoxWithButton HorizontalAlignment="Left" Text="{Binding Password, Mode=TwoWay}" Width="350" Height="32" Visibility="{Binding IsRevealPassword, Converter={StaticResource BooleanToVisibilityConverter}}" Style="{StaticResource TextBoxWithButtonStyle}" ButtonSymbol="">
|
<local:TextBoxWithButton HorizontalAlignment="Left" Text="{Binding Password, Mode=TwoWay}" Width="350" Height="32" Visibility="{Binding IsRevealPassword, Converter={StaticResource BooleanToVisibilityConverter}}" Style="{StaticResource TextBoxWithButtonStyle}" SelectionHighlightColor="{StaticResource MainColor}" ButtonSymbol="" ButtonTooltip="Copy" IsEnabled="{Binding IsSelected}">
|
||||||
<interactivity:Interaction.Behaviors>
|
<interactivity:Interaction.Behaviors>
|
||||||
<core:EventTriggerBehavior EventName="ButtonClick">
|
<core:EventTriggerBehavior EventName="ButtonClick">
|
||||||
<actions:ClipboardAction Text="{Binding Password}" />
|
<actions:ClipboardAction Text="{Binding Password}" />
|
||||||
|
<actions:ToastAction x:Uid="ToastCopyPassword" Title="{Binding Name}" />
|
||||||
</core:EventTriggerBehavior>
|
</core:EventTriggerBehavior>
|
||||||
</interactivity:Interaction.Behaviors>
|
</interactivity:Interaction.Behaviors>
|
||||||
</local:TextBoxWithButton>
|
</local:TextBoxWithButton>
|
||||||
<ProgressBar Value="{Binding PasswordComplexityIndicator, ConverterParameter=0\,128, Converter={StaticResource ProgressBarLegalValuesConverter}}" Maximum="128" Width="350" HorizontalAlignment="Left" Foreground="{Binding PasswordComplexityIndicator, ConverterParameter=128, Converter={StaticResource DoubleToForegroungBrushComplexityConverter}}" />
|
<ProgressBar Value="{Binding PasswordComplexityIndicator, ConverterParameter=0\,128, Converter={StaticResource ProgressBarLegalValuesConverter}}" Maximum="128" Width="350" HorizontalAlignment="Left" Foreground="{Binding PasswordComplexityIndicator, ConverterParameter=128, Converter={StaticResource DoubleToForegroungBrushComplexityConverter}}" />
|
||||||
<CheckBox HorizontalAlignment="Left" Margin="-3,0,0,0" Content="Show password" IsChecked="{Binding IsRevealPassword, Mode=TwoWay}" IsEnabled="{Binding IsRevealPasswordEnabled}" />
|
<CheckBox x:Uid="EntryShowPassword" HorizontalAlignment="Left" Margin="-3,0,0,0" IsChecked="{Binding IsRevealPassword, Mode=TwoWay}" IsEnabled="{Binding IsRevealPasswordEnabled}" />
|
||||||
<TextBlock TextWrapping="Wrap" Text="URL" FontSize="18"/>
|
<TextBlock TextWrapping="Wrap" Text="URL" FontSize="18"/>
|
||||||
<local:TextBoxWithButton x:Name="UrlTextBox" HorizontalAlignment="Left" Text="{Binding Url, Mode=TwoWay}" Height="32" Width="350" MaxLength="256" Style="{StaticResource TextBoxWithButtonStyle}" ButtonClick="UrlButton_Click" ButtonSymbol="" />
|
<local:TextBoxWithButton HorizontalAlignment="Left" Text="{Binding Url, Mode=TwoWay}" Height="32" Width="350" MaxLength="256" Style="{StaticResource TextBoxWithButtonStyle}" SelectionHighlightColor="{StaticResource MainColor}" ButtonSymbol="" ButtonTooltip="Navigate to URL" IsEnabled="{Binding IsSelected}">
|
||||||
<TextBlock TextWrapping="Wrap" Text="Notes" FontSize="18"/>
|
<interactivity:Interaction.Behaviors>
|
||||||
<TextBox HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding Notes, Mode=TwoWay}" Width="350" Height="200" AcceptsReturn="True" IsSpellCheckEnabled="True" />
|
<core:EventTriggerBehavior EventName="ButtonClick">
|
||||||
<CheckBox FontSize="18" IsChecked="{Binding HasExpirationDate, Mode=TwoWay}" Content="Expiration date"/>
|
<actions:NavigateToUrlAction Url="{Binding Url}" />
|
||||||
<StackPanel Orientation="Horizontal" IsHitTestVisible="{Binding HasExpirationDate}">
|
</core:EventTriggerBehavior>
|
||||||
<SymbolIcon Symbol="Important" Foreground="DarkRed" Visibility="{Binding HasExpired, Converter={StaticResource BooleanToVisibilityConverter}}">
|
</interactivity:Interaction.Behaviors>
|
||||||
|
</local:TextBoxWithButton>
|
||||||
|
<TextBlock x:Uid="EntryNotes" TextWrapping="Wrap" FontSize="18" />
|
||||||
|
<TextBox HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding Notes, Mode=TwoWay}" Width="350" Height="200" AcceptsReturn="True" IsSpellCheckEnabled="True" IsEnabled="{Binding IsSelected}" />
|
||||||
|
<CheckBox x:Uid="EntryExpirationDate" FontSize="18" IsChecked="{Binding HasExpirationDate, Mode=TwoWay}" IsEnabled="{Binding IsSelected}" />
|
||||||
|
<Grid>
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<SymbolIcon Grid.Column="0" Symbol="Important" Foreground="DarkRed" Visibility="{Binding HasExpired, Converter={StaticResource BooleanToVisibilityConverter}}">
|
||||||
<ToolTipService.ToolTip>
|
<ToolTipService.ToolTip>
|
||||||
<ToolTip Content="Password has expired" />
|
<ToolTip x:Uid="EntryExpirationTooltip" />
|
||||||
</ToolTipService.ToolTip>
|
</ToolTipService.ToolTip>
|
||||||
</SymbolIcon>
|
</SymbolIcon>
|
||||||
<DatePicker Margin="0,0,20,0" Date="{Binding ExpiryDate, Mode=TwoWay}" />
|
<StackPanel Grid.Column="1" x:Name="ExpirationDatePanel" Orientation="Horizontal" Visibility="{Binding HasExpirationDate, Converter={StaticResource BooleanToVisibilityConverter}}">
|
||||||
<TimePicker Time="{Binding ExpiryTime, Mode=TwoWay}"/>
|
<DatePicker Margin="0,0,20,0" Date="{Binding ExpiryDate, Mode=TwoWay}" Style="{StaticResource MainColorDatePicker}" />
|
||||||
|
<TimePicker Time="{Binding ExpiryTime, Mode=TwoWay}" Style="{StaticResource MainColorTimePicker}" />
|
||||||
|
</StackPanel>
|
||||||
|
</Grid>
|
||||||
|
<StackPanel x:Name="EditDesign" Visibility="{Binding IsEditMode, Converter={StaticResource BooleanToVisibilityConverter}}" Orientation="Horizontal">
|
||||||
|
<StackPanel Width="250" HorizontalAlignment="Left">
|
||||||
|
<TextBlock x:Uid="EntryBackgroundColor" />
|
||||||
|
<userControls:ColorPickerUserControl SelectedColor="{Binding BackgroundColor, Converter={StaticResource ColorToBrushConverter}, Mode=TwoWay}" />
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Width="250" HorizontalAlignment="Left">
|
||||||
|
<TextBlock x:Uid="EntryForegroundColor" />
|
||||||
|
<userControls:ColorPickerUserControl SelectedColor="{Binding ForegroundColor, Converter={StaticResource ColorToBrushConverter}, Mode=TwoWay}" />
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</ScrollViewer>
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
<!-- Bouton Précédent et titre de la page -->
|
<!-- Bouton Précédent et titre de la page -->
|
||||||
<Grid Grid.Row="0" Background="{ThemeResource AppBarBackgroundThemeBrush}">
|
<Grid Grid.Row="0" Background="{ThemeResource AppBarBackgroundThemeBrush}">
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
<ColumnDefinition Width="60"/>
|
<ColumnDefinition Width="{StaticResource MenuGridLength}"/>
|
||||||
<ColumnDefinition Width="*"/>
|
<ColumnDefinition Width="*"/>
|
||||||
<ColumnDefinition Width="400"/>
|
<ColumnDefinition Width="Auto"/>
|
||||||
</Grid.ColumnDefinitions>
|
</Grid.ColumnDefinitions>
|
||||||
<Button Grid.Column="0"
|
<Button Grid.Column="0"
|
||||||
x:Name="BackButton"
|
|
||||||
Command="{Binding NavigationHelper.GoBackCommand, ElementName=PageRoot}"
|
Command="{Binding NavigationHelper.GoBackCommand, ElementName=PageRoot}"
|
||||||
Height="50"
|
Height="{StaticResource MenuSize}"
|
||||||
Width="50"
|
Width="{StaticResource MenuSize}"
|
||||||
VerticalAlignment="Center"
|
|
||||||
AutomationProperties.Name="Back"
|
AutomationProperties.Name="Back"
|
||||||
AutomationProperties.AutomationId="BackButton"
|
AutomationProperties.AutomationId="BackButton"
|
||||||
AutomationProperties.ItemType="Navigation Button"
|
AutomationProperties.ItemType="Navigation Button"
|
||||||
Style="{StaticResource NoBorderButtonStyle}">
|
Style="{StaticResource NoBorderButtonStyle}">
|
||||||
<SymbolIcon Symbol="Back" />
|
<SymbolIcon Symbol="Back" />
|
||||||
</Button>
|
</Button>
|
||||||
<StackPanel Grid.Column="1" >
|
<Grid Grid.Column="1" >
|
||||||
<TextBox
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="60" />
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="40" />
|
||||||
|
<RowDefinition Height="20" />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Viewbox MaxHeight="30" Width="50" Grid.Column="0" Grid.Row="0" Visibility="{Binding IsEditMode, Converter={StaticResource BooleanToVisibilityConverter}}">
|
||||||
|
<userControls:SymbolPickerUserControl Width="80" Height="40" SelectedSymbol="{Binding IconId, Converter={StaticResource IntToSymbolConverter}, Mode=TwoWay}" />
|
||||||
|
</Viewbox>
|
||||||
|
<Viewbox MaxHeight="30" Width="50" Grid.Column="0" Grid.Row="0" Visibility="{Binding IsEditMode, Converter={StaticResource InverseBooleanToVisibilityConverter}}">
|
||||||
|
<SymbolIcon Symbol="{Binding IconId, Converter={StaticResource IntToSymbolConverter}}" Width="80" Height="40" />
|
||||||
|
</Viewbox>
|
||||||
|
<TextBox Grid.Column="1" Grid.Row="0"
|
||||||
x:Name="TitleTextBox"
|
x:Name="TitleTextBox"
|
||||||
Text="{Binding Name, Mode=TwoWay}"
|
Text="{Binding Name, Mode=TwoWay}"
|
||||||
Foreground="{ThemeResource DefaultTextForegroundThemeBrush}"
|
Foreground="{ThemeResource DefaultTextForegroundThemeBrush}"
|
||||||
Background="Transparent"
|
Background="Transparent"
|
||||||
|
SelectionHighlightColor="{StaticResource MainColor}"
|
||||||
IsHitTestVisible="{Binding IsEditMode}"
|
IsHitTestVisible="{Binding IsEditMode}"
|
||||||
|
IsEnabled="{Binding IsSelected}"
|
||||||
BorderThickness="0"
|
BorderThickness="0"
|
||||||
FontSize="20"
|
FontSize="20"
|
||||||
FontWeight="SemiBold"
|
FontWeight="Light"
|
||||||
TextWrapping="NoWrap"
|
TextWrapping="NoWrap"
|
||||||
VerticalAlignment="Center"
|
VerticalAlignment="Center"
|
||||||
PlaceholderText="New entry name...">
|
x:Uid="EntryTitle">
|
||||||
<interactivity:Interaction.Behaviors>
|
<interactivity:Interaction.Behaviors>
|
||||||
<core:DataTriggerBehavior Binding="{Binding IsEditMode}" Value="True">
|
<core:DataTriggerBehavior Binding="{Binding IsEditMode}" Value="True">
|
||||||
<actions:SetupFocusAction TargetObject="{Binding ElementName=TitleTextBox}" />
|
<actions:SetupFocusAction TargetObject="{Binding ElementName=TitleTextBox}" />
|
||||||
</core:DataTriggerBehavior>
|
</core:DataTriggerBehavior>
|
||||||
</interactivity:Interaction.Behaviors>
|
</interactivity:Interaction.Behaviors>
|
||||||
</TextBox>
|
</TextBox>
|
||||||
<TextBlock FontSize="12" Text="{Binding Path}" />
|
<userControls:BreadCrumbUserControl Grid.Column="1" Grid.Row="1" ItemsSource="{Binding BreadCrumb}" Margin="5,-5,0,0" />
|
||||||
</StackPanel>
|
|
||||||
</Grid>
|
</Grid>
|
||||||
|
<userControls:TopMenuUserControl
|
||||||
|
x:Name="TopMenu" Grid.Column="2"
|
||||||
|
RestoreButtonVisibility="{Binding ParentGroup.IsSelected, Converter={StaticResource BooleanToVisibilityConverter}}"
|
||||||
|
DeleteButtonVisibility="{Binding IsSelected, Converter={StaticResource InverseBooleanToVisibilityConverter}}"
|
||||||
|
IsEditButtonChecked="{Binding IsEditMode, Mode=TwoWay}"
|
||||||
|
IsRestoreButtonEnabled="{Binding PreviousGroup, Converter={StaticResource NullToBooleanConverter}}"
|
||||||
|
SaveCommand="{Binding SaveCommand}"
|
||||||
|
RestoreCommand="{Binding UndoDeleteCommand}">
|
||||||
|
<interactivity:Interaction.Behaviors>
|
||||||
|
<core:EventTriggerBehavior EventName="DeleteButtonClick">
|
||||||
|
<actions:DeleteEntityAction Entity="{Binding}" Command="{Binding NavigationHelper.GoBackCommand, ElementName=PageRoot}" />
|
||||||
|
</core:EventTriggerBehavior>
|
||||||
|
<core:EventTriggerBehavior EventName="RestoreButtonClick">
|
||||||
|
<actions:RestoreEntityAction Entity="{Binding}" Command="{Binding NavigationHelper.GoBackCommand, ElementName=PageRoot}" />
|
||||||
|
</core:EventTriggerBehavior>
|
||||||
|
</interactivity:Interaction.Behaviors>
|
||||||
|
</userControls:TopMenuUserControl>
|
||||||
|
</Grid>
|
||||||
|
<VisualStateManager.VisualStateGroups>
|
||||||
|
<VisualStateGroup>
|
||||||
|
<VisualState x:Name="Small">
|
||||||
|
<Storyboard>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ExpirationDatePanel" Storyboard.TargetProperty="Orientation">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="Vertical"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="TopMenu" Storyboard.TargetProperty="OverflowButtonsVisibility">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="TopMenu" Storyboard.TargetProperty="MoreButtonVisibility">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="EditDesign" Storyboard.TargetProperty="Orientation">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="Vertical"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
<VisualState x:Name="Large">
|
||||||
|
<Storyboard>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ExpirationDatePanel" Storyboard.TargetProperty="Orientation">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="Horizontal"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="TopMenu" Storyboard.TargetProperty="OverflowButtonsVisibility">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="TopMenu" Storyboard.TargetProperty="MoreButtonVisibility">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="EditDesign" Storyboard.TargetProperty="Orientation">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="Horizontal"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
</VisualStateGroup>
|
||||||
|
</VisualStateManager.VisualStateGroups>
|
||||||
</Grid>
|
</Grid>
|
||||||
</Page>
|
</Page>
|
78
ModernKeePass/Views/EntryDetailPage.xaml.cs
Normal file
78
ModernKeePass/Views/EntryDetailPage.xaml.cs
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
using Windows.UI.Xaml;
|
||||||
|
using Windows.UI.Xaml.Controls;
|
||||||
|
using Windows.UI.Xaml.Navigation;
|
||||||
|
using ModernKeePass.Common;
|
||||||
|
using ModernKeePass.ViewModels;
|
||||||
|
|
||||||
|
// Pour en savoir plus sur le modèle d'élément Page Détail de l'élément, consultez la page http://go.microsoft.com/fwlink/?LinkId=234232
|
||||||
|
|
||||||
|
namespace ModernKeePass.Views
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Page affichant les détails d'un élément au sein d'un groupe, offrant la possibilité de
|
||||||
|
/// consulter les autres éléments qui appartiennent au même groupe.
|
||||||
|
/// </summary>
|
||||||
|
public sealed partial class EntryDetailPage
|
||||||
|
{
|
||||||
|
public EntryVm Model => (EntryVm) DataContext;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// NavigationHelper est utilisé sur chaque page pour faciliter la navigation et
|
||||||
|
/// gestion de la durée de vie des processus
|
||||||
|
/// </summary>
|
||||||
|
public NavigationHelper NavigationHelper { get; }
|
||||||
|
|
||||||
|
public EntryDetailPage()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
NavigationHelper = new NavigationHelper(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Inscription de NavigationHelper
|
||||||
|
|
||||||
|
/// Les méthodes fournies dans cette section sont utilisées simplement pour permettre
|
||||||
|
/// NavigationHelper pour répondre aux méthodes de navigation de la page.
|
||||||
|
///
|
||||||
|
/// La logique spécifique à la page doit être placée dans les gestionnaires d'événements pour
|
||||||
|
/// <see cref="Common.NavigationHelper.LoadState"/>
|
||||||
|
/// et <see cref="Common.NavigationHelper.SaveState"/>.
|
||||||
|
/// Le paramètre de navigation est disponible dans la méthode LoadState
|
||||||
|
/// en plus de l'état de page conservé durant une session antérieure.
|
||||||
|
|
||||||
|
protected override void OnNavigatedTo(NavigationEventArgs e)
|
||||||
|
{
|
||||||
|
NavigationHelper.OnNavigatedTo(e);
|
||||||
|
if (!(e.Parameter is EntryVm)) return;
|
||||||
|
DataContext = (EntryVm)e.Parameter;
|
||||||
|
Model.GoBackCommand = NavigationHelper.GoBackCommand;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnNavigatedFrom(NavigationEventArgs e)
|
||||||
|
{
|
||||||
|
NavigationHelper.OnNavigatedFrom(e);
|
||||||
|
Model.Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private void EntryDetailPage_OnSizeChanged(object sender, SizeChangedEventArgs e)
|
||||||
|
{
|
||||||
|
VisualStateManager.GoToState(this, e.NewSize.Width < 700 ? "Small" : "Large", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HamburgerMenuUserControl_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||||
|
{
|
||||||
|
var listView = sender as ListView;
|
||||||
|
switch (listView?.SelectedIndex)
|
||||||
|
{
|
||||||
|
case -1:
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
var entry = listView?.SelectedItem as EntryVm;
|
||||||
|
StackPanel.DataContext = entry;
|
||||||
|
TitleTextBox.DataContext = entry;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
330
ModernKeePass/Views/GroupDetailPage.xaml
Normal file
330
ModernKeePass/Views/GroupDetailPage.xaml
Normal file
@@ -0,0 +1,330 @@
|
|||||||
|
<Page
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:viewModels="using:ModernKeePass.ViewModels"
|
||||||
|
xmlns:converters="using:ModernKeePass.Converters"
|
||||||
|
xmlns:interactivity="using:Microsoft.Xaml.Interactivity"
|
||||||
|
xmlns:core="using:Microsoft.Xaml.Interactions.Core"
|
||||||
|
xmlns:actions="using:ModernKeePass.Actions"
|
||||||
|
xmlns:userControls="using:ModernKeePass.Views.UserControls"
|
||||||
|
x:Name="PageRoot"
|
||||||
|
x:Class="ModernKeePass.Views.GroupDetailPage"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
SizeChanged="GroupDetailPage_OnSizeChanged">
|
||||||
|
<Page.Resources>
|
||||||
|
<converters:ColorToBrushConverter x:Key="ColorToBrushConverter"/>
|
||||||
|
<converters:BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
|
||||||
|
<converters:InverseBooleanToVisibilityConverter x:Key="InverseBooleanToVisibilityConverter"/>
|
||||||
|
<converters:NullToBooleanConverter x:Key="NullToBooleanConverter"/>
|
||||||
|
<converters:IntToSymbolConverter x:Key="IntToSymbolConverter"/>
|
||||||
|
</Page.Resources>
|
||||||
|
<Page.DataContext>
|
||||||
|
<viewModels:GroupVm />
|
||||||
|
</Page.DataContext>
|
||||||
|
<Grid>
|
||||||
|
<Grid.Resources>
|
||||||
|
<CollectionViewSource
|
||||||
|
x:Name="EntriesViewSource"
|
||||||
|
Source="{Binding Entries}" />
|
||||||
|
<CollectionViewSource
|
||||||
|
x:Name="EntriesZoomedOutViewSource"
|
||||||
|
Source="{Binding EntriesZoomedOut}" IsSourceGrouped="True" />
|
||||||
|
</Grid.Resources>
|
||||||
|
<Grid.Background>
|
||||||
|
<StaticResource ResourceKey="ApplicationPageBackgroundThemeBrush"/>
|
||||||
|
</Grid.Background>
|
||||||
|
<Grid.ChildrenTransitions>
|
||||||
|
<TransitionCollection>
|
||||||
|
<EntranceThemeTransition/>
|
||||||
|
</TransitionCollection>
|
||||||
|
</Grid.ChildrenTransitions>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="{StaticResource MenuGridLength}"/>
|
||||||
|
<RowDefinition Height="*"/>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Grid Grid.Row="1">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="{StaticResource MenuGridLength}" x:Name="LeftListViewColumn" />
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<userControls:HamburgerMenuUserControl x:Uid="GroupsLeftListView" ItemsSource="{Binding Groups}" SelectionChanged="groups_SelectionChanged" ButtonClicked="CreateGroup_ButtonClick" ResizeTarget="{Binding ElementName=LeftListViewColumn}" IsButtonVisible="{Binding IsSelected, Converter={StaticResource InverseBooleanToVisibilityConverter}}" />
|
||||||
|
<Grid Grid.Column="1">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
<ColumnDefinition Width="Auto" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="50" />
|
||||||
|
<RowDefinition Height="*" />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<TextBlock Grid.Column="0" Grid.Row="0" x:Uid="ReorderEntriesLabel" Margin="10,10,0,0" Visibility="{Binding IsEditMode, Converter={StaticResource BooleanToVisibilityConverter}}" Style="{StaticResource BodyTextBlockStyle}" />
|
||||||
|
<!--<TextBlock Grid.Column="1" Grid.Row="0" x:Uid="EntrySymbol" Margin="40,20,0,0" Visibility="{Binding IsEditMode, Converter={StaticResource BooleanToVisibilityConverter}}" Style="{StaticResource BodyTextBlockStyle}" />-->
|
||||||
|
<HyperlinkButton Grid.Column="2" Grid.Row="0" VerticalAlignment="Top" Click="CreateEntry_ButtonClick" Visibility="{Binding IsSelected, Converter={StaticResource InverseBooleanToVisibilityConverter}}" HorizontalAlignment="Right" Foreground="{StaticResource MainColor}" Style="{StaticResource MainColorHyperlinkButton}">
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<SymbolIcon Symbol="Add">
|
||||||
|
<ToolTipService.ToolTip>
|
||||||
|
<ToolTip x:Uid="AddEntryTooltip" />
|
||||||
|
</ToolTipService.ToolTip>
|
||||||
|
</SymbolIcon>
|
||||||
|
<TextBlock x:Name="AddEntryTextBlock" x:Uid="GroupCreateEntry" VerticalAlignment="Center" Margin="10,0,0,0" />
|
||||||
|
</StackPanel>
|
||||||
|
</HyperlinkButton>
|
||||||
|
|
||||||
|
<SemanticZoom Grid.Column="0" Grid.ColumnSpan="3" Grid.Row="1" ViewChangeStarted="SemanticZoom_ViewChangeStarted" ScrollViewer.HorizontalScrollBarVisibility="Visible">
|
||||||
|
<SemanticZoom.ZoomedInView>
|
||||||
|
<!-- Horizontal scrolling grid -->
|
||||||
|
<GridView
|
||||||
|
x:Name="GridView"
|
||||||
|
ItemsSource="{Binding Source={StaticResource EntriesViewSource}}"
|
||||||
|
AutomationProperties.AutomationId="ItemGridView"
|
||||||
|
AutomationProperties.Name="Entries"
|
||||||
|
TabIndex="1"
|
||||||
|
Margin="10,0,0,0"
|
||||||
|
SelectionChanged="entries_SelectionChanged"
|
||||||
|
IsSynchronizedWithCurrentItem="False"
|
||||||
|
BorderBrush="{StaticResource ListViewItemSelectedBackgroundThemeBrush}"
|
||||||
|
AllowDrop="True"
|
||||||
|
CanReorderItems="True"
|
||||||
|
CanDragItems="True"
|
||||||
|
DragItemsStarting="GridView_DragItemsStarting">
|
||||||
|
<interactivity:Interaction.Behaviors>
|
||||||
|
<core:DataTriggerBehavior Binding="{Binding IsEditMode}" Value="False">
|
||||||
|
<actions:SetupFocusAction TargetObject="{Binding ElementName=GridView}" />
|
||||||
|
</core:DataTriggerBehavior>
|
||||||
|
</interactivity:Interaction.Behaviors>
|
||||||
|
<GridView.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<Grid Height="110" Width="480" x:Name="EntryGrid">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
<ColumnDefinition Width="*"/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Border Grid.Column="0" Background="{Binding BackgroundColor, ConverterParameter={StaticResource MainColor}, Converter={StaticResource ColorToBrushConverter}}">
|
||||||
|
<Viewbox MaxHeight="50" Width="100">
|
||||||
|
<SymbolIcon Symbol="{Binding IconId, Converter={StaticResource IntToSymbolConverter}}" Foreground="{StaticResource TextColor}" />
|
||||||
|
</Viewbox>
|
||||||
|
</Border>
|
||||||
|
<StackPanel Grid.Column="1" VerticalAlignment="Top" Margin="10,10,0,0" >
|
||||||
|
<TextBlock x:Name="NameTextBlock" Text="{Binding Name}" Style="{StaticResource TitleTextBlockStyle}" TextWrapping="NoWrap" Foreground="{Binding ForegroundColor, ConverterParameter={StaticResource TextBoxForegroundThemeBrush}, Converter={StaticResource ColorToBrushConverter}}"/>
|
||||||
|
<TextBlock Style="{StaticResource CaptionTextBlockStyle}" TextWrapping="NoWrap" />
|
||||||
|
<TextBlock Text="{Binding UserName}" Style="{StaticResource BodyTextBlockStyle}" Foreground="{Binding ForegroundColor, ConverterParameter={StaticResource TextBoxForegroundThemeBrush}, Converter={StaticResource ColorToBrushConverter}}" MaxHeight="60" />
|
||||||
|
<TextBlock Text="{Binding Url}" Style="{StaticResource BodyTextBlockStyle}" Foreground="{Binding ForegroundColor, ConverterParameter={StaticResource TextBoxForegroundThemeBrush}, Converter={StaticResource ColorToBrushConverter}}" MaxHeight="60" />
|
||||||
|
</StackPanel>
|
||||||
|
<Button Grid.Column="2" Style="{StaticResource NoBorderButtonStyle}" Background="{StaticResource AppBarBackgroundThemeBrush}" VerticalAlignment="Bottom">
|
||||||
|
<SymbolIcon Symbol="More" />
|
||||||
|
<Button.Flyout>
|
||||||
|
<MenuFlyout>
|
||||||
|
<MenuFlyoutItem x:Uid="EntryItemCopyLogin">
|
||||||
|
<interactivity:Interaction.Behaviors>
|
||||||
|
<core:EventTriggerBehavior EventName="Click">
|
||||||
|
<actions:ClipboardAction Text="{Binding UserName}" />
|
||||||
|
<actions:ToastAction x:Uid="ToastCopyLogin" Title="{Binding Name}" />
|
||||||
|
</core:EventTriggerBehavior>
|
||||||
|
</interactivity:Interaction.Behaviors>
|
||||||
|
</MenuFlyoutItem>
|
||||||
|
<MenuFlyoutItem x:Uid="EntryItemCopyPassword">
|
||||||
|
<interactivity:Interaction.Behaviors>
|
||||||
|
<core:EventTriggerBehavior EventName="Click">
|
||||||
|
<actions:ClipboardAction Text="{Binding Password}" />
|
||||||
|
<actions:ToastAction x:Uid="ToastCopyPassword" Title="{Binding Name}" />
|
||||||
|
</core:EventTriggerBehavior>
|
||||||
|
</interactivity:Interaction.Behaviors>
|
||||||
|
</MenuFlyoutItem>
|
||||||
|
<MenuFlyoutItem x:Uid="EntryItemCopyUrl">
|
||||||
|
<interactivity:Interaction.Behaviors>
|
||||||
|
<core:EventTriggerBehavior EventName="Click">
|
||||||
|
<actions:NavigateToUrlAction Url="{Binding Url}" />
|
||||||
|
<actions:ToastAction x:Uid="ToastCopyUrl" Title="{Binding Name}" />
|
||||||
|
</core:EventTriggerBehavior>
|
||||||
|
</interactivity:Interaction.Behaviors>
|
||||||
|
</MenuFlyoutItem>
|
||||||
|
</MenuFlyout>
|
||||||
|
</Button.Flyout>
|
||||||
|
</Button>
|
||||||
|
</Grid>
|
||||||
|
</DataTemplate>
|
||||||
|
</GridView.ItemTemplate>
|
||||||
|
</GridView>
|
||||||
|
</SemanticZoom.ZoomedInView>
|
||||||
|
<SemanticZoom.ZoomedOutView>
|
||||||
|
<GridView
|
||||||
|
ItemsSource="{Binding Source={StaticResource EntriesZoomedOutViewSource}}"
|
||||||
|
SelectionChanged="groups_SelectionChanged"
|
||||||
|
SelectionMode="None"
|
||||||
|
IsSynchronizedWithCurrentItem="False">
|
||||||
|
<GridView.ItemTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<StackPanel Orientation="Vertical">
|
||||||
|
<TextBlock Width="100" Text="{Binding Name}" Style="{StaticResource TitleTextBlockStyle}" TextWrapping="NoWrap"/>
|
||||||
|
</StackPanel>
|
||||||
|
</DataTemplate>
|
||||||
|
</GridView.ItemTemplate>
|
||||||
|
<GridView.GroupStyle>
|
||||||
|
<GroupStyle HidesIfEmpty="True">
|
||||||
|
<GroupStyle.HeaderTemplate>
|
||||||
|
<DataTemplate>
|
||||||
|
<Grid Background="LightGray" HorizontalAlignment="Left">
|
||||||
|
<TextBlock Text="{Binding Key}" Width="50" Margin="30" Foreground="{StaticResource MainColor}" Style="{StaticResource HeaderTextBlockStyle}" TextAlignment="Center" />
|
||||||
|
</Grid>
|
||||||
|
</DataTemplate>
|
||||||
|
</GroupStyle.HeaderTemplate>
|
||||||
|
</GroupStyle>
|
||||||
|
</GridView.GroupStyle>
|
||||||
|
</GridView>
|
||||||
|
</SemanticZoom.ZoomedOutView>
|
||||||
|
</SemanticZoom>
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
<!-- Back button and page title -->
|
||||||
|
<Grid Grid.Row="0" Background="{ThemeResource AppBarBackgroundThemeBrush}">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="{StaticResource MenuGridLength}"/>
|
||||||
|
<ColumnDefinition Width="*"/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Button Grid.Column="0"
|
||||||
|
Command="{Binding NavigationHelper.GoBackCommand, ElementName=PageRoot}"
|
||||||
|
Height="{StaticResource MenuSize}"
|
||||||
|
Width="{StaticResource MenuSize}"
|
||||||
|
AutomationProperties.Name="Back"
|
||||||
|
AutomationProperties.AutomationId="BackButton"
|
||||||
|
AutomationProperties.ItemType="Navigation Button"
|
||||||
|
Style="{StaticResource NoBorderButtonStyle}">
|
||||||
|
<SymbolIcon Symbol="Back" />
|
||||||
|
</Button>
|
||||||
|
<Grid Grid.Column="1" >
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="60" />
|
||||||
|
<ColumnDefinition Width="*" />
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="40" />
|
||||||
|
<RowDefinition Height="20" />
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Viewbox MaxHeight="30" Width="50" Grid.Column="0" Grid.Row="0" Visibility="{Binding IsEditMode, Converter={StaticResource BooleanToVisibilityConverter}}">
|
||||||
|
<userControls:SymbolPickerUserControl Width="80" Height="40" SelectedSymbol="{Binding IconId, Converter={StaticResource IntToSymbolConverter}, Mode=TwoWay}" />
|
||||||
|
</Viewbox>
|
||||||
|
<Viewbox MaxHeight="30" Width="50" Grid.Column="0" Grid.Row="0" Visibility="{Binding IsEditMode, Converter={StaticResource InverseBooleanToVisibilityConverter}}">
|
||||||
|
<SymbolIcon Symbol="{Binding IconId, Converter={StaticResource IntToSymbolConverter}}" Width="80" Height="40" />
|
||||||
|
</Viewbox>
|
||||||
|
<TextBox Grid.Column="1" Grid.Row="0"
|
||||||
|
x:Name="TitleTextBox"
|
||||||
|
Text="{Binding Name, Mode=TwoWay}"
|
||||||
|
Foreground="{ThemeResource DefaultTextForegroundThemeBrush}"
|
||||||
|
SelectionHighlightColor="{StaticResource MainColor}"
|
||||||
|
Background="Transparent"
|
||||||
|
IsHitTestVisible="{Binding IsEditMode}"
|
||||||
|
BorderThickness="0"
|
||||||
|
FontSize="20"
|
||||||
|
FontWeight="Light"
|
||||||
|
TextWrapping="NoWrap"
|
||||||
|
VerticalAlignment="Center"
|
||||||
|
x:Uid="GroupTitle">
|
||||||
|
<interactivity:Interaction.Behaviors>
|
||||||
|
<core:DataTriggerBehavior Binding="{Binding IsEditMode}" Value="True">
|
||||||
|
<actions:SetupFocusAction TargetObject="{Binding ElementName=TitleTextBox}" />
|
||||||
|
</core:DataTriggerBehavior>
|
||||||
|
</interactivity:Interaction.Behaviors>
|
||||||
|
</TextBox>
|
||||||
|
<userControls:BreadCrumbUserControl Grid.Column="1" Grid.Row="1" ItemsSource="{Binding BreadCrumb}" Margin="5,-5,0,0" />
|
||||||
|
</Grid>
|
||||||
|
<userControls:TopMenuUserControl x:Name="TopMenu" Grid.Column="2"
|
||||||
|
RestoreButtonVisibility="{Binding ShowRestore, Converter={StaticResource BooleanToVisibilityConverter}}"
|
||||||
|
DeleteButtonVisibility="{Binding IsSelected, Converter={StaticResource InverseBooleanToVisibilityConverter}}"
|
||||||
|
SortButtonVisibility="{Binding IsEditMode, Converter={StaticResource BooleanToVisibilityConverter}}"
|
||||||
|
IsEditButtonChecked="{Binding IsEditMode, Mode=TwoWay}"
|
||||||
|
IsDeleteButtonEnabled="{Binding IsNotRoot}"
|
||||||
|
IsRestoreButtonEnabled="{Binding PreviousGroup, Converter={StaticResource NullToBooleanConverter}}"
|
||||||
|
SaveCommand="{Binding SaveCommand}"
|
||||||
|
RestoreCommand="{Binding UndoDeleteCommand}"
|
||||||
|
SortEntriesCommand="{Binding SortEntriesCommand}"
|
||||||
|
SortGroupsCommand="{Binding SortGroupsCommand}">
|
||||||
|
<interactivity:Interaction.Behaviors>
|
||||||
|
<core:EventTriggerBehavior EventName="DeleteButtonClick">
|
||||||
|
<actions:DeleteEntityAction Entity="{Binding}" Command="{Binding NavigationHelper.GoBackCommand, ElementName=PageRoot}" />
|
||||||
|
</core:EventTriggerBehavior>
|
||||||
|
<core:EventTriggerBehavior EventName="RestoreButtonClick">
|
||||||
|
<actions:RestoreEntityAction Entity="{Binding}" Command="{Binding NavigationHelper.GoBackCommand, ElementName=PageRoot}" />
|
||||||
|
</core:EventTriggerBehavior>
|
||||||
|
</interactivity:Interaction.Behaviors>
|
||||||
|
</userControls:TopMenuUserControl>
|
||||||
|
<Button Grid.Column="3" x:Name="SearchButton" Style="{StaticResource NoBorderButtonStyle}" Background="{ThemeResource ToggleButtonBackgroundThemeBrush}" Height="{StaticResource MenuSize}" Padding="25,0,25,0">
|
||||||
|
<SymbolIcon Symbol="Find" />
|
||||||
|
<Button.Flyout>
|
||||||
|
<Flyout>
|
||||||
|
<Flyout.FlyoutPresenterStyle>
|
||||||
|
<Style TargetType="FlyoutPresenter">
|
||||||
|
<Setter Property="Padding" Value="0" />
|
||||||
|
</Style>
|
||||||
|
</Flyout.FlyoutPresenterStyle>
|
||||||
|
<SearchBox x:Uid="GroupSearch" Width="350" Padding="12" Background="{ThemeResource TextBoxDisabledBackgroundThemeBrush}" BorderThickness="0" FontSize="18" SuggestionsRequested="SearchBox_OnSuggestionsRequested" SearchHistoryEnabled="False" ResultSuggestionChosen="SearchBox_OnResultSuggestionChosen" Style="{StaticResource MainColorSearchBox}" />
|
||||||
|
</Flyout>
|
||||||
|
</Button.Flyout>
|
||||||
|
</Button>
|
||||||
|
<SearchBox Grid.Column="3" x:Uid="GroupSearch" x:Name="SearchBox" Padding="12" Width="350" Background="{ThemeResource TextBoxDisabledBackgroundThemeBrush}" BorderThickness="0" Margin="0,5,0,5" FontSize="15" SuggestionsRequested="SearchBox_OnSuggestionsRequested" SearchHistoryEnabled="False" ResultSuggestionChosen="SearchBox_OnResultSuggestionChosen" Style="{StaticResource MainColorSearchBox}" />
|
||||||
|
</Grid>
|
||||||
|
<VisualStateManager.VisualStateGroups>
|
||||||
|
<VisualStateGroup x:Name="DragDropGroup">
|
||||||
|
<VisualState x:Name="Dragging">
|
||||||
|
<Storyboard>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="GridView" Storyboard.TargetProperty="BorderThickness">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="2"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
<VisualState x:Name="Dropped">
|
||||||
|
<Storyboard>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="GridView" Storyboard.TargetProperty="BorderThickness">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="0"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
</VisualStateGroup>
|
||||||
|
<VisualStateGroup x:Name="TopMenuGroup">
|
||||||
|
<VisualState x:Name="Small">
|
||||||
|
<Storyboard>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="TopMenu" Storyboard.TargetProperty="OverflowButtonsVisibility">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="TopMenu" Storyboard.TargetProperty="MoreButtonVisibility">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="SearchButton" Storyboard.TargetProperty="Visibility">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="SearchBox" Storyboard.TargetProperty="Visibility">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="AddEntryTextBlock" Storyboard.TargetProperty="Visibility">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
<VisualState x:Name="Large">
|
||||||
|
<Storyboard>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="TopMenu" Storyboard.TargetProperty="OverflowButtonsVisibility">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="TopMenu" Storyboard.TargetProperty="MoreButtonVisibility">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="SearchButton" Storyboard.TargetProperty="Visibility">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="SearchBox" Storyboard.TargetProperty="Visibility">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="AddEntryTextBlock" Storyboard.TargetProperty="Visibility">
|
||||||
|
<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
|
||||||
|
</ObjectAnimationUsingKeyFrames>
|
||||||
|
</Storyboard>
|
||||||
|
</VisualState>
|
||||||
|
</VisualStateGroup>
|
||||||
|
</VisualStateManager.VisualStateGroups>
|
||||||
|
</Grid>
|
||||||
|
</Page>
|
@@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using Windows.ApplicationModel.DataTransfer;
|
||||||
using Windows.Storage.Streams;
|
using Windows.Storage.Streams;
|
||||||
using Windows.UI.Xaml;
|
using Windows.UI.Xaml;
|
||||||
using Windows.UI.Xaml.Controls;
|
using Windows.UI.Xaml.Controls;
|
||||||
@@ -10,7 +11,7 @@ using ModernKeePass.ViewModels;
|
|||||||
|
|
||||||
// The Group Detail Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234229
|
// The Group Detail Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234229
|
||||||
|
|
||||||
namespace ModernKeePass.Pages
|
namespace ModernKeePass.Views
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A page that displays an overview of a single group, including a preview of the items
|
/// A page that displays an overview of a single group, including a preview of the items
|
||||||
@@ -29,22 +30,8 @@ namespace ModernKeePass.Pages
|
|||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
NavigationHelper = new NavigationHelper(this);
|
NavigationHelper = new NavigationHelper(this);
|
||||||
NavigationHelper.LoadState += navigationHelper_LoadState;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Populates the page with content passed during navigation. Any saved state is also
|
|
||||||
/// provided when recreating a page from a prior session.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender">
|
|
||||||
/// The source of the event; typically <see cref="Common.NavigationHelper"/>
|
|
||||||
/// </param>
|
|
||||||
/// <param name="e">Event data that provides both the navigation parameter passed to
|
|
||||||
/// <see cref="Frame.Navigate(Type, object)"/> when this page was initially requested and
|
|
||||||
/// a dictionary of state preserved by this page during an earlier
|
|
||||||
/// session. The state will be null the first time a page is visited.</param>
|
|
||||||
private void navigationHelper_LoadState(object sender, LoadStateEventArgs e) {}
|
|
||||||
|
|
||||||
#region NavigationHelper registration
|
#region NavigationHelper registration
|
||||||
|
|
||||||
/// The methods provided in this section are simply used to allow
|
/// The methods provided in this section are simply used to allow
|
||||||
@@ -60,10 +47,16 @@ namespace ModernKeePass.Pages
|
|||||||
{
|
{
|
||||||
NavigationHelper.OnNavigatedTo(e);
|
NavigationHelper.OnNavigatedTo(e);
|
||||||
|
|
||||||
if (e.Parameter is PasswordEventArgs)
|
var args = e.Parameter as PasswordEventArgs;
|
||||||
DataContext = ((PasswordEventArgs) e.Parameter).RootGroup;
|
if (args != null)
|
||||||
else if (e.Parameter is GroupVm)
|
DataContext = args.RootGroup;
|
||||||
DataContext = (GroupVm) e.Parameter;
|
else
|
||||||
|
{
|
||||||
|
var vm = e.Parameter as GroupVm;
|
||||||
|
if (vm != null)
|
||||||
|
DataContext = vm;
|
||||||
|
}
|
||||||
|
Model.GoBackCommand = NavigationHelper.GoBackCommand;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void OnNavigatedFrom(NavigationEventArgs e)
|
protected override void OnNavigatedFrom(NavigationEventArgs e)
|
||||||
@@ -77,72 +70,58 @@ namespace ModernKeePass.Pages
|
|||||||
|
|
||||||
private void groups_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
private void groups_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||||
{
|
{
|
||||||
GroupVm group;
|
var listView = sender as ListView;
|
||||||
switch (LeftListView.SelectedIndex)
|
switch (listView?.SelectedIndex)
|
||||||
{
|
{
|
||||||
case -1:
|
case -1:
|
||||||
return;
|
return;
|
||||||
case 0:
|
|
||||||
group = Model.AddNewGroup();
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
group = LeftListView.SelectedItem as GroupVm;
|
var group = listView?.SelectedItem as GroupVm;
|
||||||
|
Frame.Navigate(typeof(GroupDetailPage), group);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Frame.Navigate(typeof(GroupDetailPage), group);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void entries_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
private void entries_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
||||||
{
|
{
|
||||||
EntryVm entry;
|
|
||||||
switch (GridView.SelectedIndex)
|
switch (GridView.SelectedIndex)
|
||||||
{
|
{
|
||||||
case -1:
|
case -1:
|
||||||
return;
|
return;
|
||||||
case 0:
|
|
||||||
entry = Model.AddNewEntry();
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
entry = GridView.SelectedItem as EntryVm;
|
var entry = GridView.SelectedItem as EntryVm;
|
||||||
|
Frame.Navigate(typeof(EntryDetailPage), entry);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Frame.Navigate(typeof(EntryDetailPage), entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void DeleteButton_Click(object sender, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
var isRecycleBinEnabled = ((App)Application.Current).Database.RecycleBinEnabled && !Model.IsSelected && !Model.ParentGroup.IsSelected;
|
|
||||||
var message = isRecycleBinEnabled
|
|
||||||
? "Are you sure you want to send the whole group and all its entries to the recycle bin?"
|
|
||||||
: "Are you sure you want to delete the whole group and all its entries?";
|
|
||||||
var text = isRecycleBinEnabled ? "Item moved to the Recycle bin" : "Item permanently removed";
|
|
||||||
MessageDialogHelper.ShowDeleteConfirmationDialog("Delete", message, a =>
|
|
||||||
{
|
|
||||||
ToastNotificationHelper.ShowMovedToast(Model, "Deleting", text);
|
|
||||||
Model.MarkForDelete();
|
|
||||||
if (Frame.CanGoBack) Frame.GoBack();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RestoreButton_Click(object sender, RoutedEventArgs e)
|
|
||||||
{
|
|
||||||
ToastNotificationHelper.ShowMovedToast(Model, "Restored", "Item returned to its original group");
|
|
||||||
if (Frame.CanGoBack) Frame.GoBack();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SemanticZoom_ViewChangeStarted(object sender, SemanticZoomViewChangedEventArgs e)
|
private void SemanticZoom_ViewChangeStarted(object sender, SemanticZoomViewChangedEventArgs e)
|
||||||
{
|
{
|
||||||
// We need to synchronize the two lists (zoomed-in and zoomed-out) because the source is different
|
// We need to synchronize the two lists (zoomed-in and zoomed-out) because the source is different
|
||||||
if (e.IsSourceZoomedInView == false)
|
if (!e.IsSourceZoomedInView)
|
||||||
{
|
{
|
||||||
e.DestinationItem.Item = e.SourceItem.Item;
|
e.DestinationItem.Item = e.SourceItem.Item;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private void CreateEntry_ButtonClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Frame.Navigate(typeof(EntryDetailPage), Model.AddNewEntry());
|
||||||
|
}
|
||||||
|
private void CreateGroup_ButtonClick(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
Frame.Navigate(typeof(GroupDetailPage), Model.AddNewGroup());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GridView_DragItemsStarting(object sender, DragItemsStartingEventArgs e)
|
||||||
|
{
|
||||||
|
e.Cancel = !Model.IsEditMode;
|
||||||
|
e.Data.RequestedOperation = DataPackageOperation.Move;
|
||||||
|
}
|
||||||
|
|
||||||
private void SearchBox_OnSuggestionsRequested(SearchBox sender, SearchBoxSuggestionsRequestedEventArgs args)
|
private void SearchBox_OnSuggestionsRequested(SearchBox sender, SearchBoxSuggestionsRequestedEventArgs args)
|
||||||
{
|
{
|
||||||
var imageUri = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx://Assets/Logo.scale-80.png"));
|
var imageUri = RandomAccessStreamReference.CreateFromUri(new Uri("ms-appdata://Assets/ModernKeePass-SmallLogo.scale-80.png"));
|
||||||
var results = Model.Entries.Skip(1).Where(e => e.Name.IndexOf(args.QueryText, StringComparison.OrdinalIgnoreCase) >= 0).Take(5);
|
var results = Model.SubEntries.Where(e => e.Name.IndexOf(args.QueryText, StringComparison.OrdinalIgnoreCase) >= 0).Take(5);
|
||||||
foreach (var result in results)
|
foreach (var result in results)
|
||||||
{
|
{
|
||||||
args.Request.SearchSuggestionCollection.AppendResultSuggestion(result.Name, result.ParentGroup.Name, result.Id, imageUri, string.Empty);
|
args.Request.SearchSuggestionCollection.AppendResultSuggestion(result.Name, result.ParentGroup.Name, result.Id, imageUri, string.Empty);
|
||||||
@@ -151,10 +130,15 @@ namespace ModernKeePass.Pages
|
|||||||
|
|
||||||
private void SearchBox_OnResultSuggestionChosen(SearchBox sender, SearchBoxResultSuggestionChosenEventArgs args)
|
private void SearchBox_OnResultSuggestionChosen(SearchBox sender, SearchBoxResultSuggestionChosenEventArgs args)
|
||||||
{
|
{
|
||||||
var entry = Model.Entries.Skip(1).FirstOrDefault(e => e.Id == args.Tag);
|
var entry = Model.SubEntries.FirstOrDefault(e => e.Id == args.Tag);
|
||||||
Frame.Navigate(typeof(EntryDetailPage), entry);
|
Frame.Navigate(typeof(EntryDetailPage), entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void GroupDetailPage_OnSizeChanged(object sender, SizeChangedEventArgs e)
|
||||||
|
{
|
||||||
|
VisualStateManager.GoToState(this, e.NewSize.Width < 800 ? "Small" : "Large", true);
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -5,8 +5,8 @@
|
|||||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
xmlns:viewModels="using:ModernKeePass.ViewModels"
|
xmlns:viewModels="using:ModernKeePass.ViewModels"
|
||||||
xmlns:controls="using:ModernKeePass.Controls"
|
xmlns:controls="using:ModernKeePass.Controls"
|
||||||
xmlns:basePages="using:ModernKeePass.Pages.BasePages"
|
xmlns:basePages="using:ModernKeePass.Views.BasePages"
|
||||||
x:Class="ModernKeePass.Pages.MainPage"
|
x:Class="ModernKeePass.Views.MainPage"
|
||||||
x:Name="PageRoot"
|
x:Name="PageRoot"
|
||||||
mc:Ignorable="d">
|
mc:Ignorable="d">
|
||||||
<Page.Resources>
|
<Page.Resources>
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
</TransitionCollection>
|
</TransitionCollection>
|
||||||
</Grid.ChildrenTransitions>
|
</Grid.ChildrenTransitions>
|
||||||
<Grid.RowDefinitions>
|
<Grid.RowDefinitions>
|
||||||
<RowDefinition Height="40"/>
|
<RowDefinition Height="{StaticResource MenuGridLength}"/>
|
||||||
<RowDefinition Height="*"/>
|
<RowDefinition Height="*"/>
|
||||||
</Grid.RowDefinitions>
|
</Grid.RowDefinitions>
|
||||||
<Grid.ColumnDefinitions>
|
<Grid.ColumnDefinitions>
|
||||||
@@ -47,8 +47,7 @@
|
|||||||
<Button x:Name="BackButton"
|
<Button x:Name="BackButton"
|
||||||
Command="{Binding NavigationHelper.GoBackCommand, ElementName=PageRoot}"
|
Command="{Binding NavigationHelper.GoBackCommand, ElementName=PageRoot}"
|
||||||
Visibility="Collapsed"
|
Visibility="Collapsed"
|
||||||
Height="40"
|
Height="{StaticResource MenuSize}"
|
||||||
VerticalAlignment="Center"
|
|
||||||
AutomationProperties.Name="Back"
|
AutomationProperties.Name="Back"
|
||||||
AutomationProperties.AutomationId="BackButton"
|
AutomationProperties.AutomationId="BackButton"
|
||||||
AutomationProperties.ItemType="Navigation Button"
|
AutomationProperties.ItemType="Navigation Button"
|
||||||
@@ -61,11 +60,10 @@
|
|||||||
Grid.Column="0"
|
Grid.Column="0"
|
||||||
Grid.Row="1"
|
Grid.Row="1"
|
||||||
x:Name="MenuListView"
|
x:Name="MenuListView"
|
||||||
SelectionChanged="MenuListView_SelectionChanged"
|
SelectionChanged="ListView_SelectionChanged"
|
||||||
Background="{ThemeResource AppBarBackgroundThemeBrush}"
|
Background="{ThemeResource AppBarBackgroundThemeBrush}"
|
||||||
ItemsSource="{Binding Source={StaticResource MenuItemsSource}}"
|
ItemsSource="{Binding Source={StaticResource MenuItemsSource}}"
|
||||||
SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
|
SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
|
||||||
IsSynchronizedWithCurrentItem="False"
|
|
||||||
ItemContainerStyle="{StaticResource ListViewLeftIndicatorItemExpanded}">
|
ItemContainerStyle="{StaticResource ListViewLeftIndicatorItemExpanded}">
|
||||||
<controls:ListViewWithDisable.ItemTemplate>
|
<controls:ListViewWithDisable.ItemTemplate>
|
||||||
<DataTemplate>
|
<DataTemplate>
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user