Compare commits
81 Commits
0.2-alpha
...
0.3.6-alph
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1f94a626bb | ||
|
|
a6afe0bcf4 | ||
|
|
1fd89bfab6 | ||
|
|
db0640840f | ||
|
|
fb735d9e41 | ||
|
|
862cbe839e | ||
|
|
cb5a71dfee | ||
|
|
30697648b9 | ||
|
|
e5e8d01dff | ||
|
|
030dbd5be7 | ||
|
|
e306b2b3f2 | ||
|
|
0fe99cda97 | ||
|
|
c207b2b24a | ||
|
|
dc51c60c19 | ||
|
|
86d983f776 | ||
|
|
efa727eaba | ||
|
|
5e6d2bed3d | ||
|
|
5e6e31fb47 | ||
|
|
8d34f77a1f | ||
|
|
859fe5ede8 | ||
|
|
fef291df88 | ||
|
|
c1b47bdb77 | ||
|
|
0e102d3f0f | ||
|
|
d4c7d49d6f | ||
|
|
0144e3c21f | ||
|
|
dd5eef4e60 | ||
|
|
bfc610a25e | ||
|
|
0986271199 | ||
|
|
63c3c83eb8 | ||
|
|
0a42e55f0e | ||
|
|
442d16e297 | ||
|
|
6f92b70039 | ||
|
|
8496140f9c | ||
|
|
d814556376 | ||
|
|
c0051f852e | ||
|
|
726f8846b8 | ||
|
|
c50da8f0ac | ||
|
|
f4c67ea603 | ||
|
|
99163ab84c | ||
|
|
3ae08796a1 | ||
|
|
665dad02ac | ||
|
|
2630dc8778 | ||
|
|
9836d3c194 | ||
|
|
55d0eddbf8 | ||
|
|
03c5f78960 | ||
|
|
1d688293af | ||
|
|
6b14f84afb | ||
|
|
a31e287ec8 | ||
|
|
860d6bb21c | ||
|
|
3d14904640 | ||
|
|
3d4c183bdb | ||
|
|
00eec52781 | ||
|
|
ab0199e3dd | ||
|
|
910c89288f | ||
|
|
eaa072f298 | ||
|
|
d0b6927a5e | ||
|
|
b7d15f7e49 | ||
|
|
515190a74e | ||
|
|
75c9aa6873 | ||
|
|
c34d840e35 | ||
|
|
fb0887ebf0 | ||
|
|
6ba8b1445d | ||
|
|
79a8c05e95 | ||
|
|
a98720a00c | ||
|
|
c674745103 | ||
|
|
d3cdc4d574 | ||
|
|
dfb8c7936a | ||
|
|
02f54d2c35 | ||
|
|
1db5bd0e12 | ||
|
|
cadfd3fdca | ||
|
|
f55e78349e | ||
|
|
005bab7380 | ||
|
|
f0e4def758 | ||
|
|
58abad34a1 | ||
|
|
628fbbfeda | ||
|
|
9c3a62bef6 | ||
|
|
7feb2517dd | ||
|
|
59db224a35 | ||
|
|
c32003d7c6 | ||
|
|
1a095ce1d7 | ||
|
|
7b8ce088fe |
3
.gitmodules
vendored
@@ -10,3 +10,6 @@
|
|||||||
[submodule "CocoaHTTPServer"]
|
[submodule "CocoaHTTPServer"]
|
||||||
path = CocoaHTTPServer
|
path = CocoaHTTPServer
|
||||||
url = git://github.com/robbiehanson/CocoaHTTPServer.git
|
url = git://github.com/robbiehanson/CocoaHTTPServer.git
|
||||||
|
[submodule "KeePassKit"]
|
||||||
|
path = KeePassKit
|
||||||
|
url = https://mstarke@github.com/mstarke/KeePassKit
|
||||||
|
|||||||
BIN
Assets/App icon/MacPass.icns
Normal file
BIN
Assets/App icon/MacPass.iconset/icon_128x128.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
Assets/App icon/MacPass.iconset/icon_128x128@2x.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
Assets/App icon/MacPass.iconset/icon_16x16.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
Assets/App icon/MacPass.iconset/icon_16x16@2x.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
Assets/App icon/MacPass.iconset/icon_256x256.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
Assets/App icon/MacPass.iconset/icon_256x256@2x.png
Normal file
|
After Width: | Height: | Size: 140 KiB |
BIN
Assets/App icon/MacPass.iconset/icon_32x32.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
Assets/App icon/MacPass.iconset/icon_32x32@2x.png
Normal file
|
After Width: | Height: | Size: 9.0 KiB |
BIN
Assets/App icon/MacPass.iconset/icon_512x512.png
Normal file
|
After Width: | Height: | Size: 140 KiB |
BIN
Assets/App icon/MacPass.iconset/icon_512x512@2x.png
Normal file
|
After Width: | Height: | Size: 396 KiB |
BIN
Assets/App icon/PSD.zip
Normal file
BIN
Assets/Screenshots/Attachments.png
Normal file
|
After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 66 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 109 KiB After Width: | Height: | Size: 105 KiB |
BIN
Assets/Screenshots/NoInspector.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
|
Before Width: | Height: | Size: 163 KiB After Width: | Height: | Size: 159 KiB |
BIN
Assets/Screenshots/SetPassword.png
Normal file
|
After Width: | Height: | Size: 108 KiB |
2
HNHUi
1
KeePassKit
Submodule
121
MacPass.xcodeproj/xcshareddata/xcschemes/MacPass.xcscheme
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "0460"
|
||||||
|
version = "1.7">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "4C77E36115B84A240093A587"
|
||||||
|
BuildableName = "MacPass.app"
|
||||||
|
BlueprintName = "MacPass"
|
||||||
|
ReferencedContainer = "container:MacPass.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "4C45FB19178E09ED0010007D"
|
||||||
|
BuildableName = "MacPassTests.octest"
|
||||||
|
BlueprintName = "MacPassTests"
|
||||||
|
ReferencedContainer = "container:MacPass.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
</Testables>
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "4C77E36115B84A240093A587"
|
||||||
|
BuildableName = "MacPass.app"
|
||||||
|
BlueprintName = "MacPass"
|
||||||
|
ReferencedContainer = "container:MacPass.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
|
</TestAction>
|
||||||
|
<LaunchAction
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
launchStyle = "0"
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
ignoresPersistentStateOnLaunch = "NO"
|
||||||
|
debugDocumentVersioning = "YES"
|
||||||
|
allowLocationSimulation = "YES">
|
||||||
|
<BuildableProductRunnable>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "4C77E36115B84A240093A587"
|
||||||
|
BuildableName = "MacPass.app"
|
||||||
|
BlueprintName = "MacPass"
|
||||||
|
ReferencedContainer = "container:MacPass.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
<CommandLineArguments>
|
||||||
|
<CommandLineArgument
|
||||||
|
argument = "-NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints YES"
|
||||||
|
isEnabled = "NO">
|
||||||
|
</CommandLineArgument>
|
||||||
|
</CommandLineArguments>
|
||||||
|
<AdditionalOptions>
|
||||||
|
</AdditionalOptions>
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<BuildableProductRunnable>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "4C77E36115B84A240093A587"
|
||||||
|
BuildableName = "MacPass.app"
|
||||||
|
BlueprintName = "MacPass"
|
||||||
|
ReferencedContainer = "container:MacPass.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
<PreActions>
|
||||||
|
<ExecutionAction
|
||||||
|
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
|
||||||
|
<ActionContent
|
||||||
|
title = "Run Script"
|
||||||
|
scriptText = "PLIST_FILE=$PROJECT_DIR/$INFOPLIST_FILE VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $PLIST_FILE) VERSION=$(($VERSION + 1)) /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $VERSION" $PLIST_FILE"
|
||||||
|
shellToInvoke = "/bin/bash">
|
||||||
|
<EnvironmentBuildable>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "4C77E36115B84A240093A587"
|
||||||
|
BuildableName = "MacPass.app"
|
||||||
|
BlueprintName = "MacPass"
|
||||||
|
ReferencedContainer = "container:MacPass.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</EnvironmentBuildable>
|
||||||
|
</ActionContent>
|
||||||
|
</ExecutionAction>
|
||||||
|
</PreActions>
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
||||||
@@ -235,6 +235,15 @@
|
|||||||
<reference key="NSOnImage" ref="35465992"/>
|
<reference key="NSOnImage" ref="35465992"/>
|
||||||
<reference key="NSMixedImage" ref="502551668"/>
|
<reference key="NSMixedImage" ref="502551668"/>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="NSMenuItem" id="919874146">
|
||||||
|
<reference key="NSMenu" ref="720053764"/>
|
||||||
|
<string key="NSTitle">Lock</string>
|
||||||
|
<string key="NSKeyEquiv">L</string>
|
||||||
|
<int key="NSKeyEquivModMask">262144</int>
|
||||||
|
<int key="NSMnemonicLoc">2147483647</int>
|
||||||
|
<reference key="NSOnImage" ref="35465992"/>
|
||||||
|
<reference key="NSMixedImage" ref="502551668"/>
|
||||||
|
</object>
|
||||||
<object class="NSMenuItem" id="776162233">
|
<object class="NSMenuItem" id="776162233">
|
||||||
<reference key="NSMenu" ref="720053764"/>
|
<reference key="NSMenu" ref="720053764"/>
|
||||||
<string key="NSTitle">Close</string>
|
<string key="NSTitle">Close</string>
|
||||||
@@ -253,6 +262,24 @@
|
|||||||
<reference key="NSOnImage" ref="35465992"/>
|
<reference key="NSOnImage" ref="35465992"/>
|
||||||
<reference key="NSMixedImage" ref="502551668"/>
|
<reference key="NSMixedImage" ref="502551668"/>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="NSMenuItem" id="663106531">
|
||||||
|
<reference key="NSMenu" ref="720053764"/>
|
||||||
|
<string key="NSTitle">Save As…</string>
|
||||||
|
<string key="NSKeyEquiv">S</string>
|
||||||
|
<int key="NSKeyEquivModMask">1048576</int>
|
||||||
|
<int key="NSMnemonicLoc">2147483647</int>
|
||||||
|
<reference key="NSOnImage" ref="35465992"/>
|
||||||
|
<reference key="NSMixedImage" ref="502551668"/>
|
||||||
|
</object>
|
||||||
|
<object class="NSMenuItem" id="438377242">
|
||||||
|
<reference key="NSMenu" ref="720053764"/>
|
||||||
|
<string key="NSTitle">Export As XML…</string>
|
||||||
|
<string key="NSKeyEquiv">E</string>
|
||||||
|
<int key="NSKeyEquivModMask">1048576</int>
|
||||||
|
<int key="NSMnemonicLoc">2147483647</int>
|
||||||
|
<reference key="NSOnImage" ref="35465992"/>
|
||||||
|
<reference key="NSMixedImage" ref="502551668"/>
|
||||||
|
</object>
|
||||||
<object class="NSMenuItem" id="579971712">
|
<object class="NSMenuItem" id="579971712">
|
||||||
<reference key="NSMenu" ref="720053764"/>
|
<reference key="NSMenu" ref="720053764"/>
|
||||||
<string key="NSTitle">Revert to Saved</string>
|
<string key="NSTitle">Revert to Saved</string>
|
||||||
@@ -274,7 +301,7 @@
|
|||||||
</object>
|
</object>
|
||||||
<object class="NSMenuItem" id="544639599">
|
<object class="NSMenuItem" id="544639599">
|
||||||
<reference key="NSMenu" ref="720053764"/>
|
<reference key="NSMenu" ref="720053764"/>
|
||||||
<string key="NSTitle">Document Settings…</string>
|
<string key="NSTitle">Database Settings…</string>
|
||||||
<string key="NSKeyEquiv"/>
|
<string key="NSKeyEquiv"/>
|
||||||
<int key="NSMnemonicLoc">2147483647</int>
|
<int key="NSMnemonicLoc">2147483647</int>
|
||||||
<reference key="NSOnImage" ref="35465992"/>
|
<reference key="NSOnImage" ref="35465992"/>
|
||||||
@@ -282,7 +309,7 @@
|
|||||||
</object>
|
</object>
|
||||||
<object class="NSMenuItem" id="915918141">
|
<object class="NSMenuItem" id="915918141">
|
||||||
<reference key="NSMenu" ref="720053764"/>
|
<reference key="NSMenu" ref="720053764"/>
|
||||||
<string key="NSTitle">Change Password…</string>
|
<string key="NSTitle">Change Master Password…</string>
|
||||||
<string key="NSKeyEquiv"/>
|
<string key="NSKeyEquiv"/>
|
||||||
<int key="NSMnemonicLoc">2147483647</int>
|
<int key="NSMnemonicLoc">2147483647</int>
|
||||||
<reference key="NSOnImage" ref="35465992"/>
|
<reference key="NSOnImage" ref="35465992"/>
|
||||||
@@ -788,11 +815,35 @@
|
|||||||
</object>
|
</object>
|
||||||
<object class="IBConnectionRecord">
|
<object class="IBConnectionRecord">
|
||||||
<object class="IBActionConnection" key="connection">
|
<object class="IBActionConnection" key="connection">
|
||||||
<string key="label">showDocumentSettings:</string>
|
<string key="label">showDatabaseSettings:</string>
|
||||||
<reference key="source" ref="1014"/>
|
<reference key="source" ref="1014"/>
|
||||||
<reference key="destination" ref="544639599"/>
|
<reference key="destination" ref="544639599"/>
|
||||||
</object>
|
</object>
|
||||||
<int key="connectionID">1233</int>
|
<int key="connectionID">1234</int>
|
||||||
|
</object>
|
||||||
|
<object class="IBConnectionRecord">
|
||||||
|
<object class="IBActionConnection" key="connection">
|
||||||
|
<string key="label">saveDocumentAs:</string>
|
||||||
|
<reference key="source" ref="1014"/>
|
||||||
|
<reference key="destination" ref="663106531"/>
|
||||||
|
</object>
|
||||||
|
<int key="connectionID">1255</int>
|
||||||
|
</object>
|
||||||
|
<object class="IBConnectionRecord">
|
||||||
|
<object class="IBActionConnection" key="connection">
|
||||||
|
<string key="label">exportDatabase:</string>
|
||||||
|
<reference key="source" ref="1014"/>
|
||||||
|
<reference key="destination" ref="438377242"/>
|
||||||
|
</object>
|
||||||
|
<int key="connectionID">1260</int>
|
||||||
|
</object>
|
||||||
|
<object class="IBConnectionRecord">
|
||||||
|
<object class="IBActionConnection" key="connection">
|
||||||
|
<string key="label">lock:</string>
|
||||||
|
<reference key="source" ref="1014"/>
|
||||||
|
<reference key="destination" ref="919874146"/>
|
||||||
|
</object>
|
||||||
|
<int key="connectionID">1263</int>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBConnectionRecord">
|
<object class="IBConnectionRecord">
|
||||||
<object class="IBActionConnection" key="connection">
|
<object class="IBActionConnection" key="connection">
|
||||||
@@ -896,6 +947,9 @@
|
|||||||
<reference ref="1010469920"/>
|
<reference ref="1010469920"/>
|
||||||
<reference ref="915918141"/>
|
<reference ref="915918141"/>
|
||||||
<reference ref="544639599"/>
|
<reference ref="544639599"/>
|
||||||
|
<reference ref="663106531"/>
|
||||||
|
<reference ref="438377242"/>
|
||||||
|
<reference ref="919874146"/>
|
||||||
</array>
|
</array>
|
||||||
<reference key="parent" ref="379814623"/>
|
<reference key="parent" ref="379814623"/>
|
||||||
</object>
|
</object>
|
||||||
@@ -1226,6 +1280,21 @@
|
|||||||
<reference key="object" ref="544639599"/>
|
<reference key="object" ref="544639599"/>
|
||||||
<reference key="parent" ref="720053764"/>
|
<reference key="parent" ref="720053764"/>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="IBObjectRecord">
|
||||||
|
<int key="objectID">1243</int>
|
||||||
|
<reference key="object" ref="663106531"/>
|
||||||
|
<reference key="parent" ref="720053764"/>
|
||||||
|
</object>
|
||||||
|
<object class="IBObjectRecord">
|
||||||
|
<int key="objectID">1259</int>
|
||||||
|
<reference key="object" ref="438377242"/>
|
||||||
|
<reference key="parent" ref="720053764"/>
|
||||||
|
</object>
|
||||||
|
<object class="IBObjectRecord">
|
||||||
|
<int key="objectID">1261</int>
|
||||||
|
<reference key="object" ref="919874146"/>
|
||||||
|
<reference key="parent" ref="720053764"/>
|
||||||
|
</object>
|
||||||
</array>
|
</array>
|
||||||
</object>
|
</object>
|
||||||
<dictionary class="NSMutableDictionary" key="flattenedProperties">
|
<dictionary class="NSMutableDictionary" key="flattenedProperties">
|
||||||
@@ -1241,8 +1310,11 @@
|
|||||||
<string key="1203.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
<string key="1203.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
<string key="1231.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
<string key="1231.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
<string key="124.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
<string key="124.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
|
<string key="1243.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
<string key="125.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
<string key="125.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
|
<string key="1259.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
<string key="126.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
<string key="126.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
|
<string key="1261.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
<string key="129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
<string key="129.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
<string key="130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
<string key="130.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
<string key="131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
<string key="131.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
@@ -1298,7 +1370,7 @@
|
|||||||
<nil key="activeLocalization"/>
|
<nil key="activeLocalization"/>
|
||||||
<dictionary class="NSMutableDictionary" key="localizations"/>
|
<dictionary class="NSMutableDictionary" key="localizations"/>
|
||||||
<nil key="sourceID"/>
|
<nil key="sourceID"/>
|
||||||
<int key="maxID">1233</int>
|
<int key="maxID">1263</int>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||||
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||||
@@ -1358,15 +1430,25 @@
|
|||||||
<string key="superclassName">NSWindowController</string>
|
<string key="superclassName">NSWindowController</string>
|
||||||
<dictionary class="NSMutableDictionary" key="actions">
|
<dictionary class="NSMutableDictionary" key="actions">
|
||||||
<string key="editPassword:">id</string>
|
<string key="editPassword:">id</string>
|
||||||
<string key="showDocumentSettings:">id</string>
|
<string key="exportDatabase:">id</string>
|
||||||
|
<string key="lock:">id</string>
|
||||||
|
<string key="showDatabaseSettings:">id</string>
|
||||||
</dictionary>
|
</dictionary>
|
||||||
<dictionary class="NSMutableDictionary" key="actionInfosByName">
|
<dictionary class="NSMutableDictionary" key="actionInfosByName">
|
||||||
<object class="IBActionInfo" key="editPassword:">
|
<object class="IBActionInfo" key="editPassword:">
|
||||||
<string key="name">editPassword:</string>
|
<string key="name">editPassword:</string>
|
||||||
<string key="candidateClassName">id</string>
|
<string key="candidateClassName">id</string>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBActionInfo" key="showDocumentSettings:">
|
<object class="IBActionInfo" key="exportDatabase:">
|
||||||
<string key="name">showDocumentSettings:</string>
|
<string key="name">exportDatabase:</string>
|
||||||
|
<string key="candidateClassName">id</string>
|
||||||
|
</object>
|
||||||
|
<object class="IBActionInfo" key="lock:">
|
||||||
|
<string key="name">lock:</string>
|
||||||
|
<string key="candidateClassName">id</string>
|
||||||
|
</object>
|
||||||
|
<object class="IBActionInfo" key="showDatabaseSettings:">
|
||||||
|
<string key="name">showDatabaseSettings:</string>
|
||||||
<string key="candidateClassName">id</string>
|
<string key="candidateClassName">id</string>
|
||||||
</object>
|
</object>
|
||||||
</dictionary>
|
</dictionary>
|
||||||
|
|||||||
@@ -1,947 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<archive type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="8.00">
|
|
||||||
<data>
|
|
||||||
<int key="IBDocument.SystemTarget">1080</int>
|
|
||||||
<string key="IBDocument.SystemVersion">12E55</string>
|
|
||||||
<string key="IBDocument.InterfaceBuilderVersion">3084</string>
|
|
||||||
<string key="IBDocument.AppKitVersion">1187.39</string>
|
|
||||||
<string key="IBDocument.HIToolboxVersion">626.00</string>
|
|
||||||
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
|
|
||||||
<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="NS.object.0">3084</string>
|
|
||||||
</object>
|
|
||||||
<array key="IBDocument.IntegratedClassDependencies">
|
|
||||||
<string>IBNSLayoutConstraint</string>
|
|
||||||
<string>NSButton</string>
|
|
||||||
<string>NSButtonCell</string>
|
|
||||||
<string>NSCustomObject</string>
|
|
||||||
<string>NSCustomView</string>
|
|
||||||
<string>NSPathCell</string>
|
|
||||||
<string>NSPathControl</string>
|
|
||||||
<string>NSSecureTextField</string>
|
|
||||||
<string>NSSecureTextFieldCell</string>
|
|
||||||
<string>NSTextField</string>
|
|
||||||
<string>NSTextFieldCell</string>
|
|
||||||
</array>
|
|
||||||
<array key="IBDocument.PluginDependencies">
|
|
||||||
<string>com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
</array>
|
|
||||||
<object class="NSMutableDictionary" key="IBDocument.Metadata">
|
|
||||||
<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
|
|
||||||
<integer value="1" key="NS.object.0"/>
|
|
||||||
</object>
|
|
||||||
<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
|
|
||||||
<object class="NSCustomObject" id="1001">
|
|
||||||
<string key="NSClassName">MPPasswordEditViewController</string>
|
|
||||||
</object>
|
|
||||||
<object class="NSCustomObject" id="1003">
|
|
||||||
<string key="NSClassName">FirstResponder</string>
|
|
||||||
</object>
|
|
||||||
<object class="NSCustomObject" id="1004">
|
|
||||||
<string key="NSClassName">NSApplication</string>
|
|
||||||
</object>
|
|
||||||
<object class="NSCustomView" id="595834490">
|
|
||||||
<reference key="NSNextResponder"/>
|
|
||||||
<int key="NSvFlags">268</int>
|
|
||||||
<array class="NSMutableArray" key="NSSubviews">
|
|
||||||
<object class="NSTextField" id="762740216">
|
|
||||||
<reference key="NSNextResponder" ref="595834490"/>
|
|
||||||
<int key="NSvFlags">268</int>
|
|
||||||
<string key="NSFrame">{{99, 157}, {164, 17}}</string>
|
|
||||||
<reference key="NSSuperview" ref="595834490"/>
|
|
||||||
<reference key="NSWindow"/>
|
|
||||||
<reference key="NSNextKeyView" ref="847623533"/>
|
|
||||||
<string key="NSReuseIdentifierKey">_NS:1535</string>
|
|
||||||
<bool key="NSEnabled">YES</bool>
|
|
||||||
<object class="NSTextFieldCell" key="NSCell" id="79241474">
|
|
||||||
<int key="NSCellFlags">68157504</int>
|
|
||||||
<int key="NSCellFlags2">272630784</int>
|
|
||||||
<string key="NSContents">Change Password/Keyfile</string>
|
|
||||||
<object class="NSFont" key="NSSupport" id="385477987">
|
|
||||||
<string key="NSName">LucidaGrande</string>
|
|
||||||
<double key="NSSize">13</double>
|
|
||||||
<int key="NSfFlags">1044</int>
|
|
||||||
</object>
|
|
||||||
<string key="NSCellIdentifier">_NS:1535</string>
|
|
||||||
<reference key="NSControlView" ref="762740216"/>
|
|
||||||
<object class="NSColor" key="NSBackgroundColor" id="515490923">
|
|
||||||
<int key="NSColorSpace">6</int>
|
|
||||||
<string key="NSCatalogName">System</string>
|
|
||||||
<string key="NSColorName">controlColor</string>
|
|
||||||
<object class="NSColor" key="NSColor">
|
|
||||||
<int key="NSColorSpace">3</int>
|
|
||||||
<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="NSColor" key="NSTextColor" id="504890084">
|
|
||||||
<int key="NSColorSpace">6</int>
|
|
||||||
<string key="NSCatalogName">System</string>
|
|
||||||
<string key="NSColorName">controlTextColor</string>
|
|
||||||
<object class="NSColor" key="NSColor" id="354127501">
|
|
||||||
<int key="NSColorSpace">3</int>
|
|
||||||
<bytes key="NSWhite">MAA</bytes>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
|
||||||
</object>
|
|
||||||
<object class="NSButton" id="256981522">
|
|
||||||
<reference key="NSNextResponder" ref="595834490"/>
|
|
||||||
<int key="NSvFlags">268</int>
|
|
||||||
<string key="NSFrame">{{113, 13}, {82, 32}}</string>
|
|
||||||
<reference key="NSSuperview" ref="595834490"/>
|
|
||||||
<reference key="NSWindow"/>
|
|
||||||
<reference key="NSNextKeyView" ref="771851607"/>
|
|
||||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
|
||||||
<bool key="NSEnabled">YES</bool>
|
|
||||||
<object class="NSButtonCell" key="NSCell" id="69579583">
|
|
||||||
<int key="NSCellFlags">67108864</int>
|
|
||||||
<int key="NSCellFlags2">134217728</int>
|
|
||||||
<string key="NSContents">Cancel</string>
|
|
||||||
<reference key="NSSupport" ref="385477987"/>
|
|
||||||
<string key="NSCellIdentifier">_NS:9</string>
|
|
||||||
<reference key="NSControlView" ref="256981522"/>
|
|
||||||
<int key="NSButtonFlags">-2038284288</int>
|
|
||||||
<int key="NSButtonFlags2">129</int>
|
|
||||||
<string key="NSAlternateContents"/>
|
|
||||||
<string type="base64-UTF8" key="NSKeyEquivalent">Gw</string>
|
|
||||||
<int key="NSPeriodicDelay">200</int>
|
|
||||||
<int key="NSPeriodicInterval">25</int>
|
|
||||||
</object>
|
|
||||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
|
||||||
</object>
|
|
||||||
<object class="NSPathControl" id="679285412">
|
|
||||||
<reference key="NSNextResponder" ref="595834490"/>
|
|
||||||
<int key="NSvFlags">268</int>
|
|
||||||
<set class="NSMutableSet" key="NSDragTypes">
|
|
||||||
<string>Apple URL pasteboard type</string>
|
|
||||||
<string>NSFilenamesPboardType</string>
|
|
||||||
</set>
|
|
||||||
<string key="NSFrame">{{83, 57}, {197, 22}}</string>
|
|
||||||
<reference key="NSSuperview" ref="595834490"/>
|
|
||||||
<reference key="NSWindow"/>
|
|
||||||
<reference key="NSNextKeyView" ref="256981522"/>
|
|
||||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
|
||||||
<bool key="NSEnabled">YES</bool>
|
|
||||||
<object class="NSPathCell" key="NSCell" id="902994558">
|
|
||||||
<int key="NSCellFlags">337641473</int>
|
|
||||||
<int key="NSCellFlags2">131072</int>
|
|
||||||
<object class="NSFont" key="NSSupport">
|
|
||||||
<string key="NSName">LucidaGrande</string>
|
|
||||||
<double key="NSSize">11</double>
|
|
||||||
<int key="NSfFlags">3100</int>
|
|
||||||
</object>
|
|
||||||
<string key="NSCellIdentifier">_NS:9</string>
|
|
||||||
<reference key="NSControlView" ref="679285412"/>
|
|
||||||
<array class="NSMutableArray" key="NSPathComponentCells"/>
|
|
||||||
<int key="NSPathStyle">2</int>
|
|
||||||
<reference key="NSDelegate" ref="679285412"/>
|
|
||||||
</object>
|
|
||||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
|
||||||
</object>
|
|
||||||
<object class="NSSecureTextField" id="670734441">
|
|
||||||
<reference key="NSNextResponder" ref="595834490"/>
|
|
||||||
<int key="NSvFlags">268</int>
|
|
||||||
<string key="NSFrame">{{86, 86}, {191, 22}}</string>
|
|
||||||
<reference key="NSSuperview" ref="595834490"/>
|
|
||||||
<reference key="NSWindow"/>
|
|
||||||
<reference key="NSNextKeyView" ref="365869599"/>
|
|
||||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
|
||||||
<bool key="NSEnabled">YES</bool>
|
|
||||||
<object class="NSSecureTextFieldCell" key="NSCell" id="656181976">
|
|
||||||
<int key="NSCellFlags">342884416</int>
|
|
||||||
<int key="NSCellFlags2">272630848</int>
|
|
||||||
<string key="NSContents"/>
|
|
||||||
<reference key="NSSupport" ref="385477987"/>
|
|
||||||
<string key="NSCellIdentifier">_NS:9</string>
|
|
||||||
<reference key="NSControlView" ref="670734441"/>
|
|
||||||
<bool key="NSDrawsBackground">YES</bool>
|
|
||||||
<object class="NSColor" key="NSBackgroundColor">
|
|
||||||
<int key="NSColorSpace">6</int>
|
|
||||||
<string key="NSCatalogName">System</string>
|
|
||||||
<string key="NSColorName">textBackgroundColor</string>
|
|
||||||
<object class="NSColor" key="NSColor">
|
|
||||||
<int key="NSColorSpace">3</int>
|
|
||||||
<bytes key="NSWhite">MQA</bytes>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="NSColor" key="NSTextColor">
|
|
||||||
<int key="NSColorSpace">6</int>
|
|
||||||
<string key="NSCatalogName">System</string>
|
|
||||||
<string key="NSColorName">textColor</string>
|
|
||||||
<reference key="NSColor" ref="354127501"/>
|
|
||||||
</object>
|
|
||||||
<array key="NSAllowedInputLocales">
|
|
||||||
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
|
|
||||||
</array>
|
|
||||||
</object>
|
|
||||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
|
||||||
</object>
|
|
||||||
<object class="NSTextField" id="847623533">
|
|
||||||
<reference key="NSNextResponder" ref="595834490"/>
|
|
||||||
<int key="NSvFlags">268</int>
|
|
||||||
<string key="NSFrame">{{17, 89}, {64, 17}}</string>
|
|
||||||
<reference key="NSSuperview" ref="595834490"/>
|
|
||||||
<reference key="NSWindow"/>
|
|
||||||
<reference key="NSNextKeyView" ref="670734441"/>
|
|
||||||
<string key="NSReuseIdentifierKey">_NS:1535</string>
|
|
||||||
<bool key="NSEnabled">YES</bool>
|
|
||||||
<object class="NSTextFieldCell" key="NSCell" id="792960157">
|
|
||||||
<int key="NSCellFlags">68157504</int>
|
|
||||||
<int key="NSCellFlags2">272630784</int>
|
|
||||||
<string key="NSContents">Password</string>
|
|
||||||
<reference key="NSSupport" ref="385477987"/>
|
|
||||||
<string key="NSCellIdentifier">_NS:1535</string>
|
|
||||||
<reference key="NSControlView" ref="847623533"/>
|
|
||||||
<reference key="NSBackgroundColor" ref="515490923"/>
|
|
||||||
<reference key="NSTextColor" ref="504890084"/>
|
|
||||||
</object>
|
|
||||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
|
||||||
</object>
|
|
||||||
<object class="NSTextField" id="365869599">
|
|
||||||
<reference key="NSNextResponder" ref="595834490"/>
|
|
||||||
<int key="NSvFlags">268</int>
|
|
||||||
<string key="NSFrame">{{35, 62}, {46, 17}}</string>
|
|
||||||
<reference key="NSSuperview" ref="595834490"/>
|
|
||||||
<reference key="NSWindow"/>
|
|
||||||
<reference key="NSNextKeyView" ref="679285412"/>
|
|
||||||
<string key="NSReuseIdentifierKey">_NS:1535</string>
|
|
||||||
<bool key="NSEnabled">YES</bool>
|
|
||||||
<object class="NSTextFieldCell" key="NSCell" id="324335303">
|
|
||||||
<int key="NSCellFlags">68157504</int>
|
|
||||||
<int key="NSCellFlags2">272630784</int>
|
|
||||||
<string key="NSContents">Keyfile</string>
|
|
||||||
<reference key="NSSupport" ref="385477987"/>
|
|
||||||
<string key="NSCellIdentifier">_NS:1535</string>
|
|
||||||
<reference key="NSControlView" ref="365869599"/>
|
|
||||||
<reference key="NSBackgroundColor" ref="515490923"/>
|
|
||||||
<reference key="NSTextColor" ref="504890084"/>
|
|
||||||
</object>
|
|
||||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
|
||||||
</object>
|
|
||||||
<object class="NSButton" id="771851607">
|
|
||||||
<reference key="NSNextResponder" ref="595834490"/>
|
|
||||||
<int key="NSvFlags">268</int>
|
|
||||||
<string key="NSFrame">{{195, 13}, {88, 32}}</string>
|
|
||||||
<reference key="NSSuperview" ref="595834490"/>
|
|
||||||
<reference key="NSWindow"/>
|
|
||||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
|
||||||
<string key="NSHuggingPriority">{250, 250}</string>
|
|
||||||
<bool key="NSEnabled">YES</bool>
|
|
||||||
<object class="NSButtonCell" key="NSCell" id="251779948">
|
|
||||||
<int key="NSCellFlags">67108864</int>
|
|
||||||
<int key="NSCellFlags2">134217728</int>
|
|
||||||
<string key="NSContents">Change</string>
|
|
||||||
<reference key="NSSupport" ref="385477987"/>
|
|
||||||
<string key="NSCellIdentifier">_NS:9</string>
|
|
||||||
<reference key="NSControlView" ref="771851607"/>
|
|
||||||
<int key="NSButtonFlags">-2038284288</int>
|
|
||||||
<int key="NSButtonFlags2">129</int>
|
|
||||||
<string key="NSAlternateContents"/>
|
|
||||||
<string type="base64-UTF8" key="NSKeyEquivalent">DQ</string>
|
|
||||||
<int key="NSPeriodicDelay">200</int>
|
|
||||||
<int key="NSPeriodicInterval">25</int>
|
|
||||||
</object>
|
|
||||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
|
||||||
</object>
|
|
||||||
</array>
|
|
||||||
<string key="NSFrameSize">{363, 194}</string>
|
|
||||||
<reference key="NSSuperview"/>
|
|
||||||
<reference key="NSWindow"/>
|
|
||||||
<reference key="NSNextKeyView" ref="762740216"/>
|
|
||||||
<string key="NSAntiCompressionPriority">{751, 750}</string>
|
|
||||||
<string key="NSClassName">NSView</string>
|
|
||||||
</object>
|
|
||||||
</array>
|
|
||||||
<object class="IBObjectContainer" key="IBDocument.Objects">
|
|
||||||
<array class="NSMutableArray" key="connectionRecords">
|
|
||||||
<object class="IBConnectionRecord">
|
|
||||||
<object class="IBOutletConnection" key="connection">
|
|
||||||
<string key="label">view</string>
|
|
||||||
<reference key="source" ref="1001"/>
|
|
||||||
<reference key="destination" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<int key="connectionID">52</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBConnectionRecord">
|
|
||||||
<object class="IBOutletConnection" key="connection">
|
|
||||||
<string key="label">passwordTextField</string>
|
|
||||||
<reference key="source" ref="1001"/>
|
|
||||||
<reference key="destination" ref="670734441"/>
|
|
||||||
</object>
|
|
||||||
<int key="connectionID">53</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBConnectionRecord">
|
|
||||||
<object class="IBOutletConnection" key="connection">
|
|
||||||
<string key="label">keyfilePathControl</string>
|
|
||||||
<reference key="source" ref="1001"/>
|
|
||||||
<reference key="destination" ref="679285412"/>
|
|
||||||
</object>
|
|
||||||
<int key="connectionID">54</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBConnectionRecord">
|
|
||||||
<object class="IBActionConnection" key="connection">
|
|
||||||
<string key="label">_change:</string>
|
|
||||||
<reference key="source" ref="1001"/>
|
|
||||||
<reference key="destination" ref="771851607"/>
|
|
||||||
</object>
|
|
||||||
<int key="connectionID">55</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBConnectionRecord">
|
|
||||||
<object class="IBActionConnection" key="connection">
|
|
||||||
<string key="label">_cancel:</string>
|
|
||||||
<reference key="source" ref="1001"/>
|
|
||||||
<reference key="destination" ref="256981522"/>
|
|
||||||
</object>
|
|
||||||
<int key="connectionID">56</int>
|
|
||||||
</object>
|
|
||||||
</array>
|
|
||||||
<object class="IBMutableOrderedSet" key="objectRecords">
|
|
||||||
<array key="orderedObjects">
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">0</int>
|
|
||||||
<array key="object" id="0"/>
|
|
||||||
<reference key="children" ref="1000"/>
|
|
||||||
<nil key="parent"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">-2</int>
|
|
||||||
<reference key="object" ref="1001"/>
|
|
||||||
<reference key="parent" ref="0"/>
|
|
||||||
<string key="objectName">File's Owner</string>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">-1</int>
|
|
||||||
<reference key="object" ref="1003"/>
|
|
||||||
<reference key="parent" ref="0"/>
|
|
||||||
<string key="objectName">First Responder</string>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">-3</int>
|
|
||||||
<reference key="object" ref="1004"/>
|
|
||||||
<reference key="parent" ref="0"/>
|
|
||||||
<string key="objectName">Application</string>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">2</int>
|
|
||||||
<reference key="object" ref="595834490"/>
|
|
||||||
<array class="NSMutableArray" key="children">
|
|
||||||
<reference ref="365869599"/>
|
|
||||||
<reference ref="679285412"/>
|
|
||||||
<reference ref="670734441"/>
|
|
||||||
<reference ref="847623533"/>
|
|
||||||
<reference ref="771851607"/>
|
|
||||||
<object class="IBNSLayoutConstraint" id="501931119">
|
|
||||||
<reference key="firstItem" ref="771851607"/>
|
|
||||||
<int key="firstAttribute">10</int>
|
|
||||||
<int key="relation">0</int>
|
|
||||||
<reference key="secondItem" ref="256981522"/>
|
|
||||||
<int key="secondAttribute">10</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBLayoutConstant" key="constant">
|
|
||||||
<double key="value">0.0</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="595834490"/>
|
|
||||||
<int key="scoringType">9</int>
|
|
||||||
<float key="scoringTypeFloat">40</float>
|
|
||||||
<int key="contentType">2</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBNSLayoutConstraint" id="1024015372">
|
|
||||||
<reference key="firstItem" ref="771851607"/>
|
|
||||||
<int key="firstAttribute">5</int>
|
|
||||||
<int key="relation">0</int>
|
|
||||||
<reference key="secondItem" ref="256981522"/>
|
|
||||||
<int key="secondAttribute">6</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBNSLayoutSymbolicConstant" key="constant">
|
|
||||||
<double key="value">12</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="595834490"/>
|
|
||||||
<int key="scoringType">6</int>
|
|
||||||
<float key="scoringTypeFloat">24</float>
|
|
||||||
<int key="contentType">3</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBNSLayoutConstraint" id="381133690">
|
|
||||||
<reference key="firstItem" ref="771851607"/>
|
|
||||||
<int key="firstAttribute">3</int>
|
|
||||||
<int key="relation">0</int>
|
|
||||||
<reference key="secondItem" ref="679285412"/>
|
|
||||||
<int key="secondAttribute">4</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBNSLayoutSymbolicConstant" key="constant">
|
|
||||||
<double key="value">20</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="595834490"/>
|
|
||||||
<int key="scoringType">9</int>
|
|
||||||
<float key="scoringTypeFloat">40</float>
|
|
||||||
<int key="contentType">3</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBNSLayoutConstraint" id="629412806">
|
|
||||||
<reference key="firstItem" ref="771851607"/>
|
|
||||||
<int key="firstAttribute">6</int>
|
|
||||||
<int key="relation">0</int>
|
|
||||||
<reference key="secondItem" ref="679285412"/>
|
|
||||||
<int key="secondAttribute">6</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBLayoutConstant" key="constant">
|
|
||||||
<double key="value">0.0</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="595834490"/>
|
|
||||||
<int key="scoringType">6</int>
|
|
||||||
<float key="scoringTypeFloat">24</float>
|
|
||||||
<int key="contentType">2</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBNSLayoutConstraint" id="176392839">
|
|
||||||
<reference key="firstItem" ref="595834490"/>
|
|
||||||
<int key="firstAttribute">4</int>
|
|
||||||
<int key="relation">1</int>
|
|
||||||
<reference key="secondItem" ref="771851607"/>
|
|
||||||
<int key="secondAttribute">4</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBNSLayoutSymbolicConstant" key="constant">
|
|
||||||
<double key="value">20</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="595834490"/>
|
|
||||||
<int key="scoringType">9</int>
|
|
||||||
<float key="scoringTypeFloat">40</float>
|
|
||||||
<int key="contentType">3</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBNSLayoutConstraint" id="340048519">
|
|
||||||
<reference key="firstItem" ref="679285412"/>
|
|
||||||
<int key="firstAttribute">5</int>
|
|
||||||
<int key="relation">0</int>
|
|
||||||
<reference key="secondItem" ref="365869599"/>
|
|
||||||
<int key="secondAttribute">6</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBNSLayoutSymbolicConstant" key="constant">
|
|
||||||
<double key="value">8</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="595834490"/>
|
|
||||||
<int key="scoringType">6</int>
|
|
||||||
<float key="scoringTypeFloat">24</float>
|
|
||||||
<int key="contentType">3</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBNSLayoutConstraint" id="33581314">
|
|
||||||
<reference key="firstItem" ref="679285412"/>
|
|
||||||
<int key="firstAttribute">6</int>
|
|
||||||
<int key="relation">0</int>
|
|
||||||
<reference key="secondItem" ref="670734441"/>
|
|
||||||
<int key="secondAttribute">6</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBLayoutConstant" key="constant">
|
|
||||||
<double key="value">0.0</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="595834490"/>
|
|
||||||
<int key="scoringType">6</int>
|
|
||||||
<float key="scoringTypeFloat">24</float>
|
|
||||||
<int key="contentType">2</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBNSLayoutConstraint" id="481322683">
|
|
||||||
<reference key="firstItem" ref="679285412"/>
|
|
||||||
<int key="firstAttribute">5</int>
|
|
||||||
<int key="relation">0</int>
|
|
||||||
<reference key="secondItem" ref="670734441"/>
|
|
||||||
<int key="secondAttribute">5</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBLayoutConstant" key="constant">
|
|
||||||
<double key="value">0.0</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="595834490"/>
|
|
||||||
<int key="scoringType">6</int>
|
|
||||||
<float key="scoringTypeFloat">24</float>
|
|
||||||
<int key="contentType">2</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBNSLayoutConstraint" id="966743814">
|
|
||||||
<reference key="firstItem" ref="679285412"/>
|
|
||||||
<int key="firstAttribute">3</int>
|
|
||||||
<int key="relation">0</int>
|
|
||||||
<reference key="secondItem" ref="670734441"/>
|
|
||||||
<int key="secondAttribute">4</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBNSLayoutSymbolicConstant" key="constant">
|
|
||||||
<double key="value">8</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="595834490"/>
|
|
||||||
<int key="scoringType">9</int>
|
|
||||||
<float key="scoringTypeFloat">40</float>
|
|
||||||
<int key="contentType">3</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBNSLayoutConstraint" id="379216952">
|
|
||||||
<reference key="firstItem" ref="595834490"/>
|
|
||||||
<int key="firstAttribute">10</int>
|
|
||||||
<int key="relation">0</int>
|
|
||||||
<reference key="secondItem" ref="670734441"/>
|
|
||||||
<int key="secondAttribute">10</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBLayoutConstant" key="constant">
|
|
||||||
<double key="value">0.0</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="595834490"/>
|
|
||||||
<int key="scoringType">9</int>
|
|
||||||
<float key="scoringTypeFloat">40</float>
|
|
||||||
<int key="contentType">2</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBNSLayoutConstraint" id="612132939">
|
|
||||||
<reference key="firstItem" ref="670734441"/>
|
|
||||||
<int key="firstAttribute">5</int>
|
|
||||||
<int key="relation">0</int>
|
|
||||||
<reference key="secondItem" ref="847623533"/>
|
|
||||||
<int key="secondAttribute">6</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBNSLayoutSymbolicConstant" key="constant">
|
|
||||||
<double key="value">8</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="595834490"/>
|
|
||||||
<int key="scoringType">9</int>
|
|
||||||
<float key="scoringTypeFloat">40</float>
|
|
||||||
<int key="contentType">3</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBNSLayoutConstraint" id="485639451">
|
|
||||||
<reference key="firstItem" ref="595834490"/>
|
|
||||||
<int key="firstAttribute">9</int>
|
|
||||||
<int key="relation">0</int>
|
|
||||||
<reference key="secondItem" ref="670734441"/>
|
|
||||||
<int key="secondAttribute">9</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBLayoutConstant" key="constant">
|
|
||||||
<double key="value">0.0</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="595834490"/>
|
|
||||||
<int key="scoringType">9</int>
|
|
||||||
<float key="scoringTypeFloat">40</float>
|
|
||||||
<int key="contentType">2</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBNSLayoutConstraint" id="51218896">
|
|
||||||
<reference key="firstItem" ref="670734441"/>
|
|
||||||
<int key="firstAttribute">10</int>
|
|
||||||
<int key="relation">0</int>
|
|
||||||
<reference key="secondItem" ref="847623533"/>
|
|
||||||
<int key="secondAttribute">10</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBLayoutConstant" key="constant">
|
|
||||||
<double key="value">0.0</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="595834490"/>
|
|
||||||
<int key="scoringType">6</int>
|
|
||||||
<float key="scoringTypeFloat">24</float>
|
|
||||||
<int key="contentType">2</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBNSLayoutConstraint" id="910263208">
|
|
||||||
<reference key="firstItem" ref="365869599"/>
|
|
||||||
<int key="firstAttribute">11</int>
|
|
||||||
<int key="relation">0</int>
|
|
||||||
<reference key="secondItem" ref="679285412"/>
|
|
||||||
<int key="secondAttribute">11</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBLayoutConstant" key="constant">
|
|
||||||
<double key="value">0.0</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="595834490"/>
|
|
||||||
<int key="scoringType">6</int>
|
|
||||||
<float key="scoringTypeFloat">24</float>
|
|
||||||
<int key="contentType">2</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBNSLayoutConstraint" id="575391720">
|
|
||||||
<reference key="firstItem" ref="762740216"/>
|
|
||||||
<int key="firstAttribute">3</int>
|
|
||||||
<int key="relation">0</int>
|
|
||||||
<reference key="secondItem" ref="595834490"/>
|
|
||||||
<int key="secondAttribute">3</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBNSLayoutSymbolicConstant" key="constant">
|
|
||||||
<double key="value">20</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="595834490"/>
|
|
||||||
<int key="scoringType">8</int>
|
|
||||||
<float key="scoringTypeFloat">29</float>
|
|
||||||
<int key="contentType">3</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBNSLayoutConstraint" id="335749536">
|
|
||||||
<reference key="firstItem" ref="762740216"/>
|
|
||||||
<int key="firstAttribute">9</int>
|
|
||||||
<int key="relation">0</int>
|
|
||||||
<reference key="secondItem" ref="670734441"/>
|
|
||||||
<int key="secondAttribute">9</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBLayoutConstant" key="constant">
|
|
||||||
<double key="value">0.0</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="595834490"/>
|
|
||||||
<int key="scoringType">6</int>
|
|
||||||
<float key="scoringTypeFloat">24</float>
|
|
||||||
<int key="contentType">2</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBNSLayoutConstraint" id="426619093">
|
|
||||||
<reference key="firstItem" ref="847623533"/>
|
|
||||||
<int key="firstAttribute">5</int>
|
|
||||||
<int key="relation">1</int>
|
|
||||||
<reference key="secondItem" ref="595834490"/>
|
|
||||||
<int key="secondAttribute">5</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBNSLayoutSymbolicConstant" key="constant">
|
|
||||||
<double key="value">20</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="595834490"/>
|
|
||||||
<int key="scoringType">9</int>
|
|
||||||
<float key="scoringTypeFloat">40</float>
|
|
||||||
<int key="contentType">3</int>
|
|
||||||
</object>
|
|
||||||
<reference ref="762740216"/>
|
|
||||||
<reference ref="256981522"/>
|
|
||||||
</array>
|
|
||||||
<reference key="parent" ref="0"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">5</int>
|
|
||||||
<reference key="object" ref="256981522"/>
|
|
||||||
<array class="NSMutableArray" key="children">
|
|
||||||
<reference ref="69579583"/>
|
|
||||||
</array>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">6</int>
|
|
||||||
<reference key="object" ref="365869599"/>
|
|
||||||
<array class="NSMutableArray" key="children">
|
|
||||||
<reference ref="324335303"/>
|
|
||||||
</array>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">7</int>
|
|
||||||
<reference key="object" ref="679285412"/>
|
|
||||||
<array class="NSMutableArray" key="children">
|
|
||||||
<reference ref="902994558"/>
|
|
||||||
</array>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">8</int>
|
|
||||||
<reference key="object" ref="670734441"/>
|
|
||||||
<array class="NSMutableArray" key="children">
|
|
||||||
<object class="IBNSLayoutConstraint" id="318411198">
|
|
||||||
<reference key="firstItem" ref="670734441"/>
|
|
||||||
<int key="firstAttribute">7</int>
|
|
||||||
<int key="relation">0</int>
|
|
||||||
<nil key="secondItem"/>
|
|
||||||
<int key="secondAttribute">0</int>
|
|
||||||
<float key="multiplier">1</float>
|
|
||||||
<object class="IBLayoutConstant" key="constant">
|
|
||||||
<double key="value">191</double>
|
|
||||||
</object>
|
|
||||||
<float key="priority">1000</float>
|
|
||||||
<reference key="containingView" ref="670734441"/>
|
|
||||||
<int key="scoringType">9</int>
|
|
||||||
<float key="scoringTypeFloat">40</float>
|
|
||||||
<int key="contentType">1</int>
|
|
||||||
</object>
|
|
||||||
<reference ref="656181976"/>
|
|
||||||
</array>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">9</int>
|
|
||||||
<reference key="object" ref="847623533"/>
|
|
||||||
<array class="NSMutableArray" key="children">
|
|
||||||
<reference ref="792960157"/>
|
|
||||||
</array>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">10</int>
|
|
||||||
<reference key="object" ref="771851607"/>
|
|
||||||
<array class="NSMutableArray" key="children">
|
|
||||||
<reference ref="251779948"/>
|
|
||||||
</array>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">14</int>
|
|
||||||
<reference key="object" ref="426619093"/>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">17</int>
|
|
||||||
<reference key="object" ref="51218896"/>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">18</int>
|
|
||||||
<reference key="object" ref="485639451"/>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">19</int>
|
|
||||||
<reference key="object" ref="612132939"/>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">20</int>
|
|
||||||
<reference key="object" ref="379216952"/>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">22</int>
|
|
||||||
<reference key="object" ref="910263208"/>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">23</int>
|
|
||||||
<reference key="object" ref="966743814"/>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">24</int>
|
|
||||||
<reference key="object" ref="481322683"/>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">25</int>
|
|
||||||
<reference key="object" ref="33581314"/>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">26</int>
|
|
||||||
<reference key="object" ref="340048519"/>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">28</int>
|
|
||||||
<reference key="object" ref="176392839"/>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">29</int>
|
|
||||||
<reference key="object" ref="629412806"/>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">30</int>
|
|
||||||
<reference key="object" ref="381133690"/>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">31</int>
|
|
||||||
<reference key="object" ref="1024015372"/>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">32</int>
|
|
||||||
<reference key="object" ref="251779948"/>
|
|
||||||
<reference key="parent" ref="771851607"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">33</int>
|
|
||||||
<reference key="object" ref="792960157"/>
|
|
||||||
<reference key="parent" ref="847623533"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">34</int>
|
|
||||||
<reference key="object" ref="318411198"/>
|
|
||||||
<reference key="parent" ref="670734441"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">35</int>
|
|
||||||
<reference key="object" ref="656181976"/>
|
|
||||||
<reference key="parent" ref="670734441"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">36</int>
|
|
||||||
<reference key="object" ref="902994558"/>
|
|
||||||
<reference key="parent" ref="679285412"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">37</int>
|
|
||||||
<reference key="object" ref="324335303"/>
|
|
||||||
<reference key="parent" ref="365869599"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">38</int>
|
|
||||||
<reference key="object" ref="69579583"/>
|
|
||||||
<reference key="parent" ref="256981522"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">45</int>
|
|
||||||
<reference key="object" ref="762740216"/>
|
|
||||||
<array class="NSMutableArray" key="children">
|
|
||||||
<reference ref="79241474"/>
|
|
||||||
</array>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">46</int>
|
|
||||||
<reference key="object" ref="79241474"/>
|
|
||||||
<reference key="parent" ref="762740216"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">48</int>
|
|
||||||
<reference key="object" ref="335749536"/>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">49</int>
|
|
||||||
<reference key="object" ref="575391720"/>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
<object class="IBObjectRecord">
|
|
||||||
<int key="objectID">59</int>
|
|
||||||
<reference key="object" ref="501931119"/>
|
|
||||||
<reference key="parent" ref="595834490"/>
|
|
||||||
</object>
|
|
||||||
</array>
|
|
||||||
</object>
|
|
||||||
<dictionary class="NSMutableDictionary" key="flattenedProperties">
|
|
||||||
<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="-3.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<boolean value="NO" key="10.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
|
||||||
<string key="10.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="14.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="17.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="18.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="19.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<array class="NSMutableArray" key="2.IBNSViewMetadataConstraints">
|
|
||||||
<reference ref="426619093"/>
|
|
||||||
<reference ref="335749536"/>
|
|
||||||
<reference ref="575391720"/>
|
|
||||||
<reference ref="910263208"/>
|
|
||||||
<reference ref="51218896"/>
|
|
||||||
<reference ref="485639451"/>
|
|
||||||
<reference ref="612132939"/>
|
|
||||||
<reference ref="379216952"/>
|
|
||||||
<reference ref="966743814"/>
|
|
||||||
<reference ref="481322683"/>
|
|
||||||
<reference ref="33581314"/>
|
|
||||||
<reference ref="340048519"/>
|
|
||||||
<reference ref="176392839"/>
|
|
||||||
<reference ref="629412806"/>
|
|
||||||
<reference ref="381133690"/>
|
|
||||||
<reference ref="1024015372"/>
|
|
||||||
<reference ref="501931119"/>
|
|
||||||
</array>
|
|
||||||
<boolean value="NO" key="2.IBNSViewMetadataLastInspectedTranslatesAutoresizingMaskIntoConstraints"/>
|
|
||||||
<boolean value="NO" key="2.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
|
||||||
<string key="2.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="20.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="22.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="23.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="24.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="25.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="26.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="28.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="29.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="30.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="31.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="32.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="33.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="34.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="35.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="36.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="37.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="38.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<boolean value="NO" key="45.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
|
||||||
<string key="45.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="46.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="48.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="49.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<boolean value="NO" key="5.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
|
||||||
<string key="5.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<string key="59.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<boolean value="NO" key="6.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
|
||||||
<string key="6.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<boolean value="NO" key="7.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
|
||||||
<string key="7.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<array class="NSMutableArray" key="8.IBNSViewMetadataConstraints">
|
|
||||||
<reference ref="318411198"/>
|
|
||||||
</array>
|
|
||||||
<boolean value="NO" key="8.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
|
||||||
<string key="8.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
<boolean value="NO" key="9.IBNSViewMetadataTranslatesAutoresizingMaskIntoConstraints"/>
|
|
||||||
<string key="9.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
|
||||||
</dictionary>
|
|
||||||
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
|
|
||||||
<nil key="activeLocalization"/>
|
|
||||||
<dictionary class="NSMutableDictionary" key="localizations"/>
|
|
||||||
<nil key="sourceID"/>
|
|
||||||
<int key="maxID">59</int>
|
|
||||||
</object>
|
|
||||||
<object class="IBClassDescriber" key="IBDocument.Classes">
|
|
||||||
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
|
||||||
<object class="IBPartialClassDescription">
|
|
||||||
<string key="className">MPPasswordEditViewController</string>
|
|
||||||
<string key="superclassName">MPViewController</string>
|
|
||||||
<dictionary class="NSMutableDictionary" key="actions">
|
|
||||||
<string key="_cancel:">id</string>
|
|
||||||
<string key="_change:">id</string>
|
|
||||||
</dictionary>
|
|
||||||
<dictionary class="NSMutableDictionary" key="actionInfosByName">
|
|
||||||
<object class="IBActionInfo" key="_cancel:">
|
|
||||||
<string key="name">_cancel:</string>
|
|
||||||
<string key="candidateClassName">id</string>
|
|
||||||
</object>
|
|
||||||
<object class="IBActionInfo" key="_change:">
|
|
||||||
<string key="name">_change:</string>
|
|
||||||
<string key="candidateClassName">id</string>
|
|
||||||
</object>
|
|
||||||
</dictionary>
|
|
||||||
<dictionary class="NSMutableDictionary" key="outlets">
|
|
||||||
<string key="keyfilePathControl">NSPathControl</string>
|
|
||||||
<string key="passwordTextField">NSSecureTextField</string>
|
|
||||||
</dictionary>
|
|
||||||
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
|
|
||||||
<object class="IBToOneOutletInfo" key="keyfilePathControl">
|
|
||||||
<string key="name">keyfilePathControl</string>
|
|
||||||
<string key="candidateClassName">NSPathControl</string>
|
|
||||||
</object>
|
|
||||||
<object class="IBToOneOutletInfo" key="passwordTextField">
|
|
||||||
<string key="name">passwordTextField</string>
|
|
||||||
<string key="candidateClassName">NSSecureTextField</string>
|
|
||||||
</object>
|
|
||||||
</dictionary>
|
|
||||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
|
||||||
<string key="majorKey">IBProjectSource</string>
|
|
||||||
<string key="minorKey">./Classes/MPPasswordEditViewController.h</string>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="IBPartialClassDescription">
|
|
||||||
<string key="className">MPViewController</string>
|
|
||||||
<string key="superclassName">NSViewController</string>
|
|
||||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
|
||||||
<string key="majorKey">IBProjectSource</string>
|
|
||||||
<string key="minorKey">./Classes/MPViewController.h</string>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object class="IBPartialClassDescription">
|
|
||||||
<string key="className">NSLayoutConstraint</string>
|
|
||||||
<string key="superclassName">NSObject</string>
|
|
||||||
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
|
||||||
<string key="majorKey">IBProjectSource</string>
|
|
||||||
<string key="minorKey">./Classes/NSLayoutConstraint.h</string>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</array>
|
|
||||||
</object>
|
|
||||||
<int key="IBDocument.localizationMode">0</int>
|
|
||||||
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
|
|
||||||
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
|
|
||||||
<int key="IBDocument.defaultPropertyAccessControl">3</int>
|
|
||||||
<bool key="IBDocument.UseAutolayout">YES</bool>
|
|
||||||
</data>
|
|
||||||
</archive>
|
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
<object class="NSWindowTemplate" id="1005">
|
<object class="NSWindowTemplate" id="1005">
|
||||||
<int key="NSWindowStyleMask">15</int>
|
<int key="NSWindowStyleMask">15</int>
|
||||||
<int key="NSWindowBacking">2</int>
|
<int key="NSWindowBacking">2</int>
|
||||||
<string key="NSWindowRect">{{196, 240}, {560, 490}}</string>
|
<string key="NSWindowRect">{{196, 240}, {700, 500}}</string>
|
||||||
<int key="NSWTFlags">1618477056</int>
|
<int key="NSWTFlags">1618477056</int>
|
||||||
<string key="NSWindowTitle">Window</string>
|
<string key="NSWindowTitle">Window</string>
|
||||||
<string key="NSWindowClass">NSWindow</string>
|
<string key="NSWindowClass">NSWindow</string>
|
||||||
@@ -46,23 +46,26 @@
|
|||||||
<reference key="NSNextResponder"/>
|
<reference key="NSNextResponder"/>
|
||||||
<int key="NSvFlags">256</int>
|
<int key="NSvFlags">256</int>
|
||||||
<array class="NSMutableArray" key="NSSubviews"/>
|
<array class="NSMutableArray" key="NSSubviews"/>
|
||||||
<string key="NSFrameSize">{560, 490}</string>
|
<string key="NSFrameSize">{700, 500}</string>
|
||||||
<reference key="NSSuperview"/>
|
<reference key="NSSuperview"/>
|
||||||
<reference key="NSWindow"/>
|
<reference key="NSWindow"/>
|
||||||
<reference key="NSNextKeyView"/>
|
|
||||||
</object>
|
</object>
|
||||||
<string key="NSScreenRect">{{0, 0}, {1920, 1058}}</string>
|
<string key="NSScreenRect">{{0, 0}, {2560, 1418}}</string>
|
||||||
<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
|
<string key="NSMaxSize">{10000000000000, 10000000000000}</string>
|
||||||
|
<string key="NSFrameAutosaveName">DatabaseWindow</string>
|
||||||
<bool key="NSWindowIsRestorable">YES</bool>
|
<bool key="NSWindowIsRestorable">YES</bool>
|
||||||
</object>
|
</object>
|
||||||
<object class="NSSplitView" id="903506498">
|
<object class="NSSplitView" id="903506498">
|
||||||
<nil key="NSNextResponder"/>
|
<reference key="NSNextResponder"/>
|
||||||
<int key="NSvFlags">268</int>
|
<int key="NSvFlags">268</int>
|
||||||
<array class="NSMutableArray" key="NSSubviews"/>
|
<array class="NSMutableArray" key="NSSubviews"/>
|
||||||
<string key="NSFrameSize">{560, 194}</string>
|
<string key="NSFrameSize">{560, 194}</string>
|
||||||
|
<reference key="NSSuperview"/>
|
||||||
|
<reference key="NSWindow"/>
|
||||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||||
<bool key="NSIsVertical">YES</bool>
|
<bool key="NSIsVertical">YES</bool>
|
||||||
<int key="NSDividerStyle">2</int>
|
<int key="NSDividerStyle">2</int>
|
||||||
|
<string key="NSAutosaveName"/>
|
||||||
</object>
|
</object>
|
||||||
</array>
|
</array>
|
||||||
<object class="IBObjectContainer" key="IBDocument.Objects">
|
<object class="IBObjectContainer" key="IBDocument.Objects">
|
||||||
@@ -158,15 +161,20 @@
|
|||||||
<string key="superclassName">NSWindowController</string>
|
<string key="superclassName">NSWindowController</string>
|
||||||
<dictionary class="NSMutableDictionary" key="actions">
|
<dictionary class="NSMutableDictionary" key="actions">
|
||||||
<string key="editPassword:">id</string>
|
<string key="editPassword:">id</string>
|
||||||
<string key="showDocumentSettings:">id</string>
|
<string key="exportDatabase:">id</string>
|
||||||
|
<string key="showDatabaseSettings:">id</string>
|
||||||
</dictionary>
|
</dictionary>
|
||||||
<dictionary class="NSMutableDictionary" key="actionInfosByName">
|
<dictionary class="NSMutableDictionary" key="actionInfosByName">
|
||||||
<object class="IBActionInfo" key="editPassword:">
|
<object class="IBActionInfo" key="editPassword:">
|
||||||
<string key="name">editPassword:</string>
|
<string key="name">editPassword:</string>
|
||||||
<string key="candidateClassName">id</string>
|
<string key="candidateClassName">id</string>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBActionInfo" key="showDocumentSettings:">
|
<object class="IBActionInfo" key="exportDatabase:">
|
||||||
<string key="name">showDocumentSettings:</string>
|
<string key="name">exportDatabase:</string>
|
||||||
|
<string key="candidateClassName">id</string>
|
||||||
|
</object>
|
||||||
|
<object class="IBActionInfo" key="showDatabaseSettings:">
|
||||||
|
<string key="name">showDatabaseSettings:</string>
|
||||||
<string key="candidateClassName">id</string>
|
<string key="candidateClassName">id</string>
|
||||||
</object>
|
</object>
|
||||||
</dictionary>
|
</dictionary>
|
||||||
|
|||||||
@@ -57,6 +57,7 @@
|
|||||||
<int key="NSvFlags">268</int>
|
<int key="NSvFlags">268</int>
|
||||||
<string key="NSFrame">{{7, 5}, {32, 19}}</string>
|
<string key="NSFrame">{{7, 5}, {32, 19}}</string>
|
||||||
<reference key="NSSuperview" ref="163272962"/>
|
<reference key="NSSuperview" ref="163272962"/>
|
||||||
|
<reference key="NSWindow"/>
|
||||||
<reference key="NSNextKeyView"/>
|
<reference key="NSNextKeyView"/>
|
||||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||||
<bool key="NSEnabled">YES</bool>
|
<bool key="NSEnabled">YES</bool>
|
||||||
@@ -85,8 +86,9 @@
|
|||||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||||
</object>
|
</object>
|
||||||
</array>
|
</array>
|
||||||
<string key="NSFrameSize">{684, 30}</string>
|
<string key="NSFrameSize">{694, 30}</string>
|
||||||
<reference key="NSSuperview" ref="997686550"/>
|
<reference key="NSSuperview" ref="997686550"/>
|
||||||
|
<reference key="NSWindow"/>
|
||||||
<reference key="NSNextKeyView" ref="276578969"/>
|
<reference key="NSNextKeyView" ref="276578969"/>
|
||||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||||
<string key="NSClassName">HNHGradientView</string>
|
<string key="NSClassName">HNHGradientView</string>
|
||||||
@@ -103,8 +105,9 @@
|
|||||||
<reference key="NSNextResponder" ref="262664416"/>
|
<reference key="NSNextResponder" ref="262664416"/>
|
||||||
<int key="NSvFlags">256</int>
|
<int key="NSvFlags">256</int>
|
||||||
<array class="NSMutableArray" key="NSSubviews"/>
|
<array class="NSMutableArray" key="NSSubviews"/>
|
||||||
<string key="NSFrameSize">{684, 548}</string>
|
<string key="NSFrameSize">{694, 548}</string>
|
||||||
<reference key="NSSuperview" ref="262664416"/>
|
<reference key="NSSuperview" ref="262664416"/>
|
||||||
|
<reference key="NSWindow"/>
|
||||||
<reference key="NSNextKeyView" ref="788738248"/>
|
<reference key="NSNextKeyView" ref="788738248"/>
|
||||||
<string key="NSReuseIdentifierKey">_NS:13</string>
|
<string key="NSReuseIdentifierKey">_NS:13</string>
|
||||||
<bool key="NSEnabled">YES</bool>
|
<bool key="NSEnabled">YES</bool>
|
||||||
@@ -113,8 +116,9 @@
|
|||||||
<object class="NSTableHeaderView" key="NSHeaderView" id="253618752">
|
<object class="NSTableHeaderView" key="NSHeaderView" id="253618752">
|
||||||
<reference key="NSNextResponder" ref="736877784"/>
|
<reference key="NSNextResponder" ref="736877784"/>
|
||||||
<int key="NSvFlags">256</int>
|
<int key="NSvFlags">256</int>
|
||||||
<string key="NSFrameSize">{684, 17}</string>
|
<string key="NSFrameSize">{694, 17}</string>
|
||||||
<reference key="NSSuperview" ref="736877784"/>
|
<reference key="NSSuperview" ref="736877784"/>
|
||||||
|
<reference key="NSWindow"/>
|
||||||
<reference key="NSNextKeyView" ref="262664416"/>
|
<reference key="NSNextKeyView" ref="262664416"/>
|
||||||
<reference key="NSTableView" ref="528076956"/>
|
<reference key="NSTableView" ref="528076956"/>
|
||||||
</object>
|
</object>
|
||||||
@@ -272,7 +276,7 @@
|
|||||||
<reference key="NSTableView" ref="528076956"/>
|
<reference key="NSTableView" ref="528076956"/>
|
||||||
</object>
|
</object>
|
||||||
<object class="NSTableColumn" id="683421605">
|
<object class="NSTableColumn" id="683421605">
|
||||||
<double key="NSWidth">188</double>
|
<double key="NSWidth">198</double>
|
||||||
<double key="NSMinWidth">10</double>
|
<double key="NSMinWidth">10</double>
|
||||||
<double key="NSMaxWidth">3.4028234663852886e+38</double>
|
<double key="NSMaxWidth">3.4028234663852886e+38</double>
|
||||||
<object class="NSTableHeaderCell" key="NSHeaderCell">
|
<object class="NSTableHeaderCell" key="NSHeaderCell">
|
||||||
@@ -325,8 +329,9 @@
|
|||||||
<int key="NSTableViewGroupRowStyle">1</int>
|
<int key="NSTableViewGroupRowStyle">1</int>
|
||||||
</object>
|
</object>
|
||||||
</array>
|
</array>
|
||||||
<string key="NSFrame">{{0, 17}, {684, 548}}</string>
|
<string key="NSFrame">{{0, 17}, {694, 548}}</string>
|
||||||
<reference key="NSSuperview" ref="613995671"/>
|
<reference key="NSSuperview" ref="613995671"/>
|
||||||
|
<reference key="NSWindow"/>
|
||||||
<reference key="NSNextKeyView" ref="528076956"/>
|
<reference key="NSNextKeyView" ref="528076956"/>
|
||||||
<string key="NSReuseIdentifierKey">_NS:11</string>
|
<string key="NSReuseIdentifierKey">_NS:11</string>
|
||||||
<reference key="NSDocView" ref="528076956"/>
|
<reference key="NSDocView" ref="528076956"/>
|
||||||
@@ -338,6 +343,7 @@
|
|||||||
<int key="NSvFlags">-2147483392</int>
|
<int key="NSvFlags">-2147483392</int>
|
||||||
<string key="NSFrame">{{224, 17}, {15, 102}}</string>
|
<string key="NSFrame">{{224, 17}, {15, 102}}</string>
|
||||||
<reference key="NSSuperview" ref="613995671"/>
|
<reference key="NSSuperview" ref="613995671"/>
|
||||||
|
<reference key="NSWindow"/>
|
||||||
<reference key="NSNextKeyView" ref="802411427"/>
|
<reference key="NSNextKeyView" ref="802411427"/>
|
||||||
<string key="NSReuseIdentifierKey">_NS:58</string>
|
<string key="NSReuseIdentifierKey">_NS:58</string>
|
||||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||||
@@ -350,6 +356,7 @@
|
|||||||
<int key="NSvFlags">-2147483392</int>
|
<int key="NSvFlags">-2147483392</int>
|
||||||
<string key="NSFrame">{{0, 310}, {480, 16}}</string>
|
<string key="NSFrame">{{0, 310}, {480, 16}}</string>
|
||||||
<reference key="NSSuperview" ref="613995671"/>
|
<reference key="NSSuperview" ref="613995671"/>
|
||||||
|
<reference key="NSWindow"/>
|
||||||
<reference key="NSNextKeyView" ref="163272962"/>
|
<reference key="NSNextKeyView" ref="163272962"/>
|
||||||
<string key="NSReuseIdentifierKey">_NS:60</string>
|
<string key="NSReuseIdentifierKey">_NS:60</string>
|
||||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||||
@@ -364,16 +371,18 @@
|
|||||||
<array class="NSMutableArray" key="NSSubviews">
|
<array class="NSMutableArray" key="NSSubviews">
|
||||||
<reference ref="253618752"/>
|
<reference ref="253618752"/>
|
||||||
</array>
|
</array>
|
||||||
<string key="NSFrameSize">{684, 17}</string>
|
<string key="NSFrameSize">{694, 17}</string>
|
||||||
<reference key="NSSuperview" ref="613995671"/>
|
<reference key="NSSuperview" ref="613995671"/>
|
||||||
|
<reference key="NSWindow"/>
|
||||||
<reference key="NSNextKeyView" ref="253618752"/>
|
<reference key="NSNextKeyView" ref="253618752"/>
|
||||||
<reference key="NSDocView" ref="253618752"/>
|
<reference key="NSDocView" ref="253618752"/>
|
||||||
<reference key="NSBGColor" ref="136901388"/>
|
<reference key="NSBGColor" ref="136901388"/>
|
||||||
<int key="NScvFlags">4</int>
|
<int key="NScvFlags">4</int>
|
||||||
</object>
|
</object>
|
||||||
</array>
|
</array>
|
||||||
<string key="NSFrame">{{0, 30}, {684, 565}}</string>
|
<string key="NSFrame">{{0, 30}, {694, 565}}</string>
|
||||||
<reference key="NSSuperview" ref="997686550"/>
|
<reference key="NSSuperview" ref="997686550"/>
|
||||||
|
<reference key="NSWindow"/>
|
||||||
<reference key="NSNextKeyView" ref="736877784"/>
|
<reference key="NSNextKeyView" ref="736877784"/>
|
||||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||||
<int key="NSsFlags">133680</int>
|
<int key="NSsFlags">133680</int>
|
||||||
@@ -387,8 +396,9 @@
|
|||||||
<double key="NSMagnification">1</double>
|
<double key="NSMagnification">1</double>
|
||||||
</object>
|
</object>
|
||||||
</array>
|
</array>
|
||||||
<string key="NSFrameSize">{684, 594}</string>
|
<string key="NSFrameSize">{694, 594}</string>
|
||||||
<reference key="NSSuperview"/>
|
<reference key="NSSuperview"/>
|
||||||
|
<reference key="NSWindow"/>
|
||||||
<reference key="NSNextKeyView" ref="613995671"/>
|
<reference key="NSNextKeyView" ref="613995671"/>
|
||||||
<string key="NSReuseIdentifierKey">_NS:9</string>
|
<string key="NSReuseIdentifierKey">_NS:9</string>
|
||||||
<string key="NSClassName">NSView</string>
|
<string key="NSClassName">NSView</string>
|
||||||
@@ -646,7 +656,7 @@
|
|||||||
<object class="NSTextField" id="488604658">
|
<object class="NSTextField" id="488604658">
|
||||||
<reference key="NSNextResponder" ref="954630866"/>
|
<reference key="NSNextResponder" ref="954630866"/>
|
||||||
<int key="NSvFlags">266</int>
|
<int key="NSvFlags">266</int>
|
||||||
<string key="NSFrameSize">{188, 17}</string>
|
<string key="NSFrameSize">{198, 17}</string>
|
||||||
<reference key="NSSuperview" ref="954630866"/>
|
<reference key="NSSuperview" ref="954630866"/>
|
||||||
<reference key="NSNextKeyView" ref="1037276411"/>
|
<reference key="NSNextKeyView" ref="1037276411"/>
|
||||||
<string key="NSAntiCompressionPriority">{250, 750}</string>
|
<string key="NSAntiCompressionPriority">{250, 750}</string>
|
||||||
@@ -663,7 +673,7 @@
|
|||||||
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
<bool key="NSAllowsLogicalLayoutDirection">NO</bool>
|
||||||
</object>
|
</object>
|
||||||
</array>
|
</array>
|
||||||
<string key="NSFrame">{{494, 1}, {188, 17}}</string>
|
<string key="NSFrame">{{494, 1}, {198, 17}}</string>
|
||||||
<reference key="NSNextKeyView" ref="488604658"/>
|
<reference key="NSNextKeyView" ref="488604658"/>
|
||||||
</object>
|
</object>
|
||||||
<reference key="destination" ref="488604658"/>
|
<reference key="destination" ref="488604658"/>
|
||||||
@@ -1565,7 +1575,7 @@
|
|||||||
<reference key="parent" ref="276578969"/>
|
<reference key="parent" ref="276578969"/>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBObjectRecord">
|
<object class="IBObjectRecord">
|
||||||
<int key="objectID">790</int>
|
<int key="objectID">834</int>
|
||||||
<reference key="object" ref="244975730"/>
|
<reference key="object" ref="244975730"/>
|
||||||
<reference key="parent" ref="163272962"/>
|
<reference key="parent" ref="163272962"/>
|
||||||
</object>
|
</object>
|
||||||
@@ -1705,7 +1715,7 @@
|
|||||||
<string key="678.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
<string key="678.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
<string key="679.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
<string key="679.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
<string key="683.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
<string key="683.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
<array class="NSMutableArray" key="690.IBNSViewMetadataConstraints">
|
<array key="690.IBNSViewMetadataConstraints">
|
||||||
<reference ref="337191559"/>
|
<reference ref="337191559"/>
|
||||||
<reference ref="187301323"/>
|
<reference ref="187301323"/>
|
||||||
<reference ref="244975730"/>
|
<reference ref="244975730"/>
|
||||||
@@ -1725,15 +1735,117 @@
|
|||||||
<string key="733.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
<string key="733.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
<string key="741.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
<string key="741.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
<string key="743.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
<string key="743.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
<string key="790.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
<string key="834.IBPluginDependency">com.apple.InterfaceBuilder.CocoaPlugin</string>
|
||||||
</dictionary>
|
</dictionary>
|
||||||
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
|
<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
|
||||||
<nil key="activeLocalization"/>
|
<nil key="activeLocalization"/>
|
||||||
<dictionary class="NSMutableDictionary" key="localizations"/>
|
<dictionary class="NSMutableDictionary" key="localizations"/>
|
||||||
<nil key="sourceID"/>
|
<nil key="sourceID"/>
|
||||||
<int key="maxID">801</int>
|
<int key="maxID">834</int>
|
||||||
|
</object>
|
||||||
|
<object class="IBClassDescriber" key="IBDocument.Classes">
|
||||||
|
<array class="NSMutableArray" key="referencedPartialClassDescriptions">
|
||||||
|
<object class="IBPartialClassDescription">
|
||||||
|
<string key="className">HNHGradientView</string>
|
||||||
|
<string key="superclassName">NSView</string>
|
||||||
|
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||||
|
<string key="majorKey">IBProjectSource</string>
|
||||||
|
<string key="minorKey">./Classes/HNHGradientView.h</string>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
<object class="IBPartialClassDescription">
|
||||||
|
<string key="className">MPEntryViewController</string>
|
||||||
|
<string key="superclassName">MPViewController</string>
|
||||||
|
<dictionary class="NSMutableDictionary" key="outlets">
|
||||||
|
<string key="addEntryButton">NSButton</string>
|
||||||
|
<string key="bottomBar">HNHGradientView</string>
|
||||||
|
<string key="entryTable">NSTableView</string>
|
||||||
|
<string key="filterBar">NSView</string>
|
||||||
|
<string key="filterDoneButton">NSButton</string>
|
||||||
|
<string key="filterLabelTextField">NSTextField</string>
|
||||||
|
<string key="filterSearchField">NSSearchField</string>
|
||||||
|
<string key="filterTitleButton">NSButton</string>
|
||||||
|
<string key="filterURLButton">NSButton</string>
|
||||||
|
<string key="filterUsernameButton">NSButton</string>
|
||||||
|
<string key="tableToTop">NSLayoutConstraint</string>
|
||||||
|
</dictionary>
|
||||||
|
<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
|
||||||
|
<object class="IBToOneOutletInfo" key="addEntryButton">
|
||||||
|
<string key="name">addEntryButton</string>
|
||||||
|
<string key="candidateClassName">NSButton</string>
|
||||||
|
</object>
|
||||||
|
<object class="IBToOneOutletInfo" key="bottomBar">
|
||||||
|
<string key="name">bottomBar</string>
|
||||||
|
<string key="candidateClassName">HNHGradientView</string>
|
||||||
|
</object>
|
||||||
|
<object class="IBToOneOutletInfo" key="entryTable">
|
||||||
|
<string key="name">entryTable</string>
|
||||||
|
<string key="candidateClassName">NSTableView</string>
|
||||||
|
</object>
|
||||||
|
<object class="IBToOneOutletInfo" key="filterBar">
|
||||||
|
<string key="name">filterBar</string>
|
||||||
|
<string key="candidateClassName">NSView</string>
|
||||||
|
</object>
|
||||||
|
<object class="IBToOneOutletInfo" key="filterDoneButton">
|
||||||
|
<string key="name">filterDoneButton</string>
|
||||||
|
<string key="candidateClassName">NSButton</string>
|
||||||
|
</object>
|
||||||
|
<object class="IBToOneOutletInfo" key="filterLabelTextField">
|
||||||
|
<string key="name">filterLabelTextField</string>
|
||||||
|
<string key="candidateClassName">NSTextField</string>
|
||||||
|
</object>
|
||||||
|
<object class="IBToOneOutletInfo" key="filterSearchField">
|
||||||
|
<string key="name">filterSearchField</string>
|
||||||
|
<string key="candidateClassName">NSSearchField</string>
|
||||||
|
</object>
|
||||||
|
<object class="IBToOneOutletInfo" key="filterTitleButton">
|
||||||
|
<string key="name">filterTitleButton</string>
|
||||||
|
<string key="candidateClassName">NSButton</string>
|
||||||
|
</object>
|
||||||
|
<object class="IBToOneOutletInfo" key="filterURLButton">
|
||||||
|
<string key="name">filterURLButton</string>
|
||||||
|
<string key="candidateClassName">NSButton</string>
|
||||||
|
</object>
|
||||||
|
<object class="IBToOneOutletInfo" key="filterUsernameButton">
|
||||||
|
<string key="name">filterUsernameButton</string>
|
||||||
|
<string key="candidateClassName">NSButton</string>
|
||||||
|
</object>
|
||||||
|
<object class="IBToOneOutletInfo" key="tableToTop">
|
||||||
|
<string key="name">tableToTop</string>
|
||||||
|
<string key="candidateClassName">NSLayoutConstraint</string>
|
||||||
|
</object>
|
||||||
|
</dictionary>
|
||||||
|
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||||
|
<string key="majorKey">IBProjectSource</string>
|
||||||
|
<string key="minorKey">./Classes/MPEntryViewController.h</string>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
<object class="IBPartialClassDescription">
|
||||||
|
<string key="className">MPTableView</string>
|
||||||
|
<string key="superclassName">NSTableView</string>
|
||||||
|
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||||
|
<string key="majorKey">IBProjectSource</string>
|
||||||
|
<string key="minorKey">./Classes/MPTableView.h</string>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
<object class="IBPartialClassDescription">
|
||||||
|
<string key="className">MPViewController</string>
|
||||||
|
<string key="superclassName">NSViewController</string>
|
||||||
|
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||||
|
<string key="majorKey">IBProjectSource</string>
|
||||||
|
<string key="minorKey">./Classes/MPViewController.h</string>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
<object class="IBPartialClassDescription">
|
||||||
|
<string key="className">NSLayoutConstraint</string>
|
||||||
|
<string key="superclassName">NSObject</string>
|
||||||
|
<object class="IBClassDescriptionSource" key="sourceIdentifier">
|
||||||
|
<string key="majorKey">IBProjectSource</string>
|
||||||
|
<string key="minorKey">./Classes/NSLayoutConstraint.h</string>
|
||||||
|
</object>
|
||||||
|
</object>
|
||||||
|
</array>
|
||||||
</object>
|
</object>
|
||||||
<object class="IBClassDescriber" key="IBDocument.Classes"/>
|
|
||||||
<int key="IBDocument.localizationMode">0</int>
|
<int key="IBDocument.localizationMode">0</int>
|
||||||
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
|
<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaFramework</string>
|
||||||
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
|
<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
|
||||||
|
|||||||
BIN
MacPass/Icons/06_BlockDeviceTemplate.pdf
Normal file
BIN
MacPass/Icons/12_RemoteTemplate.pdf
Normal file
BIN
MacPass/Icons/13_KeysTemplate.pdf
Normal file
BIN
MacPass/Icons/18_DisplayTemplate.pdf
Normal file
BIN
MacPass/Icons/26_FileSaveTemplate.pdf
Normal file
BIN
MacPass/Icons/48_FolderTemplate.pdf
Normal file
BIN
MacPass/Icons/68_PhoneTemplate.pdf
Normal file
BIN
MacPass/Icons/99_AddFolderTemplate.pdf
Normal file
BIN
MacPass/Icons/99_HarddiskTemplate.pdf
Normal file
18
MacPass/Kdb3Entry+KVOAdditions.h
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// Kdb3Entry+KVOAdditions.h
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Michael Starke on 19.07.13.
|
||||||
|
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "Kdb3Node.h"
|
||||||
|
|
||||||
|
@interface Kdb3Entry (KVOAdditions)
|
||||||
|
|
||||||
|
- (NSUInteger)countOfBinaries;
|
||||||
|
- (id)objectInBinariesAtIndex:(NSUInteger)index;
|
||||||
|
- (void)removeObjectFromBinariesAtIndex:(NSUInteger)index;
|
||||||
|
- (void)insertObject:(id)binary inBinariesAtIndex:(NSUInteger)index;
|
||||||
|
|
||||||
|
@end
|
||||||
31
MacPass/Kdb3Entry+KVOAdditions.m
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
//
|
||||||
|
// Kdb3Entry+KVOAdditions.m
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Michael Starke on 19.07.13.
|
||||||
|
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "Kdb3Entry+KVOAdditions.h"
|
||||||
|
|
||||||
|
@implementation Kdb3Entry (KVOAdditions)
|
||||||
|
|
||||||
|
- (NSUInteger)countOfBinaries {
|
||||||
|
return (self.binary != nil ? 1 : 0);
|
||||||
|
}
|
||||||
|
- (id)objectInBinariesAtIndex:(NSUInteger)index {
|
||||||
|
return self.binary;
|
||||||
|
}
|
||||||
|
- (void)removeObjectFromBinariesAtIndex:(NSUInteger)index {
|
||||||
|
if(self.binary ) {
|
||||||
|
self.binary = nil;
|
||||||
|
self.binaryDesc = nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- (void)insertObject:(id)binary inBinariesAtIndex:(NSUInteger)index {
|
||||||
|
return;//
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -18,32 +18,32 @@
|
|||||||
tree.root = rootGroup;
|
tree.root = rootGroup;
|
||||||
|
|
||||||
KdbGroup *parentGroup = [tree createGroup:rootGroup];
|
KdbGroup *parentGroup = [tree createGroup:rootGroup];
|
||||||
parentGroup.name = @"General";
|
parentGroup.name = NSLocalizedString(@"GENERAL", "General");
|
||||||
parentGroup.image = 48;
|
parentGroup.image = 48;
|
||||||
[rootGroup addGroup:parentGroup];
|
[rootGroup addGroup:parentGroup];
|
||||||
|
|
||||||
KdbGroup *group = [tree createGroup:parentGroup];
|
KdbGroup *group = [tree createGroup:parentGroup];
|
||||||
group.name = @"Windows";
|
group.name = NSLocalizedString(@"WINDOWS", "Windows");
|
||||||
group.image = 38;
|
group.image = 38;
|
||||||
[parentGroup addGroup:group];
|
[parentGroup addGroup:group];
|
||||||
|
|
||||||
group = [tree createGroup:parentGroup];
|
group = [tree createGroup:parentGroup];
|
||||||
group.name = @"Network";
|
group.name = NSLocalizedString(@"NETWORK", "Network");
|
||||||
group.image = 3;
|
group.image = 3;
|
||||||
[parentGroup addGroup:group];
|
[parentGroup addGroup:group];
|
||||||
|
|
||||||
group = [tree createGroup:parentGroup];
|
group = [tree createGroup:parentGroup];
|
||||||
group.name = @"Internet";
|
group.name = NSLocalizedString(@"INTERNET", "Internet");
|
||||||
group.image = 1;
|
group.image = 1;
|
||||||
[parentGroup addGroup:group];
|
[parentGroup addGroup:group];
|
||||||
|
|
||||||
group = [tree createGroup:parentGroup];
|
group = [tree createGroup:parentGroup];
|
||||||
group.name = @"eMail";
|
group.name = NSLocalizedString(@"EMAIL", "EMail");
|
||||||
group.image = 19;
|
group.image = 19;
|
||||||
[parentGroup addGroup:group];
|
[parentGroup addGroup:group];
|
||||||
|
|
||||||
group = [tree createGroup:parentGroup];
|
group = [tree createGroup:parentGroup];
|
||||||
group.name = @"Homebanking";
|
group.name = NSLocalizedString(@"HOMEBANKING", "Homebanking");
|
||||||
group.image = 37;
|
group.image = 37;
|
||||||
[parentGroup addGroup:group];
|
[parentGroup addGroup:group];
|
||||||
|
|
||||||
|
|||||||
@@ -15,5 +15,9 @@
|
|||||||
- (void)removeObjectFromStringFieldsAtIndex:(NSUInteger)anIndex;
|
- (void)removeObjectFromStringFieldsAtIndex:(NSUInteger)anIndex;
|
||||||
- (void)insertObject:(StringField *)stringfield inStringFieldsAtIndex:(NSUInteger)anIndex;
|
- (void)insertObject:(StringField *)stringfield inStringFieldsAtIndex:(NSUInteger)anIndex;
|
||||||
|
|
||||||
|
- (NSUInteger)countOfBinaries;
|
||||||
|
- (BinaryRef *)objectInBinariesAtIndex:(NSUInteger)index;
|
||||||
|
- (void)removeObjectFromBinariesAtIndex:(NSUInteger)index;
|
||||||
|
- (void)insertObject:(BinaryRef *)binary inBinariesAtIndex:(NSUInteger)index;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
@implementation Kdb4Entry (KVOAdditions)
|
@implementation Kdb4Entry (KVOAdditions)
|
||||||
|
|
||||||
|
/* Entries */
|
||||||
- (NSUInteger)countOfStringFields {
|
- (NSUInteger)countOfStringFields {
|
||||||
return [self.stringFields count];
|
return [self.stringFields count];
|
||||||
}
|
}
|
||||||
@@ -26,4 +27,21 @@
|
|||||||
[self.stringFields removeObjectAtIndex:anIndex];
|
[self.stringFields removeObjectAtIndex:anIndex];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Binaries */
|
||||||
|
- (NSUInteger)countOfBinaries {
|
||||||
|
return [self.binaries count];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BinaryRef *)objectInBinariesAtIndex:(NSUInteger)index {
|
||||||
|
return (self.binaries)[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)insertObject:(BinaryRef *)binary inBinariesAtIndex:(NSUInteger)index {
|
||||||
|
[self.binaries insertObject:binary atIndex:index];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)removeObjectFromBinariesAtIndex:(NSUInteger)index {
|
||||||
|
[self.binaries removeObjectAtIndex:index];
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
15
MacPass/Kdb4Entry+MPAdditions.h
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
//
|
||||||
|
// Kdb4Entry+MPAdditions.h
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Michael Starke on 19.07.13.
|
||||||
|
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "Kdb4Node.h"
|
||||||
|
|
||||||
|
@interface Kdb4Entry (MPAdditions)
|
||||||
|
|
||||||
|
- (NSString *)uniqueKeyForProposal:(NSString *)key;
|
||||||
|
|
||||||
|
@end
|
||||||
34
MacPass/Kdb4Entry+MPAdditions.m
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
//
|
||||||
|
// Kdb4Entry+MPAdditions.m
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Michael Starke on 19.07.13.
|
||||||
|
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "Kdb4Entry+MPAdditions.h"
|
||||||
|
|
||||||
|
@implementation Kdb4Entry (MPAdditions)
|
||||||
|
|
||||||
|
- (NSString *)uniqueKeyForProposal:(NSString *)key {
|
||||||
|
/*
|
||||||
|
FIXME: Introduce some cachin behaviour. We iterate over after every single edit
|
||||||
|
*/
|
||||||
|
NSArray *defaultKeys = @[ FIELD_TITLE,
|
||||||
|
FIELD_USER_NAME,
|
||||||
|
FIELD_PASSWORD,
|
||||||
|
FIELD_URL,
|
||||||
|
FIELD_NOTES ];
|
||||||
|
NSMutableSet *keys = [[NSMutableSet alloc] initWithArray:defaultKeys];
|
||||||
|
for(StringField *field in self.stringFields) {
|
||||||
|
[keys addObject:field.key];
|
||||||
|
}
|
||||||
|
NSUInteger counter = 1;
|
||||||
|
NSString *base = key;
|
||||||
|
while([keys containsObject:key]) {
|
||||||
|
key = [NSString stringWithFormat:@"%@-%ld", base, counter++];
|
||||||
|
}
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -11,5 +11,6 @@
|
|||||||
@interface Kdb4Tree (NewTree)
|
@interface Kdb4Tree (NewTree)
|
||||||
|
|
||||||
+(Kdb4Tree *)templateTree;
|
+(Kdb4Tree *)templateTree;
|
||||||
|
+(Kdb4Tree *)demoTree;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
|
|
||||||
Kdb4Tree *tree = [[Kdb4Tree alloc] init];
|
Kdb4Tree *tree = [[Kdb4Tree alloc] init];
|
||||||
tree.generator = @"MacPass";
|
tree.generator = @"MacPass";
|
||||||
tree.databaseName = @"";
|
tree.databaseName = NSLocalizedString(@"DATABASE", "");
|
||||||
tree.databaseNameChanged = currentTime;
|
tree.databaseNameChanged = currentTime;
|
||||||
tree.databaseDescription = @"";
|
tree.databaseDescription = @"";
|
||||||
tree.databaseDescriptionChanged = currentTime;
|
tree.databaseDescriptionChanged = currentTime;
|
||||||
@@ -41,35 +41,81 @@
|
|||||||
tree.lastSelectedGroup = [UUID nullUuid];
|
tree.lastSelectedGroup = [UUID nullUuid];
|
||||||
tree.lastTopVisibleGroup = [UUID nullUuid];
|
tree.lastTopVisibleGroup = [UUID nullUuid];
|
||||||
|
|
||||||
|
KdbGroup *parentGroup = [tree createGroup:nil];
|
||||||
|
parentGroup.name = NSLocalizedString(@"GENERAL", "General");
|
||||||
|
parentGroup.image = 48;
|
||||||
|
tree.root = parentGroup;
|
||||||
|
|
||||||
|
KdbGroup *group = [tree createGroup:parentGroup];
|
||||||
|
group.name = NSLocalizedString(@"WINDOWS", "Windows");
|
||||||
|
group.image = 38;
|
||||||
|
[parentGroup addGroup:group];
|
||||||
|
|
||||||
|
group = [tree createGroup:parentGroup];
|
||||||
|
group.name = NSLocalizedString(@"NETWORK", "Network");
|
||||||
|
group.image = 3;
|
||||||
|
[parentGroup addGroup:group];
|
||||||
|
|
||||||
|
group = [tree createGroup:parentGroup];
|
||||||
|
group.name = NSLocalizedString(@"INTERNET", "Internet");
|
||||||
|
group.image = 1;
|
||||||
|
[parentGroup addGroup:group];
|
||||||
|
|
||||||
|
group = [tree createGroup:parentGroup];
|
||||||
|
group.name = NSLocalizedString(@"EMAIL", "EMail");
|
||||||
|
group.image = 19;
|
||||||
|
[parentGroup addGroup:group];
|
||||||
|
|
||||||
|
group = [tree createGroup:parentGroup];
|
||||||
|
group.name = NSLocalizedString(@"HOMEBANKING", "Homebanking");
|
||||||
|
group.image = 37;
|
||||||
|
[parentGroup addGroup:group];
|
||||||
|
|
||||||
|
return tree;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (Kdb4Tree *)demoTree {
|
||||||
|
NSDate *currentTime = [NSDate date];
|
||||||
|
|
||||||
|
Kdb4Tree *tree = [[Kdb4Tree alloc] init];
|
||||||
|
tree.generator = @"MacPass";
|
||||||
|
tree.databaseName = @"Icon Demonstation";
|
||||||
|
tree.databaseNameChanged = currentTime;
|
||||||
|
tree.databaseDescription = @"This database just has all default icons as groups in the tree";
|
||||||
|
tree.databaseDescriptionChanged = currentTime;
|
||||||
|
tree.defaultUserName = @"";
|
||||||
|
tree.defaultUserNameChanged = currentTime;
|
||||||
|
tree.maintenanceHistoryDays = 365;
|
||||||
|
tree.color = @"";
|
||||||
|
tree.masterKeyChanged = currentTime;
|
||||||
|
tree.masterKeyChangeRec = -1;
|
||||||
|
tree.masterKeyChangeForce = -1;
|
||||||
|
tree.protectTitle = NO;
|
||||||
|
tree.protectUserName = NO;
|
||||||
|
tree.protectPassword = YES;
|
||||||
|
tree.protectUrl = NO;
|
||||||
|
tree.protectNotes = NO;
|
||||||
|
tree.recycleBinEnabled = YES;
|
||||||
|
tree.recycleBinUuid = [UUID nullUuid];
|
||||||
|
tree.recycleBinChanged = currentTime;
|
||||||
|
tree.entryTemplatesGroup = [UUID nullUuid];
|
||||||
|
tree.entryTemplatesGroupChanged = currentTime;
|
||||||
|
tree.historyMaxItems = 10;
|
||||||
|
tree.historyMaxSize = 6 * 1024 * 1024; // 6 MB
|
||||||
|
tree.lastSelectedGroup = [UUID nullUuid];
|
||||||
|
tree.lastTopVisibleGroup = [UUID nullUuid];
|
||||||
|
|
||||||
KdbGroup *parentGroup = [tree createGroup:nil];
|
KdbGroup *parentGroup = [tree createGroup:nil];
|
||||||
parentGroup.name = @"General";
|
parentGroup.name = @"General";
|
||||||
parentGroup.image = 48;
|
parentGroup.image = 48;
|
||||||
tree.root = parentGroup;
|
tree.root = parentGroup;
|
||||||
|
|
||||||
|
for(NSUInteger iImageIndex = 0; iImageIndex < 69; iImageIndex++) {
|
||||||
KdbGroup *group = [tree createGroup:parentGroup];
|
KdbGroup *group = [tree createGroup:parentGroup];
|
||||||
group.name = @"Windows";
|
group.name = [NSString stringWithFormat:@"Group %ld", iImageIndex];
|
||||||
group.image = 38;
|
group.image = iImageIndex;
|
||||||
[parentGroup addGroup:group];
|
|
||||||
|
|
||||||
group = [tree createGroup:parentGroup];
|
|
||||||
group.name = @"Network";
|
|
||||||
group.image = 3;
|
|
||||||
[parentGroup addGroup:group];
|
|
||||||
|
|
||||||
group = [tree createGroup:parentGroup];
|
|
||||||
group.name = @"Internet";
|
|
||||||
group.image = 1;
|
|
||||||
[parentGroup addGroup:group];
|
|
||||||
|
|
||||||
group = [tree createGroup:parentGroup];
|
|
||||||
group.name = @"eMail";
|
|
||||||
group.image = 19;
|
|
||||||
[parentGroup addGroup:group];
|
|
||||||
|
|
||||||
group = [tree createGroup:parentGroup];
|
|
||||||
group.name = @"Homebanking";
|
|
||||||
group.image = 37;
|
|
||||||
[parentGroup addGroup:group];
|
[parentGroup addGroup:group];
|
||||||
|
}
|
||||||
|
|
||||||
return tree;
|
return tree;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,8 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#import "KdbEntry+MPAdditions.h"
|
#import "KdbEntry+MPAdditions.h"
|
||||||
|
#import "Kdb3Node.h"
|
||||||
|
#import "Kdb4Node.h"
|
||||||
|
|
||||||
#import "MPIconHelper.h"
|
#import "MPIconHelper.h"
|
||||||
|
|
||||||
|
|||||||
@@ -17,4 +17,5 @@
|
|||||||
return NSNotFound;
|
return NSNotFound;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -17,8 +17,6 @@ APPKIT_EXTERN NSString *const MPEntryNotesUndoableKey;
|
|||||||
|
|
||||||
@interface KdbEntry (Undo)
|
@interface KdbEntry (Undo)
|
||||||
|
|
||||||
+ (NSUndoManager *)undoManager;
|
|
||||||
|
|
||||||
- (NSString *)titleUndoable;
|
- (NSString *)titleUndoable;
|
||||||
- (NSString *)usernameUndoable;
|
- (NSString *)usernameUndoable;
|
||||||
- (NSString *)passwordUndoable;
|
- (NSString *)passwordUndoable;
|
||||||
@@ -31,4 +29,8 @@ APPKIT_EXTERN NSString *const MPEntryNotesUndoableKey;
|
|||||||
- (void)setUrlUndoable:(NSString *)url;
|
- (void)setUrlUndoable:(NSString *)url;
|
||||||
- (void)setNotesUndoable:(NSString *)notes;
|
- (void)setNotesUndoable:(NSString *)notes;
|
||||||
|
|
||||||
|
- (void)deleteUndoable;
|
||||||
|
- (void)moveToGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index;
|
||||||
|
- (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -7,6 +7,8 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#import "KdbEntry+Undo.h"
|
#import "KdbEntry+Undo.h"
|
||||||
|
#import "KdbGroup+Undo.h"
|
||||||
|
#import "KdbGroup+KVOAdditions.h"
|
||||||
#import "KdbGroup+MPTreeTools.h"
|
#import "KdbGroup+MPTreeTools.h"
|
||||||
|
|
||||||
NSString *const MPEntryTitleUndoableKey = @"titleUndoable";
|
NSString *const MPEntryTitleUndoableKey = @"titleUndoable";
|
||||||
@@ -15,9 +17,16 @@ NSString *const MPEntryPasswordUndoableKey = @"passwordUndoable";
|
|||||||
NSString *const MPEntryUrlUndoableKey = @"urlUndoable";
|
NSString *const MPEntryUrlUndoableKey = @"urlUndoable";
|
||||||
NSString *const MPEntryNotesUndoableKey = @"notesUndoable";
|
NSString *const MPEntryNotesUndoableKey = @"notesUndoable";
|
||||||
|
|
||||||
|
#ifndef MPSetActionName
|
||||||
|
#define MPSetActionName(key, comment) \
|
||||||
|
if(![[self undoManager] isUndoing]) {\
|
||||||
|
[[self undoManager] setActionName:[[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]];\
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
@implementation KdbEntry (Undo)
|
@implementation KdbEntry (Undo)
|
||||||
|
|
||||||
+ (NSUndoManager *)undoManager {
|
- (NSUndoManager *)undoManager {
|
||||||
return [[[NSDocumentController sharedDocumentController] currentDocument] undoManager];
|
return [[[NSDocumentController sharedDocumentController] currentDocument] undoManager];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,40 +50,110 @@ NSString *const MPEntryNotesUndoableKey = @"notesUndoable";
|
|||||||
return [self notes];
|
return [self notes];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (void)setTitleUndoable:(NSString *)title {
|
- (void)setTitleUndoable:(NSString *)title {
|
||||||
[[KdbEntry undoManager] registerUndoWithTarget:self selector:@selector(setTitleUndoable:) object:self.title];
|
[[self undoManager] registerUndoWithTarget:self selector:@selector(setTitleUndoable:) object:self.title];
|
||||||
[[KdbEntry undoManager] setActionName:NSLocalizedString(@"UNDO_SET_TITLE", "Undo set title")];
|
|
||||||
|
if(![[self undoManager] isUndoing]) {
|
||||||
|
[[self undoManager] setActionName:NSLocalizedString(@"SET_TITLE", "Set Title")];
|
||||||
|
}
|
||||||
|
|
||||||
[self setLastModificationTime:[NSDate date]];
|
[self setLastModificationTime:[NSDate date]];
|
||||||
[self setTitle:title];
|
[self setTitle:title];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setUsernameUndoable:(NSString *)username {
|
- (void)setUsernameUndoable:(NSString *)username {
|
||||||
[[KdbEntry undoManager] registerUndoWithTarget:self selector:@selector(setUsernameUndoable:) object:self.username];
|
[[self undoManager] registerUndoWithTarget:self selector:@selector(setUsernameUndoable:) object:self.username];
|
||||||
[[KdbEntry undoManager] setActionName:NSLocalizedString(@"UNDO_SET_USERNAME", "Undo set username")];
|
|
||||||
|
if(![[self undoManager] isUndoing]) {
|
||||||
|
[[self undoManager] setActionName:NSLocalizedString(@"SET_USERNAME", "Undo set username")];
|
||||||
|
}
|
||||||
|
|
||||||
[self setLastModificationTime:[NSDate date]];
|
[self setLastModificationTime:[NSDate date]];
|
||||||
[self setUsername:username];
|
[self setUsername:username];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setPasswordUndoable:(NSString *)password {
|
- (void)setPasswordUndoable:(NSString *)password {
|
||||||
[[KdbEntry undoManager] registerUndoWithTarget:self selector:@selector(setPasswordUndoable:) object:self.password];
|
[[self undoManager] registerUndoWithTarget:self selector:@selector(setPasswordUndoable:) object:self.password];
|
||||||
[[KdbEntry undoManager] setActionName:NSLocalizedString(@"UNDO_SET_PASSWORT", "Undo set password")];
|
MPSetActionName(@"SET_PASSWORT", "Undo set password");
|
||||||
|
|
||||||
|
if(![[self undoManager] isUndoing]) {
|
||||||
|
[[self undoManager] setActionName:NSLocalizedString(@"SET_TITLE", "Set Title")];
|
||||||
|
}
|
||||||
|
|
||||||
[self setLastModificationTime:[NSDate date]];
|
[self setLastModificationTime:[NSDate date]];
|
||||||
[self setPassword:password];
|
[self setPassword:password];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setUrlUndoable:(NSString *)url {
|
- (void)setUrlUndoable:(NSString *)url {
|
||||||
[[KdbEntry undoManager] registerUndoWithTarget:self selector:@selector(setUrlUndoable:) object:self.url];
|
[[self undoManager] registerUndoWithTarget:self selector:@selector(setUrlUndoable:) object:self.url];
|
||||||
[[KdbEntry undoManager] setActionName:NSLocalizedString(@"UNDO_SET_URL", "Undo set URL")];
|
MPSetActionName(@"SET_URL", "Undo set URL");
|
||||||
|
|
||||||
|
if(![[self undoManager] isUndoing]) {
|
||||||
|
[[self undoManager] setActionName:NSLocalizedString(@"SET_TITLE", "Set Title")];
|
||||||
|
}
|
||||||
|
|
||||||
[self setLastModificationTime:[NSDate date]];
|
[self setLastModificationTime:[NSDate date]];
|
||||||
[self setUrl:url];
|
[self setUrl:url];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setNotesUndoable:(NSString *)notes {
|
- (void)setNotesUndoable:(NSString *)notes {
|
||||||
[[KdbEntry undoManager] registerUndoWithTarget:self selector:@selector(setNotesUndoable:) object:self.notes];
|
[[self undoManager] registerUndoWithTarget:self selector:@selector(setNotesUndoable:) object:self.notes];
|
||||||
[[KdbEntry undoManager] setActionName:NSLocalizedString(@"UNDO_SET_NOTES", "Undo set notes")];
|
MPSetActionName(@"SET_NOTES", "Set Notes");
|
||||||
|
|
||||||
|
if(![[self undoManager] isUndoing]) {
|
||||||
|
[[self undoManager] setActionName:NSLocalizedString(@"SET_TITLE", "Set Title")];
|
||||||
|
}
|
||||||
|
|
||||||
[self setLastModificationTime:[NSDate date]];
|
[self setLastModificationTime:[NSDate date]];
|
||||||
[self setNotes:notes];
|
[self setNotes:notes];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)deleteUndoable {
|
||||||
|
if(!self.parent) {
|
||||||
|
return; // No parent to be removed from
|
||||||
|
}
|
||||||
|
NSUInteger oldIndex = [self.parent.entries indexOfObject:self];
|
||||||
|
if(oldIndex == NSNotFound) {
|
||||||
|
return; // We're not in our parents entries list
|
||||||
|
}
|
||||||
|
[[[self undoManager] prepareWithInvocationTarget:self.parent] addEntryUndoable:self atIndex:oldIndex];
|
||||||
|
|
||||||
|
if(![[self undoManager] isUndoing]) {
|
||||||
|
[[self undoManager] setActionName:NSLocalizedString(@"DELETE_ENTRY", "Set Title")];
|
||||||
|
}
|
||||||
|
|
||||||
|
//[[NSNotificationCenter defaultCenter] postNotificationName:@"" object:self userInfo:nil];
|
||||||
|
[self.parent removeObjectFromEntriesAtIndex:oldIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)moveToGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index {
|
||||||
|
[self _moveToGroup:group atIndex:index actionName:NSLocalizedString(@"MOVE_ENTRY", "Move Group")];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index {
|
||||||
|
[self _moveToGroup:trash atIndex:index actionName:NSLocalizedString(@"TRASH_ENTRY", "Move Entry to Trash")];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)_moveToGroup:(KdbGroup *)group atIndex:(NSUInteger)index actionName:(NSString *)name {
|
||||||
|
if(!group || !self.parent) {
|
||||||
|
return; // Nothing to be moved about
|
||||||
|
}
|
||||||
|
NSUInteger oldIndex = [self.parent.entries indexOfObject:self];
|
||||||
|
if(oldIndex == NSNotFound) {
|
||||||
|
return; // Not found in entries of parent!
|
||||||
|
}
|
||||||
|
[[[self undoManager] prepareWithInvocationTarget:self] _moveToGroup:self.parent atIndex:oldIndex actionName:name];
|
||||||
|
|
||||||
|
if(![[self undoManager] isUndoing]) {
|
||||||
|
[[self undoManager] setActionName:name];
|
||||||
|
}
|
||||||
|
|
||||||
|
[self.parent removeObjectFromEntriesAtIndex:oldIndex];
|
||||||
|
// Old indices might be wrong, correct them if necessary
|
||||||
|
index = MIN(index, [group.entries count]);
|
||||||
|
[group insertObject:self inEntriesAtIndex:index];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
@@ -20,4 +20,6 @@
|
|||||||
/* Returns the group with the UUID */
|
/* Returns the group with the UUID */
|
||||||
- (KdbGroup *)groupForUUID:(UUID *)uuid;
|
- (KdbGroup *)groupForUUID:(UUID *)uuid;
|
||||||
|
|
||||||
|
- (BOOL)isAnchestorOfGroup:(KdbGroup *)group;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
@@ -49,4 +49,18 @@
|
|||||||
return [filteredGroups lastObject];
|
return [filteredGroups lastObject];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (BOOL)isAnchestorOfGroup:(KdbGroup *)group {
|
||||||
|
if(group == nil) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
KdbGroup *ancestor = self.parent;
|
||||||
|
while(ancestor.parent) {
|
||||||
|
if(group == self) {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
ancestor = ancestor.parent;
|
||||||
|
}
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
@@ -17,4 +17,10 @@ APPKIT_EXTERN NSString *const MPGroupNameUndoableKey;
|
|||||||
- (NSString *)nameUndoable;
|
- (NSString *)nameUndoable;
|
||||||
- (void)setNameUndoable:(NSString *)newName;
|
- (void)setNameUndoable:(NSString *)newName;
|
||||||
|
|
||||||
|
- (void)deleteUndoable;
|
||||||
|
- (void)addGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index;
|
||||||
|
- (void)addEntryUndoable:(KdbEntry *)entry atIndex:(NSUInteger)index;
|
||||||
|
- (void)moveToGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index;
|
||||||
|
- (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#import "KdbGroup+Undo.h"
|
#import "KdbGroup+Undo.h"
|
||||||
#import "KdbGroup+KVOAdditions.h"
|
#import "KdbGroup+KVOAdditions.h"
|
||||||
|
#import "KdbEntry+Undo.h"
|
||||||
|
|
||||||
NSString *const MPGroupNameUndoableKey = @"nameUndoable";
|
NSString *const MPGroupNameUndoableKey = @"nameUndoable";
|
||||||
|
|
||||||
@@ -23,8 +24,85 @@ NSString *const MPGroupNameUndoableKey = @"nameUndoable";
|
|||||||
|
|
||||||
- (void)setNameUndoable:(NSString *)newName {
|
- (void)setNameUndoable:(NSString *)newName {
|
||||||
[[self undoManager] registerUndoWithTarget:self selector:@selector(setNameUndoable:) object:self.name];
|
[[self undoManager] registerUndoWithTarget:self selector:@selector(setNameUndoable:) object:self.name];
|
||||||
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_SET_NAME", "Undo set name")];
|
|
||||||
|
if(![[self undoManager] isUndoing]) {
|
||||||
|
[[self undoManager] setActionName:NSLocalizedString(@"SET_NAME", "Set Name")];
|
||||||
|
}
|
||||||
|
|
||||||
self.name = newName;
|
self.name = newName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)deleteUndoable {
|
||||||
|
if(!self.parent) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
NSUInteger oldIndex = [self.parent.groups indexOfObject:self];
|
||||||
|
if(oldIndex == NSNotFound) {
|
||||||
|
return; // Inconsistent data
|
||||||
|
}
|
||||||
|
[[[self undoManager] prepareWithInvocationTarget:self.parent] addGroupUndoable:self atIndex:oldIndex];
|
||||||
|
|
||||||
|
if(![[self undoManager] isUndoing]) {
|
||||||
|
[[self undoManager] setActionName:NSLocalizedString(@"DELETE_GROUP", "Delete Group")];
|
||||||
|
}
|
||||||
|
|
||||||
|
[self.parent removeObjectFromGroupsAtIndex:oldIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)addGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index {
|
||||||
|
if(!group) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[[self undoManager] prepareWithInvocationTarget:group] deleteUndoable];
|
||||||
|
|
||||||
|
if(![[self undoManager] isUndoing]) {
|
||||||
|
[[self undoManager] setActionName:NSLocalizedString(@"ADD_GROUP", "Add Group")];
|
||||||
|
}
|
||||||
|
|
||||||
|
index = MIN(index, [group.groups count]);
|
||||||
|
[self insertObject:group inGroupsAtIndex:index];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)addEntryUndoable:(KdbEntry *)entry atIndex:(NSUInteger)index {
|
||||||
|
if(!entry) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
index = MIN(index, [self.entries count]);
|
||||||
|
[[[self undoManager] prepareWithInvocationTarget:entry] deleteUndoable];
|
||||||
|
|
||||||
|
if(![[self undoManager] isUndoing]) {
|
||||||
|
[[self undoManager] setActionName:NSLocalizedString(@"ADD_ENTRY", "Add Entry")];
|
||||||
|
}
|
||||||
|
|
||||||
|
[self insertObject:entry inEntriesAtIndex:index];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)moveToGroupUndoable:(KdbGroup *)group atIndex:(NSUInteger)index {
|
||||||
|
[self _moveToGroup:group atIndex:index actionName:NSLocalizedString(@"MOVE_GROUP", "Move Group" )];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)moveToTrashUndoable:(KdbGroup *)trash atIndex:(NSUInteger)index {
|
||||||
|
[self _moveToGroup:trash atIndex:index actionName:NSLocalizedString(@"TRASH_GROUP", "Move Group to Trash")];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)_moveToGroup:(KdbGroup *)group atIndex:(NSUInteger)index actionName:(NSString *)actionName {
|
||||||
|
if(!self.parent || !group) {
|
||||||
|
return; // No target or origin
|
||||||
|
}
|
||||||
|
NSUInteger oldIndex = [self.parent.groups indexOfObject:self];
|
||||||
|
if(oldIndex == NSNotFound) {
|
||||||
|
return; // We aren't in our parents groups list.
|
||||||
|
}
|
||||||
|
[[[self undoManager] prepareWithInvocationTarget:self] moveToGroupUndoable:self.parent atIndex:oldIndex];
|
||||||
|
|
||||||
|
if(![[self undoManager] isUndoing]) {
|
||||||
|
[[self undoManager] setActionName:actionName];
|
||||||
|
}
|
||||||
|
|
||||||
|
[self.parent removeObjectFromGroupsAtIndex:oldIndex];
|
||||||
|
index = MIN(index, [group.groups count]);
|
||||||
|
[group insertObject:self inGroupsAtIndex:index];
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -8,6 +8,9 @@
|
|||||||
|
|
||||||
#import "Kdb.h"
|
#import "Kdb.h"
|
||||||
|
|
||||||
|
@class BinaryRef;
|
||||||
|
@class Binary;
|
||||||
|
|
||||||
@interface KdbTree (MPAdditions)
|
@interface KdbTree (MPAdditions)
|
||||||
|
|
||||||
- (NSArray *)allEntries;
|
- (NSArray *)allEntries;
|
||||||
|
|||||||
@@ -9,6 +9,10 @@
|
|||||||
#import "KdbTree+MPAdditions.h"
|
#import "KdbTree+MPAdditions.h"
|
||||||
#import "KdbGroup+MPTreeTools.h"
|
#import "KdbGroup+MPTreeTools.h"
|
||||||
|
|
||||||
|
#import "NSMutableData+Base64.h"
|
||||||
|
#import "Kdb3Node.h"
|
||||||
|
#import "Kdb4Node.h"
|
||||||
|
|
||||||
@implementation KdbTree (MPAdditions)
|
@implementation KdbTree (MPAdditions)
|
||||||
|
|
||||||
- (NSArray *)allGroups {
|
- (NSArray *)allGroups {
|
||||||
|
|||||||
@@ -9,9 +9,9 @@
|
|||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
typedef NS_ENUM(NSUInteger, MPActionType) {
|
typedef NS_ENUM(NSUInteger, MPActionType) {
|
||||||
|
MPUnkownAction, // Netural element to be used for returns
|
||||||
MPActionAddEntry, // Add an new entry
|
MPActionAddEntry, // Add an new entry
|
||||||
MPActionAddGroup, // Add a new group
|
MPActionAddGroup, // Add a new group
|
||||||
MPActionEdit, // Edit entry or group
|
|
||||||
MPActionDelete, // Delete entry or group
|
MPActionDelete, // Delete entry or group
|
||||||
MPActionCopyUsername, // copy username to pasteboard
|
MPActionCopyUsername, // copy username to pasteboard
|
||||||
MPActionCopyPassword, // copy password to pasteboard
|
MPActionCopyPassword, // copy password to pasteboard
|
||||||
@@ -25,5 +25,6 @@ typedef NS_ENUM(NSUInteger, MPActionType) {
|
|||||||
@interface MPActionHelper : NSObject
|
@interface MPActionHelper : NSObject
|
||||||
|
|
||||||
+ (SEL)actionOfType:(MPActionType)type;
|
+ (SEL)actionOfType:(MPActionType)type;
|
||||||
|
+ (MPActionType)typeForAction:(SEL)action;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
@implementation MPActionHelper
|
@implementation MPActionHelper
|
||||||
|
|
||||||
+ (SEL)actionOfType:(MPActionType)type {
|
+ (NSDictionary *)_actionDictionary {
|
||||||
static NSDictionary *actionDict;
|
static NSDictionary *actionDict;
|
||||||
static dispatch_once_t onceToken;
|
static dispatch_once_t onceToken;
|
||||||
dispatch_once(&onceToken, ^{
|
dispatch_once(&onceToken, ^{
|
||||||
@@ -21,14 +21,31 @@
|
|||||||
@(MPActionCopyURL) : @"copyURL:",
|
@(MPActionCopyURL) : @"copyURL:",
|
||||||
@(MPActionCopyUsername) : @"copyUsername:",
|
@(MPActionCopyUsername) : @"copyUsername:",
|
||||||
@(MPActionDelete) : @"deleteNode:",
|
@(MPActionDelete) : @"deleteNode:",
|
||||||
@(MPActionEdit) : @"editEntry:",
|
|
||||||
@(MPActionOpenURL) : @"openURL:",
|
@(MPActionOpenURL) : @"openURL:",
|
||||||
@(MPActionToggleInspector) : @"toggleInspector:",
|
@(MPActionToggleInspector) : @"toggleInspector:",
|
||||||
@(MPActionLock) : @"lock:",
|
@(MPActionLock) : @"lock:",
|
||||||
@(MPActionEmptyTrash) : @"emptyTrash:"
|
@(MPActionEmptyTrash) : @"emptyTrash:"
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
return actionDict;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (SEL)actionOfType:(MPActionType)type {
|
||||||
|
NSDictionary *actionDict = [self _actionDictionary];
|
||||||
return NSSelectorFromString(actionDict[@(type)]);
|
return NSSelectorFromString(actionDict[@(type)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (MPActionType)typeForAction:(SEL)action {
|
||||||
|
NSString *selectorString = NSStringFromSelector(action);
|
||||||
|
NSArray *selectors = [[self _actionDictionary] allValues];
|
||||||
|
NSUInteger index = [selectors indexOfObject:selectorString];
|
||||||
|
if(index == NSNotFound) {
|
||||||
|
return MPUnkownAction;
|
||||||
|
}
|
||||||
|
NSArray *keys = [[self _actionDictionary] allKeysForObject:selectorString];
|
||||||
|
NSAssert([keys count] == 1, @"There should only be one object for the specified key");
|
||||||
|
return [[keys lastObject] integerValue];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -38,16 +38,31 @@
|
|||||||
[MPStringLengthValueTransformer registerTransformer];
|
[MPStringLengthValueTransformer registerTransformer];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)dealloc {
|
||||||
|
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||||
|
}
|
||||||
|
|
||||||
- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender {
|
- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender {
|
||||||
return [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyOpenEmptyDatabaseOnLaunch];
|
return [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyOpenEmptyDatabaseOnLaunch];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (void)applicationWillFinishLaunching:(NSNotification *)notification {
|
||||||
|
BOOL reopen = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyReopenLastDatabaseOnLaunch];
|
||||||
|
if(reopen) {
|
||||||
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
||||||
|
selector:@selector(_applicationDidFinishRestoringWindows:)
|
||||||
|
name:NSApplicationDidFinishRestoringWindowsNotification
|
||||||
|
object:nil];
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void)applicationDidFinishLaunching:(NSNotification *)notification {
|
- (void)applicationDidFinishLaunching:(NSNotification *)notification {
|
||||||
serverDaemon = [[MPServerDaemon alloc] init];
|
serverDaemon = [[MPServerDaemon alloc] init];
|
||||||
lockDaemon = [[MPLockDaemon alloc] init];
|
lockDaemon = [[MPLockDaemon alloc] init];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (NSString *)applicationName {
|
- (NSString *)applicationName {
|
||||||
return [[NSBundle mainBundle] infoDictionary][@"CFBundleName"];
|
return [[NSBundle mainBundle] infoDictionary][@"CFBundleName"];
|
||||||
}
|
}
|
||||||
@@ -93,4 +108,26 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)_applicationDidFinishRestoringWindows:(NSNotification *)notification {
|
||||||
|
NSDocumentController *documentController = [NSDocumentController sharedDocumentController];
|
||||||
|
NSArray *documents = [documentController documents];
|
||||||
|
NSArray *recentDocuments = [documentController recentDocumentURLs];
|
||||||
|
if([documents count] > 0 ) {
|
||||||
|
return; // There's already a document restored
|
||||||
|
}
|
||||||
|
NSURL *documentUrl;
|
||||||
|
if([recentDocuments count] > 0) {
|
||||||
|
documentUrl = recentDocuments[0];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
NSString *lastPath = [[NSUserDefaults standardUserDefaults] stringForKey:kMPSettingsKeyLastDatabasePath];
|
||||||
|
documentUrl = [NSURL URLWithString:lastPath];
|
||||||
|
}
|
||||||
|
if([documentUrl isFileURL]) {
|
||||||
|
[documentController openDocumentWithContentsOfURL:documentUrl display:YES
|
||||||
|
completionHandler:^(NSDocument *document, BOOL documentWasAlreadyOpen, NSError *error) {}];
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
17
MacPass/MPAttachmentTableViewDelegate.h
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
//
|
||||||
|
// MPAttachmentTableViewDelegate.h
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Michael Starke on 17.07.13.
|
||||||
|
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
@class MPInspectorViewController;
|
||||||
|
|
||||||
|
@interface MPAttachmentTableViewDelegate : NSObject <NSTableViewDelegate>
|
||||||
|
|
||||||
|
@property (nonatomic, weak) MPInspectorViewController *viewController;
|
||||||
|
|
||||||
|
@end
|
||||||
75
MacPass/MPAttachmentTableViewDelegate.m
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
//
|
||||||
|
// MPAttachmentTableViewDelegate.m
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Michael Starke on 17.07.13.
|
||||||
|
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "MPAttachmentTableViewDelegate.h"
|
||||||
|
|
||||||
|
#import "MPInspectorViewController.h"
|
||||||
|
#import "MPSelectedAttachmentTableCellView.h"
|
||||||
|
|
||||||
|
#import "Kdb4Node.h"
|
||||||
|
#import "Kdb3Node.h"
|
||||||
|
|
||||||
|
#import "HNHTableRowView.h"
|
||||||
|
|
||||||
|
@implementation MPAttachmentTableViewDelegate
|
||||||
|
|
||||||
|
- (void)tableViewSelectionDidChange:(NSNotification *)notification {
|
||||||
|
NSTableView *tableView = [notification object];
|
||||||
|
NSIndexSet *allColumns = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [[tableView tableColumns] count])];
|
||||||
|
if([self.viewController.selectedEntry isKindOfClass:[Kdb4Entry class]]) {
|
||||||
|
Kdb4Entry *entryv4 = (Kdb4Entry *)self.viewController.selectedEntry;
|
||||||
|
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [entryv4.binaries count] )];
|
||||||
|
[tableView reloadDataForRowIndexes:indexSet columnIndexes:allColumns];
|
||||||
|
}
|
||||||
|
if([self.viewController.selectedEntry isKindOfClass:[Kdb3Entry class]]) {
|
||||||
|
Kdb3Entry *entryv3 = (Kdb3Entry *)self.viewController.selectedEntry;
|
||||||
|
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, (entryv3.binary ? 1 : 0 ))];
|
||||||
|
[tableView reloadDataForRowIndexes:indexSet columnIndexes:allColumns];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
|
||||||
|
/* Decide what view to use */
|
||||||
|
NSIndexSet *selectedIndexes = [tableView selectedRowIndexes];
|
||||||
|
NSTableCellView *view;
|
||||||
|
if([selectedIndexes containsIndex:row]) {
|
||||||
|
MPSelectedAttachmentTableCellView *cellView = [tableView makeViewWithIdentifier:@"SelectedCell" owner:tableView];
|
||||||
|
[cellView.saveButton setTag:row];
|
||||||
|
[cellView.saveButton setAction:@selector(saveAttachment:)];
|
||||||
|
[cellView.saveButton setTarget:self.viewController];
|
||||||
|
[cellView.removeButton setTag:row];
|
||||||
|
[cellView.removeButton setAction:@selector(removeAttachment:)];
|
||||||
|
[cellView.removeButton setTarget:self.viewController];
|
||||||
|
view = cellView;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
view = [tableView makeViewWithIdentifier:@"NormalCell" owner:tableView];
|
||||||
|
}
|
||||||
|
/* Bind view */
|
||||||
|
if([self.viewController.selectedEntry isKindOfClass:[Kdb4Entry class]]) {
|
||||||
|
Kdb4Entry *entry = (Kdb4Entry *)self.viewController.selectedEntry;
|
||||||
|
BinaryRef *binaryRef = entry.binaries[row];
|
||||||
|
[[view textField] bind:NSValueBinding toObject:binaryRef withKeyPath:@"key" options:nil];
|
||||||
|
[[view imageView] setImage:[[NSWorkspace sharedWorkspace] iconForFileType:[binaryRef.key pathExtension]]];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Kdb3Entry *entry= (Kdb3Entry *)self.viewController.selectedEntry;
|
||||||
|
[[view textField] bind:NSValueBinding toObject:entry withKeyPath:@"binaryDesc" options:nil];
|
||||||
|
[[view imageView] setImage:[[NSWorkspace sharedWorkspace] iconForFileType:[entry.binaryDesc pathExtension]]];
|
||||||
|
}
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row {
|
||||||
|
HNHTableRowView *view = nil;
|
||||||
|
view = [[HNHTableRowView alloc] init];
|
||||||
|
view.selectionCornerRadius = 7;
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -10,8 +10,8 @@
|
|||||||
|
|
||||||
@interface MPCustomFieldTableCellView : NSTableCellView
|
@interface MPCustomFieldTableCellView : NSTableCellView
|
||||||
|
|
||||||
@property (weak) IBOutlet NSTextField *labelTextField;
|
@property (nonatomic, weak) IBOutlet NSTextField *labelTextField;
|
||||||
@property (weak) IBOutlet NSTextField *valueTextField;
|
@property (nonatomic, weak) IBOutlet NSTextField *valueTextField;
|
||||||
@property (weak) IBOutlet NSButton *removeButton;
|
@property (nonatomic, weak) IBOutlet NSButton *removeButton;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
17
MacPass/MPCustomFieldTableViewDelegate.h
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
//
|
||||||
|
// MPCustomFieldTableDelegate.h
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Michael Starke on 17.07.13.
|
||||||
|
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
@class MPInspectorViewController;
|
||||||
|
|
||||||
|
@interface MPCustomFieldTableViewDelegate : NSObject <NSTableViewDelegate>
|
||||||
|
|
||||||
|
@property (nonatomic, weak) MPInspectorViewController *viewController;
|
||||||
|
|
||||||
|
@end
|
||||||
42
MacPass/MPCustomFieldTableViewDelegate.m
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
//
|
||||||
|
// MPCustomFieldTableDelegate.m
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Michael Starke on 17.07.13.
|
||||||
|
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "MPCustomFieldTableViewDelegate.h"
|
||||||
|
#import "MPInspectorViewController.h"
|
||||||
|
#import "MPCustomFieldTableCellView.h"
|
||||||
|
|
||||||
|
#import "Kdb4Node.h"
|
||||||
|
#import "StringField+Undo.h"
|
||||||
|
|
||||||
|
@implementation MPCustomFieldTableViewDelegate
|
||||||
|
|
||||||
|
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
|
||||||
|
if(![self.viewController.selectedEntry isKindOfClass:[Kdb4Entry class]]) {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
Kdb4Entry *entry = (Kdb4Entry *)self.viewController.selectedEntry;
|
||||||
|
MPCustomFieldTableCellView *view = [tableView makeViewWithIdentifier:@"SelectedCell" owner:tableView];
|
||||||
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_customFieldFrameChanged:) name:NSViewFrameDidChangeNotification object:view];
|
||||||
|
if([self.viewController.selectedEntry isKindOfClass:[Kdb4Entry class]]) {
|
||||||
|
StringField *stringField = entry.stringFields[row];
|
||||||
|
NSDictionary *validateOptions = @{ NSValidatesImmediatelyBindingOption: @YES };
|
||||||
|
[view.labelTextField bind:NSValueBinding toObject:stringField withKeyPath:MPStringFieldKeyUndoableKey options:validateOptions];
|
||||||
|
[view.valueTextField bind:NSValueBinding toObject:stringField withKeyPath:MPStringFieldValueUndoableKey options:nil];
|
||||||
|
[view.removeButton setTarget:self.viewController];
|
||||||
|
[view.removeButton setAction:@selector(removeCustomField:)];
|
||||||
|
[view.removeButton setTag:row];
|
||||||
|
}
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)_customFieldFrameChanged:(NSNotification *)notification {
|
||||||
|
// NSView *sender = [notification object];
|
||||||
|
// NSLog(@"didChangeFrameFor: %@ to: %@", sender, NSStringFromRect([sender frame]));
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -8,20 +8,38 @@
|
|||||||
|
|
||||||
#import <Cocoa/Cocoa.h>
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
|
typedef NS_ENUM(NSUInteger, MPDatabaseSettingsTab) {
|
||||||
|
MPDatabaseSettingsTabGeneral,
|
||||||
|
MPDatabaseSettingsTabPassword,
|
||||||
|
MPDatabaseSettingsTabDisplay,
|
||||||
|
MPDatabaseSettingsTabAdvanced,
|
||||||
|
MPDatabaseSettingsTemplatesTab,
|
||||||
|
};
|
||||||
|
|
||||||
@class MPDocument;
|
@class MPDocument;
|
||||||
|
@class HNHRoundendTextField;
|
||||||
|
@class HNHRoundedSecureTextField;
|
||||||
|
|
||||||
@interface MPDocumentSettingsWindowController : NSWindowController
|
@interface MPDatabaseSettingsWindowController : NSWindowController <NSTextFieldDelegate, NSTabViewDelegate>
|
||||||
|
|
||||||
|
|
||||||
@property (weak) IBOutlet NSTabView *sectionTabView;
|
@property (weak) IBOutlet NSTabView *sectionTabView;
|
||||||
|
@property (weak) IBOutlet NSButton *saveButton;
|
||||||
|
@property (weak) IBOutlet NSButton *cancelButton;
|
||||||
|
|
||||||
/* General Tab */
|
/* General Tab */
|
||||||
@property (weak) IBOutlet NSTextField *databaseNameTextField;
|
@property (weak) IBOutlet NSTextField *databaseNameTextField;
|
||||||
@property (unsafe_unretained) IBOutlet NSTextView *databaseDescriptionTextView;
|
@property (unsafe_unretained) IBOutlet NSTextView *databaseDescriptionTextView;
|
||||||
|
|
||||||
/* Protection */
|
/* Protection */
|
||||||
@property (weak) IBOutlet NSTextField *passwordTextField;
|
@property (weak) IBOutlet HNHRoundedSecureTextField *passwordTextField;
|
||||||
|
@property (weak) IBOutlet HNHRoundedSecureTextField *passwordRepeatTextField;
|
||||||
@property (weak) IBOutlet NSPathControl *keyfilePathControl;
|
@property (weak) IBOutlet NSPathControl *keyfilePathControl;
|
||||||
|
@property (weak) IBOutlet NSButton *togglePasswordButton;
|
||||||
|
@property (weak) IBOutlet NSTextField *errorTextField;
|
||||||
|
|
||||||
|
|
||||||
|
- (IBAction)clearKey:(id)sender;
|
||||||
|
- (IBAction)generateKey:(id)sender;
|
||||||
|
|
||||||
/* Display Tab */
|
/* Display Tab */
|
||||||
@property (weak) IBOutlet NSButton *protectTitleCheckButton;
|
@property (weak) IBOutlet NSButton *protectTitleCheckButton;
|
||||||
@@ -30,13 +48,21 @@
|
|||||||
@property (weak) IBOutlet NSButton *protectURLCheckButton;
|
@property (weak) IBOutlet NSButton *protectURLCheckButton;
|
||||||
@property (weak) IBOutlet NSButton *protectNotesCheckButton;
|
@property (weak) IBOutlet NSButton *protectNotesCheckButton;
|
||||||
|
|
||||||
|
|
||||||
/* Advanced Tab*/
|
/* Advanced Tab*/
|
||||||
@property (weak) IBOutlet NSButton *enableRecycleBinCheckButton;
|
@property (weak) IBOutlet NSButton *enableRecycleBinCheckButton;
|
||||||
@property (weak) IBOutlet NSButton *emptyRecycleBinOnQuitCheckButton;
|
@property (weak) IBOutlet NSButton *emptyRecycleBinOnQuitCheckButton;
|
||||||
@property (weak) IBOutlet NSPopUpButton *selectRecycleBinGroupPopUpButton;
|
@property (weak) IBOutlet NSPopUpButton *selectRecycleBinGroupPopUpButton;
|
||||||
|
|
||||||
|
|
||||||
|
/* Templates Tab */
|
||||||
|
@property (weak) IBOutlet HNHRoundendTextField *defaultUsernameTextField;
|
||||||
|
@property (weak) IBOutlet NSPopUpButton *templateGroupPopUpButton;
|
||||||
|
|
||||||
|
|
||||||
- (id)initWithDocument:(MPDocument *)document;
|
- (id)initWithDocument:(MPDocument *)document;
|
||||||
|
|
||||||
|
- (void)showSettingsTab:(MPDatabaseSettingsTab)tab;
|
||||||
|
|
||||||
- (void)update;
|
- (void)update;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
351
MacPass/MPDatabaseSettingsWindowController.m
Normal file
@@ -0,0 +1,351 @@
|
|||||||
|
//
|
||||||
|
// MPDocumentSettingsWindowController.m
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Michael Starke on 26.06.13.
|
||||||
|
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "MPDatabaseSettingsWindowController.h"
|
||||||
|
#import "MPDocument.h"
|
||||||
|
#import "MPDocumentWindowController.h"
|
||||||
|
#import "MPDatabaseVersion.h"
|
||||||
|
#import "MPIconHelper.h"
|
||||||
|
#import "MPSettingsHelper.h"
|
||||||
|
|
||||||
|
#import "HNHRoundedTextField.h"
|
||||||
|
#import "HNHRoundedSecureTextField.h"
|
||||||
|
|
||||||
|
#import "NSString+Empty.h"
|
||||||
|
|
||||||
|
#import "Kdb.h"
|
||||||
|
#import "Kdb4Node.h"
|
||||||
|
#import "KdbGroup+MPAdditions.h"
|
||||||
|
|
||||||
|
@interface MPDatabaseSettingsWindowController () {
|
||||||
|
MPDocument *_document;
|
||||||
|
NSString *_missingFeature;
|
||||||
|
}
|
||||||
|
|
||||||
|
@property (nonatomic,assign) BOOL trashEnabled;
|
||||||
|
@property (nonatomic,assign) BOOL showPassword;
|
||||||
|
@property (nonatomic,assign) BOOL hasValidPasswordOrKey;
|
||||||
|
@property (nonatomic,weak) NSURL *keyURL;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation MPDatabaseSettingsWindowController
|
||||||
|
|
||||||
|
- (id)init {
|
||||||
|
return [self initWithDocument:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)initWithDocument:(MPDocument *)document {
|
||||||
|
self = [super initWithWindowNibName:@"DatabaseSettingsWindow"];
|
||||||
|
if(self) {
|
||||||
|
_document = document;
|
||||||
|
_showPassword = NO;
|
||||||
|
_hasValidPasswordOrKey = NO;
|
||||||
|
_missingFeature = NSLocalizedString(@"KDBX_ONLX_FEATURE", "Feature only available in kdbx databases");
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)windowDidLoad {
|
||||||
|
[super windowDidLoad];
|
||||||
|
|
||||||
|
NSAssert(_document != nil, @"Document needs to be present");
|
||||||
|
|
||||||
|
[self.saveButton bind:NSEnabledBinding toObject:self withKeyPath:@"hasValidPasswordOrKey" options:nil];
|
||||||
|
[self.cancelButton bind:NSEnabledBinding toObject:self withKeyPath:@"hasValidPasswordOrKey" options:nil];
|
||||||
|
|
||||||
|
[self.sectionTabView setDelegate:self];
|
||||||
|
|
||||||
|
|
||||||
|
[self update];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)save:(id)sender {
|
||||||
|
|
||||||
|
/* Protection */
|
||||||
|
_document.password = [self.passwordTextField stringValue];
|
||||||
|
_document.key = [self.keyfilePathControl URL];
|
||||||
|
|
||||||
|
/* General */
|
||||||
|
_document.treeV4.databaseDescription = [self.databaseDescriptionTextView string];
|
||||||
|
_document.treeV4.databaseName = [self.databaseNameTextField stringValue];
|
||||||
|
|
||||||
|
/* Display */
|
||||||
|
|
||||||
|
/* Advanced */
|
||||||
|
_document.treeV4.recycleBinEnabled = self.trashEnabled;
|
||||||
|
NSMenuItem *trashMenuItem = [self.selectRecycleBinGroupPopUpButton selectedItem];
|
||||||
|
KdbGroup *trashGroup = [trashMenuItem representedObject];
|
||||||
|
[_document useGroupAsTrash:trashGroup];
|
||||||
|
|
||||||
|
NSMenuItem *templateMenuItem = [self.templateGroupPopUpButton selectedItem];
|
||||||
|
KdbGroup *templateGroup = [templateMenuItem representedObject];
|
||||||
|
[_document useGroupAsTemplate:templateGroup];
|
||||||
|
|
||||||
|
BOOL protectNotes = [self.protectNotesCheckButton state] == NSOnState;
|
||||||
|
BOOL protectPassword = [self.protectPasswortCheckButton state] == NSOnState;
|
||||||
|
BOOL protectTitle = [self.protectTitleCheckButton state] == NSOnState;
|
||||||
|
BOOL protectURL = [self.protectURLCheckButton state] == NSOnState;
|
||||||
|
BOOL protectUsername = [self.protectUserNameCheckButton state] == NSOnState;
|
||||||
|
|
||||||
|
if(_document.version == MPDatabaseVersion4) {
|
||||||
|
_document.treeV4.protectNotes = protectNotes;
|
||||||
|
_document.treeV4.protectPassword = protectPassword;
|
||||||
|
_document.treeV4.protectTitle = protectTitle;
|
||||||
|
_document.treeV4.protectUrl = protectURL;
|
||||||
|
_document.treeV4.protectUserName = protectUsername;
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||||
|
[defaults setBool:protectNotes forKey:kMPSettingsKeyLegacyHideNotes];
|
||||||
|
[defaults setBool:protectPassword forKey:kMPSettingsKeyLegacyHidePassword];
|
||||||
|
[defaults setBool:protectTitle forKey:kMPSettingsKeyLegacyHideTitle];
|
||||||
|
[defaults setBool:protectURL forKey:kMPSettingsKeyLegacyHideURL];
|
||||||
|
[defaults setBool:protectUsername forKey:kMPSettingsKeyLegacyHideUsername];
|
||||||
|
[defaults synchronize];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Close to finish */
|
||||||
|
[self close:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)close:(id)sender {
|
||||||
|
[NSApp endSheet:[self window]];
|
||||||
|
[[self window] orderOut:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (void)update {
|
||||||
|
/* Update all stuff that might have changed */
|
||||||
|
Kdb4Tree *tree = _document.treeV4;
|
||||||
|
[self _setupPasswordTab:tree];
|
||||||
|
[self _setupDatabase:tree];
|
||||||
|
[self _setupProtectionTab:tree];
|
||||||
|
[self _setupAdvancedTab:tree];
|
||||||
|
[self _setupTemplatesTab:tree];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)showSettingsTab:(MPDatabaseSettingsTab)tab {
|
||||||
|
/*
|
||||||
|
We need to make sure the window is loaded
|
||||||
|
so we just call the the getter and led teh loading commence
|
||||||
|
*/
|
||||||
|
if(![self window]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self.showPassword = NO;
|
||||||
|
NSTabViewItem *tabViewItem = [self.sectionTabView tabViewItemAtIndex:tab];
|
||||||
|
BOOL canSelectTab = [self tabView:self.sectionTabView shouldSelectTabViewItem:tabViewItem];
|
||||||
|
if(!canSelectTab) {
|
||||||
|
[self.sectionTabView selectTabViewItemAtIndex:MPDatabaseSettingsTabPassword];
|
||||||
|
}
|
||||||
|
[self.sectionTabView selectTabViewItemAtIndex:tab];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setShowPassword:(BOOL)showPassword {
|
||||||
|
if(_showPassword != showPassword) {
|
||||||
|
_showPassword = showPassword;
|
||||||
|
|
||||||
|
[self.passwordRepeatTextField setStringValue:@""];
|
||||||
|
[self _verifyPasswordAndKey];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setKeyURL:(NSURL *)keyURL {
|
||||||
|
_keyURL = keyURL;
|
||||||
|
[self _verifyPasswordAndKey];
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark Actions
|
||||||
|
- (IBAction)clearKey:(id)sender {
|
||||||
|
self.keyURL = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)generateKey:(id)sender {
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark NSTextFieldDelegate
|
||||||
|
- (void)controlTextDidChange:(NSNotification *)obj {
|
||||||
|
[self _verifyPasswordAndKey];
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark NSTableViewDelegate
|
||||||
|
- (BOOL)tabView:(NSTabView *)tabView shouldSelectTabViewItem:(NSTabViewItem *)tabViewItem {
|
||||||
|
NSUInteger index = [tabView indexOfTabViewItem:tabViewItem];
|
||||||
|
switch ((MPDatabaseSettingsTab)index) {
|
||||||
|
case MPDatabaseSettingsTabPassword:
|
||||||
|
case MPDatabaseSettingsTabDisplay:
|
||||||
|
return YES;
|
||||||
|
|
||||||
|
case MPDatabaseSettingsTabAdvanced:
|
||||||
|
case MPDatabaseSettingsTabGeneral:
|
||||||
|
case MPDatabaseSettingsTemplatesTab:
|
||||||
|
return (_document.version == MPDatabaseVersion4);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark Private Helper
|
||||||
|
- (void)_verifyPasswordAndKey {
|
||||||
|
NSString *password = [self.passwordTextField stringValue];
|
||||||
|
NSString *repeat = [self.passwordRepeatTextField stringValue];
|
||||||
|
BOOL hasKey = (self.keyURL != nil);
|
||||||
|
BOOL keyOk = YES;
|
||||||
|
if(hasKey) {
|
||||||
|
keyOk = [self.keyURL checkResourceIsReachableAndReturnError:nil];
|
||||||
|
}
|
||||||
|
BOOL hasPassword = ![NSString isEmptyString:password];
|
||||||
|
BOOL passwordOk = YES;
|
||||||
|
if(hasPassword ) {
|
||||||
|
passwordOk = [password isEqualToString:repeat] || self.showPassword;
|
||||||
|
}
|
||||||
|
BOOL hasPasswordOrKey = (hasKey || hasPassword);
|
||||||
|
keyOk = hasKey ? keyOk : YES;
|
||||||
|
passwordOk = hasPassword ? passwordOk : YES;
|
||||||
|
self.hasValidPasswordOrKey = hasPasswordOrKey && passwordOk && keyOk;
|
||||||
|
|
||||||
|
if(!hasPasswordOrKey) {
|
||||||
|
[self.errorTextField setStringValue:NSLocalizedString(@"ERROR_NO_PASSWORD_OR_KEYFILE", "Missing Key or Password")];
|
||||||
|
return; // alldone
|
||||||
|
}
|
||||||
|
if(!passwordOk && !keyOk ) {
|
||||||
|
[self.errorTextField setStringValue:NSLocalizedString(@"ERROR_PASSWORD_MISSMATCH_INVALID_KEYFILE", "Passwords do not match, keyfile is invalid")];
|
||||||
|
}
|
||||||
|
else if(!passwordOk) {
|
||||||
|
[self.errorTextField setStringValue:NSLocalizedString(@"ERROR_PASSWORD_MISSMATCH", "Passwords do not match")];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
[self.errorTextField setStringValue:NSLocalizedString(@"ERROR_INVALID_KEYFILE", "Keyfile not valid")];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)_setupDatabase:(Kdb4Tree *)tree {
|
||||||
|
BOOL isKdbx = (nil != tree);
|
||||||
|
[self.databaseDescriptionTextView setEditable:isKdbx];
|
||||||
|
[self.databaseNameTextField setEnabled:isKdbx];
|
||||||
|
if(isKdbx) {
|
||||||
|
[self.databaseNameTextField setStringValue:tree.databaseName];
|
||||||
|
[self.databaseDescriptionTextView setString:tree.databaseDescription];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
[self.databaseNameTextField setStringValue:_missingFeature];
|
||||||
|
[self.databaseDescriptionTextView setString:_missingFeature];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)_setupProtectionTab:(Kdb4Tree *)tree {
|
||||||
|
BOOL isKdbX = (nil != tree);
|
||||||
|
|
||||||
|
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
|
||||||
|
|
||||||
|
BOOL protectNotes = isKdbX ? tree.protectNotes : [defaults boolForKey:kMPSettingsKeyLegacyHideNotes];
|
||||||
|
BOOL protectPassword = isKdbX ? tree.protectPassword : [defaults boolForKey:kMPSettingsKeyLegacyHidePassword];
|
||||||
|
BOOL protectTitle = isKdbX ? tree.protectTitle : [defaults boolForKey:kMPSettingsKeyLegacyHideTitle];
|
||||||
|
BOOL protectUrl = isKdbX ? tree.protectUrl : [defaults boolForKey:kMPSettingsKeyLegacyHideURL];
|
||||||
|
BOOL protectUsername = isKdbX ? tree.protectUserName : [defaults boolForKey:kMPSettingsKeyLegacyHideUsername];
|
||||||
|
|
||||||
|
[self.protectNotesCheckButton setState:protectNotes ? NSOnState : NSOffState ];
|
||||||
|
[self.protectPasswortCheckButton setState:protectPassword ? NSOnState : NSOffState];
|
||||||
|
[self.protectTitleCheckButton setState:protectTitle ? NSOnState : NSOffState];
|
||||||
|
[self.protectURLCheckButton setState:protectUrl ? NSOnState : NSOffState];
|
||||||
|
[self.protectUserNameCheckButton setState:protectUsername ? NSOnState : NSOffState];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)_setupAdvancedTab:(Kdb4Tree *)tree {
|
||||||
|
BOOL isKdbX = (nil != tree);
|
||||||
|
|
||||||
|
self.trashEnabled = isKdbX ? tree.recycleBinEnabled : NO;
|
||||||
|
|
||||||
|
[self.enableRecycleBinCheckButton bind:NSValueBinding toObject:self withKeyPath:@"trashEnabled" options:nil];
|
||||||
|
[self.enableRecycleBinCheckButton setEnabled:isKdbX];
|
||||||
|
[self.selectRecycleBinGroupPopUpButton bind:NSEnabledBinding toObject:self withKeyPath:@"trashEnabled" options:nil];
|
||||||
|
if(isKdbX) {
|
||||||
|
[self _updateTrashFolders:tree];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)_setupPasswordTab:(Kdb4Tree *)tree {
|
||||||
|
[self.passwordTextField setStringValue:_document.password ? _document.password : @""];
|
||||||
|
[self.passwordRepeatTextField setStringValue:[self.passwordTextField stringValue]];
|
||||||
|
self.keyURL = _document.key;
|
||||||
|
|
||||||
|
NSDictionary *negateOption = @{ NSValueTransformerNameBindingOption : NSNegateBooleanTransformerName };
|
||||||
|
[self.passwordTextField bind:@"showPassword" toObject:self withKeyPath:@"showPassword" options:nil];
|
||||||
|
[self.togglePasswordButton bind:NSValueBinding toObject:self withKeyPath:@"showPassword" options:nil];
|
||||||
|
[self.passwordRepeatTextField bind:NSEnabledBinding toObject:self withKeyPath:@"showPassword" options:negateOption];
|
||||||
|
[self.errorTextField bind:NSHiddenBinding toObject:self withKeyPath:@"hasValidPasswordOrKey" options:nil];
|
||||||
|
[self.keyfilePathControl bind:NSValueBinding toObject:self withKeyPath:@"keyURL" options:nil];
|
||||||
|
|
||||||
|
[self.passwordRepeatTextField setDelegate:self];
|
||||||
|
[self.passwordTextField setDelegate:self];
|
||||||
|
|
||||||
|
/* Manually initate the first check */
|
||||||
|
[self _verifyPasswordAndKey];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)_setupTemplatesTab:(Kdb4Tree *)tree {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)_updateTrashFolders:(Kdb4Tree *)tree {
|
||||||
|
NSMenu *menu = [self _buildTrashTreeMenu:tree];
|
||||||
|
[self.selectRecycleBinGroupPopUpButton setMenu:menu];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)_updateTemplateGroup:(Kdb4Tree *)tree {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSMenu *)_buildTrashTreeMenu:(Kdb4Tree *)tree {
|
||||||
|
NSMenu *menu = [self _buildTreeMenu:tree];
|
||||||
|
|
||||||
|
NSMenuItem *selectItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"AUTOCREATE_TRASH_FOLDER", @"Menu item for automatic trash creation")
|
||||||
|
action:NULL
|
||||||
|
keyEquivalent:@""];
|
||||||
|
[selectItem setEnabled:YES];
|
||||||
|
[menu insertItem:selectItem atIndex:0];
|
||||||
|
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSMenu *)_buildTemplateTreeMenu:(Kdb4Tree *)tree {
|
||||||
|
NSMenu *menu = [self _buildTreeMenu:tree];
|
||||||
|
|
||||||
|
NSMenuItem *selectItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"NO_TEMPLATE_GROUP", @"Menu item to reset the template groups")
|
||||||
|
action:NULL
|
||||||
|
keyEquivalent:@""];
|
||||||
|
[selectItem setEnabled:YES];
|
||||||
|
[menu insertItem:selectItem atIndex:0];
|
||||||
|
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (NSMenu *)_buildTreeMenu:(Kdb4Tree *)tree {
|
||||||
|
NSMenu *menu = [[NSMenu alloc] init];
|
||||||
|
[menu setAutoenablesItems:NO];
|
||||||
|
|
||||||
|
for(Kdb4Group *group in tree.root.groups) {
|
||||||
|
NSMenuItem *groupItem = [[NSMenuItem alloc] init];
|
||||||
|
[groupItem setImage:group.icon];
|
||||||
|
[groupItem setTitle:group.name];
|
||||||
|
[groupItem setRepresentedObject:group];
|
||||||
|
[groupItem setEnabled:YES];
|
||||||
|
if([group.uuid isEqual:tree.recycleBinUuid]) {
|
||||||
|
[groupItem setState:NSOnState];
|
||||||
|
}
|
||||||
|
[menu addItem:groupItem];
|
||||||
|
}
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
157
MacPass/MPDocument+Attachments.m
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
//
|
||||||
|
// MPDocument+Attachments.m
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Michael Starke on 05.07.13.
|
||||||
|
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "MPDocument.h"
|
||||||
|
|
||||||
|
#import "NSMutableData+Base64.h"
|
||||||
|
#import "NSData+Gzip.h"
|
||||||
|
|
||||||
|
#import "Kdb3Node.h"
|
||||||
|
#import "Kdb3Entry+KVOAdditions.h"
|
||||||
|
#import "Kdb4Node.h"
|
||||||
|
#import "Kdb4Entry+KVOAdditions.h"
|
||||||
|
|
||||||
|
@implementation MPDocument (Attachments)
|
||||||
|
|
||||||
|
- (void)addAttachment:(NSURL *)location toEntry:(KdbEntry *)anEntry {
|
||||||
|
NSError *error = nil;
|
||||||
|
NSString *fileName = [location lastPathComponent];
|
||||||
|
if([anEntry isKindOfClass:[Kdb3Entry class]]) {
|
||||||
|
Kdb3Entry *entry = (Kdb3Entry *)anEntry;
|
||||||
|
NSData *binaryData = [NSData dataWithContentsOfURL:location options:NSDataReadingUncached error:&error];
|
||||||
|
if(!binaryData) {
|
||||||
|
[NSApp presentError:error];
|
||||||
|
binaryData = nil;
|
||||||
|
error = nil;
|
||||||
|
return; // failed
|
||||||
|
}
|
||||||
|
entry.binary = binaryData;
|
||||||
|
entry.binaryDesc = fileName;
|
||||||
|
[entry insertObject:@"" inBinariesAtIndex:1];
|
||||||
|
}
|
||||||
|
if( [anEntry isKindOfClass:[Kdb4Entry class]]) {
|
||||||
|
Kdb4Entry *entry = (Kdb4Entry *)anEntry;
|
||||||
|
NSData *fileData = [NSData dataWithContentsOfURL:location options:NSDataReadingMappedIfSafe error:&error];
|
||||||
|
if(!fileData) {
|
||||||
|
[NSApp presentError:error];
|
||||||
|
fileData = nil;
|
||||||
|
error = nil;
|
||||||
|
return; // failed
|
||||||
|
}
|
||||||
|
Binary *binary = [[Binary alloc] init];
|
||||||
|
NSUInteger nextId = [self nextBinaryId];
|
||||||
|
if(nextId == NSNotFound) {
|
||||||
|
binary = nil;
|
||||||
|
return; // No id found. Something went wrong
|
||||||
|
}
|
||||||
|
binary.binaryId = nextId;
|
||||||
|
binary.compressed = (self.treeV4.compressionAlgorithm != KPLCompressionNone);
|
||||||
|
NSData *encodedData;
|
||||||
|
if(binary.compressed) {
|
||||||
|
switch(self.treeV4.compressionAlgorithm) {
|
||||||
|
case KPLCompressionGzip: {
|
||||||
|
NSData *compressedData = [fileData gzipDeflate];
|
||||||
|
encodedData = [NSMutableData mutableDataWithBase64EncodedData:compressedData];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
NSAssert(NO, @"Unsupported Compression Algorithm");
|
||||||
|
binary = nil;
|
||||||
|
encodedData = nil;
|
||||||
|
fileData = nil;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
encodedData = fileData;
|
||||||
|
}
|
||||||
|
binary.data = [[NSString alloc] initWithData:encodedData encoding:NSUTF8StringEncoding];
|
||||||
|
|
||||||
|
[self.treeV4.binaries addObject:binary];
|
||||||
|
BinaryRef *ref = [[BinaryRef alloc] init];
|
||||||
|
ref.key = fileName;
|
||||||
|
ref.ref = binary.binaryId;
|
||||||
|
[entry insertObject:ref inBinariesAtIndex:[entry.binaries count]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)saveAttachmentFromEntry:(KdbEntry *)anEntry toLocation:(NSURL *)location {
|
||||||
|
if([anEntry isKindOfClass:[Kdb3Entry class]]) {
|
||||||
|
Kdb3Entry *entry = (Kdb3Entry *)anEntry;
|
||||||
|
NSError *error = nil;
|
||||||
|
if(! [entry.binary writeToURL:location options:NSDataWritingWithoutOverwriting error:&error] ) {
|
||||||
|
[NSApp presentError:error];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return; //
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)removeAttachment:(BinaryRef *)reference fromEntry:(KdbEntry *)anEntry {
|
||||||
|
if(self.version != MPDatabaseVersion4) {
|
||||||
|
return; // Wrong Database version;
|
||||||
|
}
|
||||||
|
Binary *binary = [self findBinary:reference];
|
||||||
|
Kdb4Entry *entry = (Kdb4Entry *)anEntry;
|
||||||
|
NSUInteger index = [entry.binaries indexOfObject:reference];
|
||||||
|
if(index == NSNotFound) {
|
||||||
|
return; // No Reference for this entry found
|
||||||
|
}
|
||||||
|
[entry removeObjectFromBinariesAtIndex:index];
|
||||||
|
[self.treeV4.binaries removeObject:binary];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)removeAttachmentFromEntry:(KdbEntry *)anEntry {
|
||||||
|
if(self.version != MPDatabaseVersion3) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Kdb3Entry *entry = (Kdb3Entry *)anEntry;
|
||||||
|
[entry removeObjectFromBinariesAtIndex:0];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (Binary *)findBinary:(BinaryRef *)reference {
|
||||||
|
if(self.version != MPDatabaseVersion4) {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
NSPredicate *filterPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
|
||||||
|
Binary *binaryFile = evaluatedObject;
|
||||||
|
return (binaryFile.binaryId == reference.ref);
|
||||||
|
}];
|
||||||
|
NSArray *filteredBinary = [self.treeV4.binaries filteredArrayUsingPredicate:filterPredicate];
|
||||||
|
return [filteredBinary lastObject];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)saveAttachment:(BinaryRef *)reference toLocation:(NSURL *)location {
|
||||||
|
Binary *binary = [self findBinary:reference];
|
||||||
|
NSData *rawData = nil;
|
||||||
|
if(binary) {
|
||||||
|
if(binary.compressed) {
|
||||||
|
rawData = [NSMutableData mutableDataWithBase64DecodedData:[binary.data dataUsingEncoding:NSUTF8StringEncoding]];
|
||||||
|
rawData = [rawData gzipInflate];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rawData = [NSMutableData mutableDataWithBase64DecodedData:[binary.data dataUsingEncoding:NSUTF8StringEncoding]];
|
||||||
|
}
|
||||||
|
NSError *error = nil;
|
||||||
|
if( ![rawData writeToURL:location options:0 error:&error] ) {
|
||||||
|
[NSApp presentError:error];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSUInteger)nextBinaryId {
|
||||||
|
if(self.version != MPDatabaseVersion4) {
|
||||||
|
return NSNotFound;
|
||||||
|
}
|
||||||
|
NSUInteger maxKey = 0;
|
||||||
|
for(Binary *binary in self.treeV4.binaries) {
|
||||||
|
maxKey = MAX(binary.binaryId, maxKey);
|
||||||
|
}
|
||||||
|
return (maxKey + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -34,22 +34,27 @@ APPKIT_EXTERN NSString *const MPDocumentGroupKey;
|
|||||||
@interface MPDocument : NSDocument
|
@interface MPDocument : NSDocument
|
||||||
|
|
||||||
/* true, if password and/or keyfile are set */
|
/* true, if password and/or keyfile are set */
|
||||||
@property (assign, readonly, getter = isSecured) BOOL secured;
|
@property (assign, readonly) BOOL hasPasswordOrKey;
|
||||||
/* true, if lock screen is present (no phyiscal locking) */
|
/* true, if lock screen is present (no phyiscal locking) */
|
||||||
@property (assign, getter = isLocked) BOOL locked;
|
@property (assign, nonatomic) BOOL locked;
|
||||||
/* true, if document is loaded and decrypted (tree is loaded) */
|
@property (assign, readonly) BOOL decrypted;
|
||||||
@property (assign, readonly, getter = isDecrypted) BOOL decrypted;
|
|
||||||
@property (strong, readonly, nonatomic) KdbTree *tree;
|
@property (strong, readonly, nonatomic) KdbTree *tree;
|
||||||
@property (weak, readonly, nonatomic) KdbGroup *root;
|
@property (weak, readonly, nonatomic) KdbGroup *root;
|
||||||
@property (readonly, strong) MPRootAdapter *rootAdapter;
|
@property (readonly, strong) MPRootAdapter *rootAdapter;
|
||||||
@property (nonatomic, strong) NSString *password;
|
@property (weak, readonly) KdbGroup *trash;
|
||||||
|
|
||||||
|
@property (nonatomic, copy) NSString *password;
|
||||||
@property (nonatomic, strong) NSURL *key;
|
@property (nonatomic, strong) NSURL *key;
|
||||||
|
|
||||||
@property (assign, readonly) MPDatabaseVersion version;
|
@property (assign, readonly) MPDatabaseVersion version;
|
||||||
@property (assign, readonly, getter = isReadOnly) BOOL readOnly;
|
@property (assign, readonly, getter = isReadOnly) BOOL readOnly;
|
||||||
|
|
||||||
- (id)initWithVersion:(MPDatabaseVersion)version;
|
- (id)initWithVersion:(MPDatabaseVersion)version;
|
||||||
- (BOOL)decryptWithPassword:(NSString *)password keyFileURL:(NSURL *)keyFileURL;
|
|
||||||
|
#pragma mark Lock/Decrypt
|
||||||
|
- (void)lockDatabase:(id)sender;
|
||||||
|
- (BOOL)unlockWithPassword:(NSString *)password keyFileURL:(NSURL *)keyFileURL;
|
||||||
|
|
||||||
#pragma mark Data Lookup
|
#pragma mark Data Lookup
|
||||||
/*
|
/*
|
||||||
@@ -57,16 +62,17 @@ APPKIT_EXTERN NSString *const MPDocumentGroupKey;
|
|||||||
*/
|
*/
|
||||||
- (KdbEntry *)findEntry:(UUID *)uuid;
|
- (KdbEntry *)findEntry:(UUID *)uuid;
|
||||||
- (KdbGroup *)findGroup:(UUID *)uuid;
|
- (KdbGroup *)findGroup:(UUID *)uuid;
|
||||||
/*
|
|
||||||
Return the Binary for the given BinaryRef. nil if none was found
|
|
||||||
*/
|
|
||||||
- (Binary *)binaryForRef:(BinaryRef *)binaryRef;
|
|
||||||
|
|
||||||
- (Kdb4Tree *)treeV4;
|
- (Kdb4Tree *)treeV4;
|
||||||
- (Kdb3Tree *)treeV3;
|
- (Kdb3Tree *)treeV3;
|
||||||
|
|
||||||
- (void)useGroupAsTrash:(KdbGroup *)group;
|
- (void)useGroupAsTrash:(KdbGroup *)group;
|
||||||
|
- (void)useGroupAsTemplate:(KdbGroup *)group;
|
||||||
|
|
||||||
|
- (BOOL)isItemTrashed:(id)item;
|
||||||
|
|
||||||
|
#pragma mark Export
|
||||||
|
- (void)writeXMLToURL:(NSURL *)url;
|
||||||
|
|
||||||
#pragma mark Undo Data Manipulation
|
#pragma mark Undo Data Manipulation
|
||||||
/* Undoable Intiialization of elements */
|
/* Undoable Intiialization of elements */
|
||||||
@@ -78,18 +84,25 @@ APPKIT_EXTERN NSString *const MPDocumentGroupKey;
|
|||||||
All non-setter undoable actions
|
All non-setter undoable actions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
- (void)moveGroup:(KdbGroup *)group toGroup:(KdbGroup *)target index:(NSInteger)index;
|
/* TODO in UNDO auslagen */
|
||||||
- (BOOL)group:(KdbGroup *)group isMoveableToGroup:(KdbGroup *)target;
|
- (void)addStringField:(StringField *)field toEntry:(Kdb4Entry *)entry atIndex:(NSUInteger)index;
|
||||||
- (void)moveEntry:(KdbEntry *)entry toGroup:(KdbGroup *)target index:(NSInteger)index;
|
- (void)removeStringField:(StringField *)field formEntry:(Kdb4Entry *)entry;
|
||||||
|
|
||||||
- (void)group:(KdbGroup *)group addEntry:(KdbEntry *)entry atIndex:(NSUInteger)index;
|
- (void)deleteGroup:(KdbGroup *)group;
|
||||||
- (void)group:(KdbGroup *)group addGroup:(KdbGroup *)aGroup atIndex:(NSUInteger)index;
|
- (void)deleteEntry:(KdbEntry *)entry;
|
||||||
- (void)group:(KdbGroup *)group removeEntry:(KdbEntry *)entry;
|
|
||||||
- (void)group:(KdbGroup *)group removeGroup:(KdbGroup *)aGroup;
|
|
||||||
|
|
||||||
- (void)entry:(Kdb4Entry *)entry addStringField:(StringField *)field atIndex:(NSUInteger)index;
|
|
||||||
- (void)entry:(Kdb4Entry *)entry removeStringField:(StringField *)field;
|
|
||||||
|
|
||||||
- (void)emptyTrash:(id)sender;
|
- (void)emptyTrash:(id)sender;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@interface MPDocument (Attachments)
|
||||||
|
|
||||||
|
- (void)addAttachment:(NSURL *)location toEntry:(KdbEntry *)anEntry;
|
||||||
|
- (void)saveAttachmentFromEntry:(KdbEntry *)anEntry toLocation:(NSURL *)location;
|
||||||
|
- (void)saveAttachment:(BinaryRef *)reference toLocation:(NSURL *)location;
|
||||||
|
- (void)removeAttachment:(BinaryRef *)reference fromEntry:(KdbEntry *)anEntry;
|
||||||
|
- (void)removeAttachmentFromEntry:(KdbEntry *)anEntry;
|
||||||
|
- (NSUInteger)nextBinaryId;
|
||||||
|
- (Binary *)findBinary:(BinaryRef *)reference;
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -13,19 +13,29 @@
|
|||||||
#import "MPRootAdapter.h"
|
#import "MPRootAdapter.h"
|
||||||
#import "MPIconHelper.h"
|
#import "MPIconHelper.h"
|
||||||
#import "MPActionHelper.h"
|
#import "MPActionHelper.h"
|
||||||
|
#import "MPSettingsHelper.h"
|
||||||
|
|
||||||
#import "KdbLib.h"
|
#import "KdbLib.h"
|
||||||
#import "Kdb3Node.h"
|
#import "Kdb3Node.h"
|
||||||
#import "Kdb4Node.h"
|
#import "Kdb4Node.h"
|
||||||
|
#import "Kdb4Persist.h"
|
||||||
#import "KdbPassword.h"
|
#import "KdbPassword.h"
|
||||||
#import "KdbGroup+Undo.h"
|
|
||||||
#import "KdbGroup+KVOAdditions.h"
|
#import "KdbGroup+KVOAdditions.h"
|
||||||
#import "Kdb4Entry+KVOAdditions.h"
|
#import "Kdb4Entry+KVOAdditions.h"
|
||||||
#import "KdbGroup+MPTreeTools.h"
|
|
||||||
#import "KdbGroup+MPAdditions.h"
|
|
||||||
#import "KdbEntry+Undo.h"
|
#import "KdbEntry+Undo.h"
|
||||||
|
#import "KdbGroup+Undo.h"
|
||||||
|
|
||||||
#import "Kdb3Tree+NewTree.h"
|
#import "Kdb3Tree+NewTree.h"
|
||||||
#import "Kdb4Tree+NewTree.h"
|
#import "Kdb4Tree+NewTree.h"
|
||||||
|
#import "Kdb4Entry+MPAdditions.h"
|
||||||
|
#import "KdbGroup+MPTreeTools.h"
|
||||||
|
#import "KdbGroup+MPAdditions.h"
|
||||||
|
|
||||||
|
#import "DataOutputStream.h"
|
||||||
|
|
||||||
|
#import "DDXMLNode.h"
|
||||||
|
|
||||||
NSString *const MPDocumentDidAddGroupNotification = @"com.hicknhack.macpass.MPDocumentDidAddGroupNotification";
|
NSString *const MPDocumentDidAddGroupNotification = @"com.hicknhack.macpass.MPDocumentDidAddGroupNotification";
|
||||||
NSString *const MPDocumentWillDelteGroupNotification = @"com.hicknhack.macpass.MPDocumentDidDelteGroupNotification";
|
NSString *const MPDocumentWillDelteGroupNotification = @"com.hicknhack.macpass.MPDocumentDidDelteGroupNotification";
|
||||||
@@ -40,6 +50,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
|||||||
@interface MPDocument () {
|
@interface MPDocument () {
|
||||||
@private
|
@private
|
||||||
BOOL _didLockFile;
|
BOOL _didLockFile;
|
||||||
|
NSData *_fileData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -48,14 +59,15 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
|||||||
@property (weak, nonatomic, readonly) KdbPassword *passwordHash;
|
@property (weak, nonatomic, readonly) KdbPassword *passwordHash;
|
||||||
@property (assign) MPDatabaseVersion version;
|
@property (assign) MPDatabaseVersion version;
|
||||||
|
|
||||||
@property (assign, nonatomic) BOOL secured;
|
@property (assign, nonatomic) BOOL hasPasswordOrKey;
|
||||||
@property (assign) BOOL decrypted;
|
@property (assign) BOOL decrypted;
|
||||||
@property (assign) BOOL readOnly;
|
@property (assign) BOOL readOnly;
|
||||||
|
|
||||||
@property (strong) NSURL *lockFileURL;
|
@property (strong) NSURL *lockFileURL;
|
||||||
|
|
||||||
@property (readonly) BOOL useTrash;
|
@property (readonly) BOOL useTrash;
|
||||||
@property (weak, readonly) KdbGroup *trash;
|
@property (strong) IBOutlet NSView *warningView;
|
||||||
|
@property (weak) IBOutlet NSImageView *warningViewImage;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@@ -70,9 +82,10 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
|||||||
- (id)initWithVersion:(MPDatabaseVersion)version {
|
- (id)initWithVersion:(MPDatabaseVersion)version {
|
||||||
self = [super init];
|
self = [super init];
|
||||||
if(self) {
|
if(self) {
|
||||||
|
_fileData = nil;
|
||||||
_didLockFile = NO;
|
_didLockFile = NO;
|
||||||
_decrypted = YES;
|
_decrypted = YES;
|
||||||
_secured = NO;
|
_hasPasswordOrKey = NO;
|
||||||
_locked = NO;
|
_locked = NO;
|
||||||
_readOnly = NO;
|
_readOnly = NO;
|
||||||
_rootAdapter = [[MPRootAdapter alloc] init];
|
_rootAdapter = [[MPRootAdapter alloc] init];
|
||||||
@@ -83,6 +96,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
|||||||
break;
|
break;
|
||||||
case MPDatabaseVersion4:
|
case MPDatabaseVersion4:
|
||||||
self.tree = [Kdb4Tree templateTree];
|
self.tree = [Kdb4Tree templateTree];
|
||||||
|
//self.tree = [Kdb4Tree demoTree];
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
self = nil;
|
self = nil;
|
||||||
@@ -117,6 +131,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)readFromURL:(NSURL *)url ofType:(NSString *)typeName error:(NSError **)outError {
|
- (BOOL)readFromURL:(NSURL *)url ofType:(NSString *)typeName error:(NSError **)outError {
|
||||||
|
/* FIXME: Logfile handling
|
||||||
self.lockFileURL = [url URLByAppendingPathExtension:@"lock"];
|
self.lockFileURL = [url URLByAppendingPathExtension:@"lock"];
|
||||||
if([[NSFileManager defaultManager] fileExistsAtPath:[_lockFileURL path]]) {
|
if([[NSFileManager defaultManager] fileExistsAtPath:[_lockFileURL path]]) {
|
||||||
self.readOnly = YES;
|
self.readOnly = YES;
|
||||||
@@ -126,6 +141,12 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
|||||||
_didLockFile = YES;
|
_didLockFile = YES;
|
||||||
self.readOnly = NO;
|
self.readOnly = NO;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
Delete our old Tree, and just grab the data
|
||||||
|
*/
|
||||||
|
self.tree = nil;
|
||||||
|
_fileData = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:outError];
|
||||||
self.decrypted = NO;
|
self.decrypted = NO;
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
@@ -145,12 +166,26 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
|||||||
|
|
||||||
- (void)close {
|
- (void)close {
|
||||||
[self _cleanupLock];
|
[self _cleanupLock];
|
||||||
|
/*
|
||||||
|
We store the last url. Restored windows are automatically handeld.
|
||||||
|
If closeAllDocuments is set, all docs get this messgae
|
||||||
|
*/
|
||||||
|
if([[self fileURL] isFileURL]) {
|
||||||
|
[[NSUserDefaults standardUserDefaults] setObject:[self.fileURL absoluteString] forKey:kMPSettingsKeyLastDatabasePath];
|
||||||
|
}
|
||||||
[super close];
|
[super close];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark Protection
|
- (void)writeXMLToURL:(NSURL *)url {
|
||||||
|
DataOutputStream *outputStream = [[DataOutputStream alloc] init];
|
||||||
|
Kdb4Persist *persist = [[Kdb4Persist alloc] initWithTree:self.treeV4 outputStream:outputStream randomStream:nil];
|
||||||
|
[persist persistWithOptions:DDXMLNodeCompactEmptyElement|DDXMLNodePrettyPrint];
|
||||||
|
[outputStream.data writeToURL:url atomically:YES];
|
||||||
|
}
|
||||||
|
|
||||||
- (BOOL)decryptWithPassword:(NSString *)password keyFileURL:(NSURL *)keyFileURL {
|
#pragma mark Lock/Unlock/Decrypt
|
||||||
|
|
||||||
|
- (BOOL)unlockWithPassword:(NSString *)password keyFileURL:(NSURL *)keyFileURL {
|
||||||
self.key = keyFileURL;
|
self.key = keyFileURL;
|
||||||
self.password = [password length] > 0 ? password : nil;
|
self.password = [password length] > 0 ? password : nil;
|
||||||
@try {
|
@try {
|
||||||
@@ -170,17 +205,26 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
|||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)lockDatabase:(id)sender {
|
||||||
|
// Persist Tree into data
|
||||||
|
self.tree = nil;
|
||||||
|
self.locked = YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#pragma mark Custom Setter
|
||||||
|
|
||||||
- (void)setPassword:(NSString *)password {
|
- (void)setPassword:(NSString *)password {
|
||||||
if(![_password isEqualToString:password]) {
|
if(![_password isEqualToString:password]) {
|
||||||
_password = password;
|
_password = [password copy];
|
||||||
_secured |= ([_password length] > 0);
|
[self _updateIsSecured];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setKey:(NSURL *)key {
|
- (void)setKey:(NSURL *)key {
|
||||||
if(![[_key absoluteString] isEqualToString:[key absoluteString]]) {
|
if(![[_key absoluteString] isEqualToString:[key absoluteString]]) {
|
||||||
_key = key;
|
_key = key;
|
||||||
_secured |= (_key != nil);
|
[self _updateIsSecured];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -194,6 +238,19 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
|||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (BOOL)prepareSavePanel:(NSSavePanel *)savePanel {
|
||||||
|
if(self.hasPasswordOrKey) {
|
||||||
|
[savePanel setAccessoryView:nil];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
if(!self.warningView) {
|
||||||
|
[[NSBundle mainBundle] loadNibNamed:@"UnprotectedWarningView" owner:self topLevelObjects:nil];
|
||||||
|
[self.warningViewImage setImage:[NSImage imageNamed:NSImageNameCaution]];
|
||||||
|
}
|
||||||
|
[savePanel setAccessoryView:self.warningView];
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark Data Accesors
|
#pragma mark Data Accesors
|
||||||
- (void)setTree:(KdbTree *)tree {
|
- (void)setTree:(KdbTree *)tree {
|
||||||
if(_tree != tree) {
|
if(_tree != tree) {
|
||||||
@@ -214,23 +271,10 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
|||||||
return [self.root groupForUUID:uuid];
|
return [self.root groupForUUID:uuid];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (Binary *)binaryForRef:(BinaryRef *)binaryRef {
|
|
||||||
if(self.version != MPDatabaseVersion4) {
|
|
||||||
return nil;
|
|
||||||
}
|
|
||||||
NSPredicate *filterPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
|
|
||||||
Binary *binaryFile = evaluatedObject;
|
|
||||||
return (binaryFile.binaryId == binaryRef.ref);
|
|
||||||
}];
|
|
||||||
Kdb4Tree *tree = (Kdb4Tree *)self.tree;
|
|
||||||
NSArray *filteredBinary = [tree.binaries filteredArrayUsingPredicate:filterPredicate];
|
|
||||||
return [filteredBinary lastObject];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (Kdb3Tree *)treeV3 {
|
- (Kdb3Tree *)treeV3 {
|
||||||
switch (_version) {
|
switch (_version) {
|
||||||
case MPDatabaseVersion3:
|
case MPDatabaseVersion3:
|
||||||
NSAssert([self.tree isKindOfClass:[Kdb3Tree class]], @"Tree has to be Version3");
|
NSAssert(self.tree == nil || [self.tree isKindOfClass:[Kdb3Tree class]], @"Tree has to be Version3");
|
||||||
return (Kdb3Tree *)self.tree;
|
return (Kdb3Tree *)self.tree;
|
||||||
case MPDatabaseVersion4:
|
case MPDatabaseVersion4:
|
||||||
return nil;
|
return nil;
|
||||||
@@ -244,7 +288,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
|||||||
case MPDatabaseVersion3:
|
case MPDatabaseVersion3:
|
||||||
return nil;
|
return nil;
|
||||||
case MPDatabaseVersion4:
|
case MPDatabaseVersion4:
|
||||||
NSAssert([self.tree isKindOfClass:[Kdb4Tree class]], @"Tree has to be Version4");
|
NSAssert(self.tree == nil || [self.tree isKindOfClass:[Kdb4Tree class]], @"Tree has to be Version4");
|
||||||
return (Kdb4Tree *)self.tree;
|
return (Kdb4Tree *)self.tree;
|
||||||
default:
|
default:
|
||||||
return nil;
|
return nil;
|
||||||
@@ -270,6 +314,26 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
|||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (BOOL)isItemTrashed:(id)item {
|
||||||
|
BOOL validItem = [item isKindOfClass:[KdbEntry class]] || [item isKindOfClass:[KdbGroup class]];
|
||||||
|
if(!item) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
if(item == self.trash) {
|
||||||
|
return NO; // No need to look further as this is the trashcan
|
||||||
|
}
|
||||||
|
if(validItem) {
|
||||||
|
BOOL isTrashed = NO;
|
||||||
|
id parent = [item parent];
|
||||||
|
while( parent && !isTrashed ) {
|
||||||
|
isTrashed = (parent == self.trash);
|
||||||
|
parent = [parent parent];
|
||||||
|
}
|
||||||
|
return isTrashed;
|
||||||
|
}
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)useGroupAsTrash:(KdbGroup *)group {
|
- (void)useGroupAsTrash:(KdbGroup *)group {
|
||||||
if(self.useTrash) {
|
if(self.useTrash) {
|
||||||
Kdb4Group *groupv4 = (Kdb4Group *)group;
|
Kdb4Group *groupv4 = (Kdb4Group *)group;
|
||||||
@@ -279,17 +343,30 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)useGroupAsTemplate:(KdbGroup *)group {
|
||||||
|
Kdb4Group *groupv4 = (Kdb4Group *)group;
|
||||||
|
if([self.treeV4.entryTemplatesGroup isEqual:groupv4.uuid]) {
|
||||||
|
self.treeV4.entryTemplatesGroup = groupv4.uuid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark Data manipulation
|
#pragma mark Data manipulation
|
||||||
- (KdbEntry *)createEntry:(KdbGroup *)parent {
|
- (KdbEntry *)createEntry:(KdbGroup *)parent {
|
||||||
if(!parent) {
|
if(!parent) {
|
||||||
return nil; // No parent
|
return nil; // No parent
|
||||||
}
|
}
|
||||||
|
if(parent == self.trash) {
|
||||||
|
return nil; // no new Groups in trash
|
||||||
|
}
|
||||||
|
if([self isItemTrashed:parent]) {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
KdbEntry *newEntry = [self.tree createEntry:parent];
|
KdbEntry *newEntry = [self.tree createEntry:parent];
|
||||||
newEntry.title = NSLocalizedString(@"DEFAULT_ENTRY_TITLE", @"Title for a newly created entry");
|
newEntry.title = NSLocalizedString(@"DEFAULT_ENTRY_TITLE", @"Title for a newly created entry");
|
||||||
if(self.treeV4 && ([self.treeV4.defaultUserName length] > 0)) {
|
if(self.treeV4 && ([self.treeV4.defaultUserName length] > 0)) {
|
||||||
newEntry.title = self.treeV4.defaultUserName;
|
newEntry.title = self.treeV4.defaultUserName;
|
||||||
}
|
}
|
||||||
[self group:parent addEntry:newEntry atIndex:[parent.entries count]];
|
[parent addEntryUndoable:newEntry atIndex:[parent.entries count]];
|
||||||
NSDictionary *userInfo = @{ MPDocumentEntryKey : newEntry };
|
NSDictionary *userInfo = @{ MPDocumentEntryKey : newEntry };
|
||||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentDidAddEntryNotification object:self userInfo:userInfo];
|
[[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentDidAddEntryNotification object:self userInfo:userInfo];
|
||||||
return newEntry;
|
return newEntry;
|
||||||
@@ -299,9 +376,16 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
|||||||
if(!parent) {
|
if(!parent) {
|
||||||
return nil; // no parent!
|
return nil; // no parent!
|
||||||
}
|
}
|
||||||
|
if(parent == self.trash) {
|
||||||
|
return nil; // no new Groups in trash
|
||||||
|
}
|
||||||
|
if([self isItemTrashed:parent]) {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
KdbGroup *newGroup = [self.tree createGroup:parent];
|
KdbGroup *newGroup = [self.tree createGroup:parent];
|
||||||
newGroup.name = NSLocalizedString(@"DEFAULT_GROUP_NAME", @"Title for a newly created group");
|
newGroup.name = NSLocalizedString(@"DEFAULT_GROUP_NAME", @"Title for a newly created group");
|
||||||
[self group:parent addGroup:newGroup atIndex:[parent.groups count]];
|
newGroup.image = MPIconFolder;
|
||||||
|
[parent addGroupUndoable:newGroup atIndex:[parent.groups count]];
|
||||||
NSDictionary *userInfo = @{ MPDocumentGroupKey : newGroup };
|
NSDictionary *userInfo = @{ MPDocumentGroupKey : newGroup };
|
||||||
[[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentDidAddGroupNotification object:self userInfo:userInfo];
|
[[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentDidAddGroupNotification object:self userInfo:userInfo];
|
||||||
return newGroup;
|
return newGroup;
|
||||||
@@ -315,154 +399,104 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
|||||||
Kdb4Entry *entryV4 = (Kdb4Entry *)entry;
|
Kdb4Entry *entryV4 = (Kdb4Entry *)entry;
|
||||||
NSString *title = NSLocalizedString(@"DEFAULT_CUSTOM_FIELD_TITLE", @"Default Titel for new Custom-Fields");
|
NSString *title = NSLocalizedString(@"DEFAULT_CUSTOM_FIELD_TITLE", @"Default Titel for new Custom-Fields");
|
||||||
NSString *value = NSLocalizedString(@"DEFAULT_CUSTOM_FIELD_VALUE", @"Default Value for new Custom-Fields");
|
NSString *value = NSLocalizedString(@"DEFAULT_CUSTOM_FIELD_VALUE", @"Default Value for new Custom-Fields");
|
||||||
|
title = [entryV4 uniqueKeyForProposal:title];
|
||||||
StringField *newStringField = [StringField stringFieldWithKey:title andValue:value];
|
StringField *newStringField = [StringField stringFieldWithKey:title andValue:value];
|
||||||
[self entry:entryV4 addStringField:newStringField atIndex:[entryV4.stringFields count]];
|
[self addStringField:newStringField toEntry:entryV4 atIndex:[entryV4.stringFields count]];
|
||||||
return newStringField;
|
return newStringField;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)deleteEntry:(KdbEntry *)entry {
|
||||||
- (void)moveGroup:(KdbGroup *)group toGroup:(KdbGroup *)target index:(NSInteger)index {
|
|
||||||
NSInteger oldIndex = [group.parent.groups indexOfObject:group];
|
|
||||||
if(group.parent == target && oldIndex == index) {
|
|
||||||
return; // No changes
|
|
||||||
}
|
|
||||||
[[[self undoManager] prepareWithInvocationTarget:self] moveGroup:group toGroup:group.parent index:oldIndex];
|
|
||||||
if(self.trash == target) {
|
|
||||||
[[self undoManager] setActionName:@"UNDO_DELETE_GROUP"];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
[[self undoManager] setActionName:@"MOVE_GROUP"];
|
|
||||||
}
|
|
||||||
[group.parent removeObjectFromGroupsAtIndex:oldIndex];
|
|
||||||
if(index < 0 || index > [target.groups count] ) {
|
|
||||||
index = [target.groups count];
|
|
||||||
}
|
|
||||||
[target insertObject:group inGroupsAtIndex:index];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (BOOL)group:(KdbGroup *)group isMoveableToGroup:(KdbGroup *)target {
|
|
||||||
if(target == nil) {
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
BOOL isMovable = YES;
|
|
||||||
|
|
||||||
KdbGroup *ancestor = target.parent;
|
|
||||||
while(ancestor.parent) {
|
|
||||||
if(ancestor == group) {
|
|
||||||
isMovable = NO;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
ancestor = ancestor.parent;
|
|
||||||
}
|
|
||||||
return isMovable;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)moveEntry:(KdbEntry *)entry toGroup:(KdbGroup *)target index:(NSInteger)index {
|
|
||||||
NSInteger oldIndex = [entry.parent.entries indexOfObject:entry];
|
|
||||||
if(entry.parent == target && oldIndex == index) {
|
|
||||||
return; // No changes
|
|
||||||
}
|
|
||||||
[[[self undoManager] prepareWithInvocationTarget:self] moveEntry:entry toGroup:entry.parent index:oldIndex];
|
|
||||||
if(self.trash == target || self.trash == entry.parent) {
|
|
||||||
[[self undoManager] setActionName:@"UNDO_DELETE_ENTRY"];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
[[self undoManager] setActionName:@"MOVE_ENTRY"];
|
|
||||||
}
|
|
||||||
[entry.parent removeObjectFromEntriesAtIndex:oldIndex];
|
|
||||||
if(index < 0 || index > [target.groups count] ) {
|
|
||||||
index = [target.groups count];
|
|
||||||
}
|
|
||||||
[target insertObject:entry inEntriesAtIndex:index];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)group:(KdbGroup *)group addEntry:(KdbEntry *)entry atIndex:(NSUInteger)index {
|
|
||||||
[[[self undoManager] prepareWithInvocationTarget:self] group:group removeEntry:entry];
|
|
||||||
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_ADD_ENTRY", "Undo adding of entry")];
|
|
||||||
[group insertObject:entry inEntriesAtIndex:index];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)group:(KdbGroup *)group addGroup:(KdbGroup *)aGroup atIndex:(NSUInteger)index {
|
|
||||||
[[[self undoManager] prepareWithInvocationTarget:self] group:group removeGroup:aGroup];
|
|
||||||
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_ADD_GROUP", @"Create Group Undo")];
|
|
||||||
[group insertObject:aGroup inGroupsAtIndex:index];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)group:(KdbGroup *)group removeEntry:(KdbEntry *)entry {
|
|
||||||
NSInteger index = [group.entries indexOfObject:entry];
|
|
||||||
if(NSNotFound == index) {
|
|
||||||
return; // No object found;
|
|
||||||
}
|
|
||||||
if(self.useTrash) {
|
if(self.useTrash) {
|
||||||
if(!self.trash) {
|
if(!self.trash) {
|
||||||
[self _createTrashGroup];
|
[self _createTrashGroup];
|
||||||
}
|
}
|
||||||
[self moveEntry:entry toGroup:self.trash index:[self.trash.entries count]];
|
if([self isItemTrashed:entry]) {
|
||||||
return;
|
return; // Entry is already trashed
|
||||||
|
}
|
||||||
|
[entry moveToTrashUndoable:self.trash atIndex:[self.trash.entries count]];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
[entry deleteUndoable];
|
||||||
}
|
}
|
||||||
[[[self undoManager] prepareWithInvocationTarget:self] group:group addEntry:entry atIndex:index];
|
|
||||||
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_DELETE_ENTRY", "Undo deleting of entry")];
|
|
||||||
[group removeObjectFromEntriesAtIndex:index];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)group:(KdbGroup *)group removeGroup:(KdbGroup *)aGroup {
|
- (void)deleteGroup:(KdbGroup *)group {
|
||||||
NSInteger index = [group.groups indexOfObject:aGroup];
|
|
||||||
if(NSNotFound == index) {
|
|
||||||
return; // No object found
|
|
||||||
}
|
|
||||||
if(self.trash == aGroup) {
|
|
||||||
return;
|
|
||||||
// delete Trash?
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
Cleaning the recyclebin is not undoable
|
|
||||||
So we do this in a separate action
|
|
||||||
*/
|
|
||||||
if(self.useTrash) {
|
if(self.useTrash) {
|
||||||
if(!self.trash) {
|
if(!self.trash) {
|
||||||
[self _createTrashGroup];
|
[self _createTrashGroup];
|
||||||
}
|
}
|
||||||
[self moveGroup:aGroup toGroup:self.trash index:[self.trash.groups count]];
|
if( (group == self.trash) || [self isItemTrashed:group] ) {
|
||||||
return; // Done!
|
return; //Groups already trashed cannot be deleted
|
||||||
|
}
|
||||||
|
[group moveToTrashUndoable:self.trash atIndex:[self.trash.groups count]];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
[group deleteUndoable];
|
||||||
}
|
}
|
||||||
[[[self undoManager] prepareWithInvocationTarget:self] group:group addGroup:aGroup atIndex:index];
|
|
||||||
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_DELETE_GROUP", @"Delete Group Undo")];
|
|
||||||
[group removeObjectFromGroupsAtIndex:index];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)entry:(Kdb4Entry *)entry addStringField:(StringField *)field atIndex:(NSUInteger)index {
|
#pragma mark CustomFields
|
||||||
[[[self undoManager] prepareWithInvocationTarget:self] entry:entry removeStringField:field];
|
|
||||||
|
- (void)addStringField:(StringField *)field toEntry:(Kdb4Entry *)entry atIndex:(NSUInteger)index {
|
||||||
|
[[[self undoManager] prepareWithInvocationTarget:self] removeStringField:field formEntry:entry];
|
||||||
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_ADD_STRING_FIELD", @"Add Stringfield Undo")];
|
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_ADD_STRING_FIELD", @"Add Stringfield Undo")];
|
||||||
|
field.entry = entry;
|
||||||
[entry insertObject:field inStringFieldsAtIndex:index];
|
[entry insertObject:field inStringFieldsAtIndex:index];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)entry:(Kdb4Entry *)entry removeStringField:(StringField *)field {
|
- (void)removeStringField:(StringField *)field formEntry:(Kdb4Entry *)entry {
|
||||||
NSInteger index = [entry.stringFields indexOfObject:field];
|
NSInteger index = [entry.stringFields indexOfObject:field];
|
||||||
if(NSNotFound == index) {
|
if(NSNotFound == index) {
|
||||||
return; // Nothing found to be removed
|
return; // Nothing found to be removed
|
||||||
}
|
}
|
||||||
[[[self undoManager] prepareWithInvocationTarget:self] entry:entry addStringField:field atIndex:index];
|
[[[self undoManager] prepareWithInvocationTarget:self] addStringField:field toEntry:entry atIndex:index];
|
||||||
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_DELETE_STRING_FIELD", @"Delte Stringfield undo")];
|
[[self undoManager] setActionName:NSLocalizedString(@"UNDO_DELETE_STRING_FIELD", @"Delte Stringfield undo")];
|
||||||
|
field.entry = nil;
|
||||||
[entry removeObjectFromStringFieldsAtIndex:index];
|
[entry removeObjectFromStringFieldsAtIndex:index];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark Actions
|
#pragma mark Actions
|
||||||
|
|
||||||
- (void)emptyTrash:(id)sender {
|
- (void)emptyTrash:(id)sender {
|
||||||
[[self undoManager] setActionIsDiscardable:YES];
|
if(self.version != MPDatabaseVersion4) {
|
||||||
[self.trash clear];
|
return; // We have no trash on those file types
|
||||||
|
}
|
||||||
|
NSAlert *alert = [[NSAlert alloc] init];
|
||||||
|
[alert setAlertStyle:NSWarningAlertStyle];
|
||||||
|
[alert setMessageText:NSLocalizedString(@"WARNING_ON_EMPTY_TRASH_TITLE", "")];
|
||||||
|
[alert setInformativeText:NSLocalizedString(@"WARNING_ON_EMPTY_TRASH_DESCRIPTION", "Informative Text displayed when clearing the Trash")];
|
||||||
|
[alert addButtonWithTitle:NSLocalizedString(@"EMPTY_TRASH", "Empty Trash")];
|
||||||
|
[alert addButtonWithTitle:NSLocalizedString(@"CANCEL", "Cancel")];
|
||||||
|
|
||||||
|
[[alert buttons][1] setKeyEquivalent:[NSString stringWithFormat:@"%c", 0x1b]];
|
||||||
|
|
||||||
|
NSWindow *window = [[self windowControllers][0] window];
|
||||||
|
[alert beginSheetModalForWindow:window modalDelegate:self didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:) contextInfo:NULL];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
|
- (void) alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo {
|
||||||
if([menuItem action] == [MPActionHelper actionOfType:MPActionEmptyTrash]) {
|
if(returnCode == NSAlertFirstButtonReturn) {
|
||||||
|
[self _emptyTrash];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)validateUserInterfaceItem:(id<NSValidatedUserInterfaceItem>)anItem {
|
||||||
|
if([anItem action] == [MPActionHelper actionOfType:MPActionEmptyTrash]) {
|
||||||
BOOL hasGroups = [self.trash.groups count] > 0;
|
BOOL hasGroups = [self.trash.groups count] > 0;
|
||||||
BOOL hasEntries = [self.trash.entries count] > 0;
|
BOOL hasEntries = [self.trash.entries count] > 0;
|
||||||
return (hasEntries || hasGroups);
|
return (hasEntries || hasGroups);
|
||||||
}
|
}
|
||||||
return YES;
|
|
||||||
|
return [super validateUserInterfaceItem:anItem];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark Private
|
#pragma mark Private
|
||||||
|
- (void)_updateIsSecured {
|
||||||
|
BOOL securePassword = ([self.password length] > 0);
|
||||||
|
BOOL secureKey = (nil != self.key);
|
||||||
|
self.hasPasswordOrKey = (secureKey || securePassword);
|
||||||
|
}
|
||||||
|
|
||||||
- (void)_cleanupLock {
|
- (void)_cleanupLock {
|
||||||
if(_didLockFile) {
|
if(_didLockFile) {
|
||||||
[[NSFileManager defaultManager] removeItemAtURL:_lockFileURL error:nil];
|
[[NSFileManager defaultManager] removeItemAtURL:_lockFileURL error:nil];
|
||||||
@@ -477,7 +511,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
|||||||
}
|
}
|
||||||
else if(self.version == MPDatabaseVersion4) {
|
else if(self.version == MPDatabaseVersion4) {
|
||||||
KdbGroup *trash = [self.tree createGroup:self.tree.root];
|
KdbGroup *trash = [self.tree createGroup:self.tree.root];
|
||||||
trash.name = NSLocalizedString(@"TRASH_GROUP", @"Name for the trash group");
|
trash.name = NSLocalizedString(@"TRASH", @"Name for the trash group");
|
||||||
trash.image = MPIconTrash;
|
trash.image = MPIconTrash;
|
||||||
[self.tree.root insertObject:trash inGroupsAtIndex:[self.tree.root.groups count]];
|
[self.tree.root insertObject:trash inGroupsAtIndex:[self.tree.root.groups count]];
|
||||||
self.treeV4.recycleBinUuid = ((Kdb4Group *)trash).uuid;
|
self.treeV4.recycleBinUuid = ((Kdb4Group *)trash).uuid;
|
||||||
@@ -489,4 +523,31 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)_emptyTrash {
|
||||||
|
for(KdbEntry *entry in [self.trash childEntries]) {
|
||||||
|
[[self undoManager] removeAllActionsWithTarget:entry];
|
||||||
|
}
|
||||||
|
for(KdbGroup *group in [self.trash childGroups]) {
|
||||||
|
[[self undoManager] removeAllActionsWithTarget:group];
|
||||||
|
}
|
||||||
|
[self _cleanTrashedBinaries];
|
||||||
|
[self.trash clear];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)_cleanTrashedBinaries {
|
||||||
|
NSMutableSet *clearKeys = [[NSMutableSet alloc] initWithCapacity:20];
|
||||||
|
NSMutableArray *clearBinaries = [[NSMutableArray alloc] initWithCapacity:[self.treeV4.binaries count]];
|
||||||
|
for(Kdb4Entry *entry in [self.trash childEntries]) {
|
||||||
|
for(BinaryRef *binaryRef in entry.binaries) {
|
||||||
|
[clearKeys addObject:@(binaryRef.ref)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(Binary *binary in self.treeV4.binaries) {
|
||||||
|
if([clearKeys containsObject:@(binary.binaryId)]) {
|
||||||
|
[clearBinaries addObject:binary];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[self.treeV4.binaries removeObjectsInArray:clearBinaries];
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -1,128 +0,0 @@
|
|||||||
//
|
|
||||||
// MPDocumentSettingsWindowController.m
|
|
||||||
// MacPass
|
|
||||||
//
|
|
||||||
// Created by Michael Starke on 26.06.13.
|
|
||||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "MPDocumentSettingsWindowController.h"
|
|
||||||
#import "MPDocument.h"
|
|
||||||
#import "MPDocumentWindowController.h"
|
|
||||||
#import "MPDatabaseVersion.h"
|
|
||||||
#import "MPIconHelper.h"
|
|
||||||
|
|
||||||
#import "Kdb.h"
|
|
||||||
#import "Kdb4Node.h"
|
|
||||||
#import "KdbGroup+MPAdditions.h"
|
|
||||||
|
|
||||||
@interface MPDocumentSettingsWindowController () {
|
|
||||||
MPDocument *_document;
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation MPDocumentSettingsWindowController
|
|
||||||
|
|
||||||
- (id)init {
|
|
||||||
return [self initWithDocument:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (id)initWithDocument:(MPDocument *)document {
|
|
||||||
self = [super initWithWindowNibName:@"DocumentSettingsWindow"];
|
|
||||||
if(self) {
|
|
||||||
_document = document;
|
|
||||||
}
|
|
||||||
return self;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)windowDidLoad {
|
|
||||||
[super windowDidLoad];
|
|
||||||
|
|
||||||
NSAssert(_document != nil, @"Document needs to be present");
|
|
||||||
|
|
||||||
Kdb4Tree *tree = _document.treeV4;
|
|
||||||
if( tree ) {
|
|
||||||
[self _setupDatabase:tree];
|
|
||||||
[self _setupProtectionTab:tree];
|
|
||||||
[self _setupAdvancedTab:tree];
|
|
||||||
[self _setupPasswordTab:tree];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Switch to KdbV3 View
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (IBAction)close:(id)sender {
|
|
||||||
[NSApp endSheet:[self window]];
|
|
||||||
[[self window] orderOut:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)update {
|
|
||||||
/* Update all stuff that might have changed */
|
|
||||||
Kdb4Tree *tree = _document.treeV4;
|
|
||||||
if(tree) {
|
|
||||||
[self _updateTrashFolders:tree];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma mark Private Helper
|
|
||||||
- (void)_setupDatabase:(Kdb4Tree *)tree {
|
|
||||||
[self.databaseNameTextField bind:NSValueBinding toObject:tree withKeyPath:@"databaseName" options:nil];
|
|
||||||
[self.databaseDescriptionTextView bind:NSValueBinding toObject:tree withKeyPath:@"databaseDescription" options:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)_setupProtectionTab:(Kdb4Tree *)tree {
|
|
||||||
[self.protectNotesCheckButton bind:NSValueBinding toObject:tree withKeyPath:@"protectNotes" options:nil];
|
|
||||||
[self.protectPasswortCheckButton bind:NSValueBinding toObject:tree withKeyPath:@"protectPassword" options:nil];
|
|
||||||
[self.protectTitleCheckButton bind:NSValueBinding toObject:tree withKeyPath:@"protectTitle" options:nil];
|
|
||||||
[self.protectURLCheckButton bind:NSValueBinding toObject:tree withKeyPath:@"protectUrl" options:nil];
|
|
||||||
[self.protectUserNameCheckButton bind:NSValueBinding toObject:tree withKeyPath:@"protectUserName" options:nil];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)_setupAdvancedTab:(Kdb4Tree *)tree {
|
|
||||||
[self.enableRecycleBinCheckButton bind:NSValueBinding toObject:tree withKeyPath:@"recycleBinEnabled" options:nil];
|
|
||||||
[self.selectRecycleBinGroupPopUpButton bind:NSEnabledBinding toObject:tree withKeyPath:@"recycleBinEnabled" options:nil];
|
|
||||||
[self _updateTrashFolders:tree];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)_setupPasswordTab:(Kdb4Tree *)tree {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
- (void)_didSelectTrashFolder:(id)sender {
|
|
||||||
NSMenuItem *menuItem = sender;
|
|
||||||
/* if we do not get a group, use nil to reset the trash */
|
|
||||||
KdbGroup *group = [menuItem representedObject];
|
|
||||||
[_document useGroupAsTrash:group];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)_updateTrashFolders:(Kdb4Tree *)tree {
|
|
||||||
NSMenu *menu = [self _buildTreeMenu:tree];
|
|
||||||
[self.selectRecycleBinGroupPopUpButton setMenu:menu];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSMenu *)_buildTreeMenu:(Kdb4Tree *)tree {
|
|
||||||
NSMenu *menu = [[NSMenu alloc] init];
|
|
||||||
|
|
||||||
for(Kdb4Group *group in tree.root.groups) {
|
|
||||||
NSMenuItem *groupItem = [[NSMenuItem alloc] init];
|
|
||||||
[groupItem setImage:group.icon];
|
|
||||||
[groupItem setTitle:group.name];
|
|
||||||
[groupItem setAction:@selector(_didSelectTrashFolder:)];
|
|
||||||
[groupItem setTarget:self];
|
|
||||||
[groupItem setRepresentedObject:group];
|
|
||||||
if([group.uuid isEqual:tree.recycleBinUuid]) {
|
|
||||||
[groupItem setState:NSOnState];
|
|
||||||
}
|
|
||||||
[menu addItem:groupItem];
|
|
||||||
}
|
|
||||||
NSMenuItem *selectItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SELECT_RECYCLEBIN", @"Menu item if no reycleBin is selected") action:NULL keyEquivalent:@""];
|
|
||||||
[selectItem setAction:@selector(_didSelectTrashFolder:)];
|
|
||||||
[selectItem setTarget:self];
|
|
||||||
[menu insertItem:selectItem atIndex:0];
|
|
||||||
|
|
||||||
return menu;
|
|
||||||
}
|
|
||||||
@end
|
|
||||||
@@ -11,7 +11,6 @@
|
|||||||
@class MPViewController;
|
@class MPViewController;
|
||||||
@class MPEntryViewController;
|
@class MPEntryViewController;
|
||||||
@class MPInspectorViewController;
|
@class MPInspectorViewController;
|
||||||
@class MPPasswordEditViewController;
|
|
||||||
@class MPPasswordInputController;
|
@class MPPasswordInputController;
|
||||||
@class MPOutlineViewController;
|
@class MPOutlineViewController;
|
||||||
|
|
||||||
@@ -23,7 +22,6 @@ APPKIT_EXTERN NSString *const MPCurrentItemChangedNotification;
|
|||||||
@interface MPDocumentWindowController : NSWindowController <NSWindowDelegate>
|
@interface MPDocumentWindowController : NSWindowController <NSWindowDelegate>
|
||||||
|
|
||||||
@property (readonly, strong) MPPasswordInputController *passwordInputController;
|
@property (readonly, strong) MPPasswordInputController *passwordInputController;
|
||||||
@property (readonly, strong) MPPasswordEditViewController *passwordEditController;
|
|
||||||
@property (readonly, strong) MPEntryViewController *entryViewController;
|
@property (readonly, strong) MPEntryViewController *entryViewController;
|
||||||
@property (readonly, strong) MPOutlineViewController *outlineViewController;
|
@property (readonly, strong) MPOutlineViewController *outlineViewController;
|
||||||
@property (readonly, strong) MPInspectorViewController *inspectorViewController;
|
@property (readonly, strong) MPInspectorViewController *inspectorViewController;
|
||||||
@@ -34,14 +32,21 @@ APPKIT_EXTERN NSString *const MPCurrentItemChangedNotification;
|
|||||||
@property (readonly, unsafe_unretained) KdbGroup *currentGroup;
|
@property (readonly, unsafe_unretained) KdbGroup *currentGroup;
|
||||||
@property (readonly, unsafe_unretained) KdbEntry *currentEntry;
|
@property (readonly, unsafe_unretained) KdbEntry *currentEntry;
|
||||||
|
|
||||||
|
/**
|
||||||
|
@param action The action that should be validatet
|
||||||
|
@param item The item that the action affects. Pass nil to fall back for default item
|
||||||
|
@returns YES if the action is valid, NO otherwise
|
||||||
|
*/
|
||||||
|
- (BOOL)validateAction:(SEL)action forItem:(id)item;
|
||||||
|
|
||||||
- (void)showEntries;
|
- (void)showEntries;
|
||||||
- (void)showPasswordInput;
|
- (void)showPasswordInput;
|
||||||
- (void)performFindPanelAction:(id)sender;
|
- (void)performFindPanelAction:(id)sender;
|
||||||
- (IBAction)editPassword:(id)sender;
|
- (IBAction)editPassword:(id)sender;
|
||||||
- (IBAction)showDocumentSettings:(id)sender;
|
- (IBAction)showDatabaseSettings:(id)sender;
|
||||||
|
- (IBAction)exportDatabase:(id)sender;
|
||||||
|
|
||||||
- (void)lock:(id)sender;
|
- (IBAction)lock:(id)sender;
|
||||||
|
|
||||||
- (void)createGroup:(id)sender;
|
- (void)createGroup:(id)sender;
|
||||||
- (void)toggleInspector:(id)sender;
|
- (void)toggleInspector:(id)sender;
|
||||||
|
|||||||
@@ -10,14 +10,14 @@
|
|||||||
#import "MPDocument.h"
|
#import "MPDocument.h"
|
||||||
#import "MPPasswordInputController.h"
|
#import "MPPasswordInputController.h"
|
||||||
#import "MPEntryViewController.h"
|
#import "MPEntryViewController.h"
|
||||||
#import "MPPasswordEditViewController.h"
|
|
||||||
#import "MPToolbarDelegate.h"
|
#import "MPToolbarDelegate.h"
|
||||||
#import "MPOutlineViewController.h"
|
#import "MPOutlineViewController.h"
|
||||||
#import "MPInspectorViewController.h"
|
#import "MPInspectorViewController.h"
|
||||||
#import "MPAppDelegate.h"
|
#import "MPAppDelegate.h"
|
||||||
#import "MPActionHelper.h"
|
#import "MPActionHelper.h"
|
||||||
#import "MPDocumentSettingsWindowController.h"
|
#import "MPDatabaseSettingsWindowController.h"
|
||||||
#import "MPConstants.h"
|
#import "MPConstants.h"
|
||||||
|
#import "MPSettingsHelper.h"
|
||||||
|
|
||||||
NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCurrentItemChangedNotification";
|
NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCurrentItemChangedNotification";
|
||||||
|
|
||||||
@@ -34,11 +34,10 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
|||||||
@property (unsafe_unretained) KdbEntry *currentEntry;
|
@property (unsafe_unretained) KdbEntry *currentEntry;
|
||||||
|
|
||||||
@property (strong) MPPasswordInputController *passwordInputController;
|
@property (strong) MPPasswordInputController *passwordInputController;
|
||||||
@property (strong) MPPasswordEditViewController *passwordEditController;
|
|
||||||
@property (strong) MPEntryViewController *entryViewController;
|
@property (strong) MPEntryViewController *entryViewController;
|
||||||
@property (strong) MPOutlineViewController *outlineViewController;
|
@property (strong) MPOutlineViewController *outlineViewController;
|
||||||
@property (strong) MPInspectorViewController *inspectorViewController;
|
@property (strong) MPInspectorViewController *inspectorViewController;
|
||||||
@property (strong) MPDocumentSettingsWindowController *documentSettingsWindowController;
|
@property (strong) MPDatabaseSettingsWindowController *documentSettingsWindowController;
|
||||||
|
|
||||||
@property (strong) MPToolbarDelegate *toolbarDelegate;
|
@property (strong) MPToolbarDelegate *toolbarDelegate;
|
||||||
|
|
||||||
@@ -52,7 +51,6 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
|||||||
_firstResponder = nil;
|
_firstResponder = nil;
|
||||||
_toolbarDelegate = [[MPToolbarDelegate alloc] init];
|
_toolbarDelegate = [[MPToolbarDelegate alloc] init];
|
||||||
_outlineViewController = [[MPOutlineViewController alloc] init];
|
_outlineViewController = [[MPOutlineViewController alloc] init];
|
||||||
_passwordEditController = [[MPPasswordEditViewController alloc] init];
|
|
||||||
_entryViewController = [[MPEntryViewController alloc] init];
|
_entryViewController = [[MPEntryViewController alloc] init];
|
||||||
_inspectorViewController = [[MPInspectorViewController alloc] init];
|
_inspectorViewController = [[MPInspectorViewController alloc] init];
|
||||||
_currentItem = nil;
|
_currentItem = nil;
|
||||||
@@ -65,9 +63,6 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
|||||||
|
|
||||||
- (void)dealloc {
|
- (void)dealloc {
|
||||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark View Handling
|
#pragma mark View Handling
|
||||||
@@ -97,15 +92,22 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
|||||||
[_splitView setHoldingPriority:NSLayoutPriorityDefaultLow+2 forSubviewAtIndex:0];
|
[_splitView setHoldingPriority:NSLayoutPriorityDefaultLow+2 forSubviewAtIndex:0];
|
||||||
[_splitView setHoldingPriority:NSLayoutPriorityDefaultLow+1 forSubviewAtIndex:2];
|
[_splitView setHoldingPriority:NSLayoutPriorityDefaultLow+1 forSubviewAtIndex:2];
|
||||||
|
|
||||||
|
BOOL showInspector = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyShowInspector];
|
||||||
|
if(!showInspector) {
|
||||||
|
[inspectorView removeFromSuperview];
|
||||||
|
}
|
||||||
|
|
||||||
[[self window] setDelegate:self];
|
[[self window] setDelegate:self];
|
||||||
|
|
||||||
MPDocument *document = [self document];
|
MPDocument *document = [self document];
|
||||||
if(!document.isDecrypted) {
|
if(!document.decrypted) {
|
||||||
[self showPasswordInput];
|
[self showPasswordInput];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
[self showEntries];
|
[self showEntries];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[_splitView setAutosaveName:@"SplitView"];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)_setContentViewController:(MPViewController *)viewController {
|
- (void)_setContentViewController:(MPViewController *)viewController {
|
||||||
@@ -165,34 +167,93 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
|||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark Actions
|
#pragma mark Actions
|
||||||
|
- (void)exportDatabase:(id)sender {
|
||||||
|
NSSavePanel *savePanel = [NSSavePanel savePanel];
|
||||||
|
[savePanel setAllowsOtherFileTypes:YES];
|
||||||
|
[savePanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) {
|
||||||
|
if(result == NSFileHandlingPanelOKButton) {
|
||||||
|
[[self document] writeXMLToURL:savePanel.URL];
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
}
|
||||||
- (void)performFindPanelAction:(id)sender {
|
- (void)performFindPanelAction:(id)sender {
|
||||||
[self.entryViewController showFilter:sender];
|
[self.entryViewController showFilter:sender];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
|
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
|
||||||
MPDocument *document = [self document];
|
MPDocument *document = [self document];
|
||||||
return !( document.isLocked || document.isReadOnly );
|
SEL itemAction = [menuItem action];
|
||||||
|
if(itemAction == @selector(showDatabaseSettings:)
|
||||||
|
|| itemAction == @selector(editPassword:)) {
|
||||||
|
return document.decrypted && !document.isLocked;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL enabled = YES;
|
||||||
|
if(itemAction == @selector(exportDatabase:)) {
|
||||||
|
enabled = (nil != document.treeV4);
|
||||||
|
}
|
||||||
|
if(itemAction == [MPActionHelper actionOfType:MPActionDelete]) {
|
||||||
|
enabled &= (nil != _currentItem) && (_currentItem != document.trash);
|
||||||
|
}
|
||||||
|
|
||||||
|
enabled &= !( !document.decrypted || document.isLocked || document.isReadOnly );
|
||||||
|
return enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem {
|
- (BOOL)validateToolbarItem:(NSToolbarItem *)theItem {
|
||||||
MPDocument *document = [self document];
|
MPDocument *document = [self document];
|
||||||
if(document.isLocked || document.isReadOnly) {
|
if(!document.decrypted || document.isLocked || document.isReadOnly) {
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
SEL itemAction = [theItem action];
|
MPActionType actionType = [MPActionHelper typeForAction:[theItem action]];
|
||||||
if( itemAction == [MPActionHelper actionOfType:MPActionLock]) {
|
switch (actionType) {
|
||||||
return document.isSecured;
|
case MPActionAddGroup:
|
||||||
}
|
case MPActionAddEntry:
|
||||||
if(itemAction == [MPActionHelper actionOfType:MPActionAddEntry]) {
|
|
||||||
return (nil != _outlineViewController.selectedGroup);
|
return (nil != _outlineViewController.selectedGroup);
|
||||||
|
case MPActionDelete: {
|
||||||
|
BOOL valid = (nil != _currentItem);
|
||||||
|
valid &= (_currentItem != document.trash);
|
||||||
|
valid &= ![document isItemTrashed:_currentItem];
|
||||||
|
return valid;
|
||||||
}
|
}
|
||||||
if(itemAction == [MPActionHelper actionOfType:MPActionDelete]) {
|
case MPActionLock:
|
||||||
return (nil != _currentItem);
|
return document.hasPasswordOrKey;
|
||||||
}
|
|
||||||
if(itemAction == [MPActionHelper actionOfType:MPActionToggleInspector]) {
|
|
||||||
return (nil != [_splitView superview]);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
case MPActionToggleInspector:
|
||||||
|
return (nil != [_splitView superview]);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)validateAction:(SEL)action forItem:(id)item {
|
||||||
|
MPDocument *document = [self document];
|
||||||
|
if(!document.decrypted || document.isLocked || document.isReadOnly) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
MPActionType actionType = [MPActionHelper typeForAction:action];
|
||||||
|
switch (actionType) {
|
||||||
|
case MPActionAddGroup:
|
||||||
|
case MPActionAddEntry:
|
||||||
|
// test if Group is in trash
|
||||||
|
return (nil != _outlineViewController.selectedGroup);
|
||||||
|
case MPActionDelete: {
|
||||||
|
BOOL valid = (nil != _currentItem);
|
||||||
|
valid &= (_currentItem != document.trash);
|
||||||
|
valid &= ![document isItemTrashed:_currentItem];
|
||||||
|
return valid;
|
||||||
|
}
|
||||||
|
case MPActionLock:
|
||||||
|
return document.hasPasswordOrKey;
|
||||||
|
|
||||||
|
case MPActionToggleInspector:
|
||||||
|
return (nil != [_splitView superview]);
|
||||||
|
|
||||||
|
default:
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -205,23 +266,16 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)editPassword:(id)sender {
|
- (void)editPassword:(id)sender {
|
||||||
if(!self.passwordEditController) {
|
[self _showDatabaseSetting:MPDatabaseSettingsTabPassword];
|
||||||
_passwordEditController = [[MPPasswordEditViewController alloc] init];
|
|
||||||
}
|
|
||||||
[self _setContentViewController:self.passwordEditController];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)showDocumentSettings:(id)sender {
|
- (void)showDatabaseSettings:(id)sender {
|
||||||
if(!self.documentSettingsWindowController) {
|
[self _showDatabaseSetting:MPDatabaseSettingsTabGeneral];
|
||||||
_documentSettingsWindowController = [[MPDocumentSettingsWindowController alloc] initWithDocument:[self document]];
|
|
||||||
}
|
|
||||||
[_documentSettingsWindowController update];
|
|
||||||
[[NSApplication sharedApplication] beginSheet:[_documentSettingsWindowController window] modalForWindow:[self window] modalDelegate:nil didEndSelector:NULL contextInfo:NULL];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)lock:(id)sender {
|
- (IBAction)lock:(id)sender {
|
||||||
MPDocument *document = [self document];
|
MPDocument *document = [self document];
|
||||||
if(!document.isSecured) {
|
if(!document.hasPasswordOrKey) {
|
||||||
return; // Document needs a password/keyfile to be lockable
|
return; // Document needs a password/keyfile to be lockable
|
||||||
}
|
}
|
||||||
if(document.isLocked) {
|
if(document.isLocked) {
|
||||||
@@ -241,18 +295,21 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
|||||||
|
|
||||||
- (void)toggleInspector:(id)sender {
|
- (void)toggleInspector:(id)sender {
|
||||||
NSView *inspectorView = [_inspectorViewController view];
|
NSView *inspectorView = [_inspectorViewController view];
|
||||||
|
BOOL inspectorVisible = NO;
|
||||||
if([inspectorView superview]) {
|
if([inspectorView superview]) {
|
||||||
//[inspectorView animator]
|
//[inspectorView animator]
|
||||||
[inspectorView removeFromSuperview];
|
[inspectorView removeFromSuperview];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Remove contraint on view removal.
|
// Remove contraint on view removal.
|
||||||
|
inspectorVisible = YES;
|
||||||
[_splitView addSubview:inspectorView];
|
[_splitView addSubview:inspectorView];
|
||||||
[_splitView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[inspectorView(>=200)]"
|
[_splitView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[inspectorView(>=200)]"
|
||||||
options:0
|
options:0
|
||||||
metrics:nil
|
metrics:nil
|
||||||
views:NSDictionaryOfVariableBindings(inspectorView)]];
|
views:NSDictionaryOfVariableBindings(inspectorView)]];
|
||||||
}
|
}
|
||||||
|
[[NSUserDefaults standardUserDefaults] setBool:inspectorVisible forKey:kMPSettingsKeyShowInspector];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)showEntries {
|
- (void)showEntries {
|
||||||
@@ -264,7 +321,7 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
|||||||
[[contentView subviews][0] removeFromSuperviewWithoutNeedingDisplay];
|
[[contentView subviews][0] removeFromSuperviewWithoutNeedingDisplay];
|
||||||
}
|
}
|
||||||
[contentView addSubview:_splitView];
|
[contentView addSubview:_splitView];
|
||||||
[_splitView adjustSubviews];
|
//[_splitView adjustSubviews];
|
||||||
NSView *outlineView = [_outlineViewController view];
|
NSView *outlineView = [_outlineViewController view];
|
||||||
NSView *inspectorView = [_inspectorViewController view];
|
NSView *inspectorView = [_inspectorViewController view];
|
||||||
NSView *entryView = [_entryViewController view];
|
NSView *entryView = [_entryViewController view];
|
||||||
@@ -310,7 +367,7 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
|||||||
if(removeInspector) {
|
if(removeInspector) {
|
||||||
[inspectorView removeFromSuperview];
|
[inspectorView removeFromSuperview];
|
||||||
}
|
}
|
||||||
[contentView layout];
|
[contentView layoutSubtreeIfNeeded];
|
||||||
|
|
||||||
MPDocument *document = [self document];
|
MPDocument *document = [self document];
|
||||||
document.locked = NO;
|
document.locked = NO;
|
||||||
@@ -321,6 +378,7 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
|||||||
[_outlineViewController showOutline];
|
[_outlineViewController showOutline];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#pragma mark NSWindowDelegate
|
#pragma mark NSWindowDelegate
|
||||||
- (void)windowDidUpdate:(NSNotification *)notification {
|
- (void)windowDidUpdate:(NSNotification *)notification {
|
||||||
id firstResonder = [[self window] firstResponder];
|
id firstResonder = [[self window] firstResponder];
|
||||||
@@ -333,8 +391,24 @@ NSString *const MPCurrentItemChangedNotification = @"com.hicknhack.macpass.MPCur
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)windowDidBecomeKey:(NSNotification *)notification {
|
||||||
|
MPDocument *document = [self document];
|
||||||
|
if(!document.hasPasswordOrKey && document.decrypted) {
|
||||||
|
[self performSelector:@selector(editPassword:) withObject:nil afterDelay:0.5];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark Helper
|
#pragma mark Helper
|
||||||
|
|
||||||
|
- (void)_showDatabaseSetting:(MPDatabaseSettingsTab)tab {
|
||||||
|
if(!self.documentSettingsWindowController) {
|
||||||
|
_documentSettingsWindowController = [[MPDatabaseSettingsWindowController alloc] initWithDocument:[self document]];
|
||||||
|
}
|
||||||
|
[self.documentSettingsWindowController update];
|
||||||
|
[self.documentSettingsWindowController showSettingsTab:tab];
|
||||||
|
[[NSApplication sharedApplication] beginSheet:[self.documentSettingsWindowController window] modalForWindow:[self window] modalDelegate:nil didEndSelector:NULL contextInfo:NULL];
|
||||||
|
}
|
||||||
|
|
||||||
- (NSSearchField *)locateToolbarSearchField {
|
- (NSSearchField *)locateToolbarSearchField {
|
||||||
for(NSToolbarItem *toolbarItem in [[self.window toolbar] items]) {
|
for(NSToolbarItem *toolbarItem in [[self.window toolbar] items]) {
|
||||||
NSView *view = [toolbarItem view];
|
NSView *view = [toolbarItem view];
|
||||||
|
|||||||
16
MacPass/MPEntryMenuDelegate.h
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
//
|
||||||
|
// MPEntryMenuDelegate.h
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Michael Starke on 17.07.13.
|
||||||
|
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
@class MPEntryViewController;
|
||||||
|
|
||||||
|
@interface MPEntryMenuDelegate : NSObject <NSMenuDelegate>
|
||||||
|
|
||||||
|
@property (weak) MPEntryViewController *viewController;
|
||||||
|
|
||||||
|
@end
|
||||||
54
MacPass/MPEntryMenuDelegate.m
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
//
|
||||||
|
// MPEntryMenuDelegate.m
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Michael Starke on 17.07.13.
|
||||||
|
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "MPEntryMenuDelegate.h"
|
||||||
|
#import "MPEntryViewController.h"
|
||||||
|
|
||||||
|
#import "Kdb4Node.h"
|
||||||
|
|
||||||
|
static NSUInteger const kMPCustomFieldMenuItem = 1000;
|
||||||
|
static NSUInteger const kMPAttachmentsMenuItem = 2000;
|
||||||
|
|
||||||
|
@implementation MPEntryMenuDelegate
|
||||||
|
|
||||||
|
- (void)menuNeedsUpdate:(NSMenu *)menu {
|
||||||
|
NSMenuItem *fieldsMenu = [menu itemWithTag:kMPCustomFieldMenuItem];
|
||||||
|
NSMenuItem *attachmentsMenu = [menu itemWithTag:kMPAttachmentsMenuItem];
|
||||||
|
if(fieldsMenu) {
|
||||||
|
[menu removeItem:fieldsMenu];
|
||||||
|
}
|
||||||
|
if(attachmentsMenu) {
|
||||||
|
[menu removeItem:attachmentsMenu];
|
||||||
|
}
|
||||||
|
|
||||||
|
NSMenuItem *lastItem = [[menu itemArray] lastObject];
|
||||||
|
if([lastItem isSeparatorItem]) {
|
||||||
|
[menu removeItem:lastItem];
|
||||||
|
}
|
||||||
|
|
||||||
|
if([self.viewController.selectedEntry isKindOfClass:[Kdb4Entry class]]) {
|
||||||
|
Kdb4Entry *entry = (Kdb4Entry *)self.viewController.selectedEntry;
|
||||||
|
if([entry.stringFields count] > 0) {
|
||||||
|
[menu addItem:[NSMenuItem separatorItem]];
|
||||||
|
NSMenuItem *customFieldsItem = [[NSMenuItem alloc] init];
|
||||||
|
NSMenu *submenu = [[NSMenu alloc] initWithTitle:@"Fields"];
|
||||||
|
[customFieldsItem setTitle:NSLocalizedString(@"COPY_CUSTOM_FIELDS", "Submenu to Copy custom fields")];
|
||||||
|
[customFieldsItem setTag:kMPCustomFieldMenuItem];
|
||||||
|
for (StringField *field in entry.stringFields) {
|
||||||
|
NSString *title = [NSString stringWithFormat:NSLocalizedString(@"COPY_FIELD_%@", "Mask for title to copy field value"), field.key];
|
||||||
|
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:title action:@selector(copyCustomField:) keyEquivalent:@""];
|
||||||
|
[item setTag:[entry.stringFields indexOfObject:field]];
|
||||||
|
[submenu addItem:item];
|
||||||
|
}
|
||||||
|
[customFieldsItem setSubmenu:submenu];
|
||||||
|
[menu addItem:customFieldsItem];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -48,9 +48,11 @@ typedef NS_ENUM( NSUInteger, MPCopyContentTypeTag) {
|
|||||||
/* Copy/Paste */
|
/* Copy/Paste */
|
||||||
- (void)copyUsername:(id)sender;
|
- (void)copyUsername:(id)sender;
|
||||||
- (void)copyPassword:(id)sender;
|
- (void)copyPassword:(id)sender;
|
||||||
|
- (void)copyCustomField:(id)sender;
|
||||||
- (void)copyURL:(id)sender;
|
- (void)copyURL:(id)sender;
|
||||||
- (void)openURL:(id)sender;
|
- (void)openURL:(id)sender;
|
||||||
|
|
||||||
|
|
||||||
/* Entry Handling*/
|
/* Entry Handling*/
|
||||||
- (void)deleteNode:(id)sender;
|
- (void)deleteNode:(id)sender;
|
||||||
|
|
||||||
|
|||||||
@@ -20,10 +20,12 @@
|
|||||||
#import "MPConstants.h"
|
#import "MPConstants.h"
|
||||||
#import "MPEntryTableDataSource.h"
|
#import "MPEntryTableDataSource.h"
|
||||||
#import "MPStringLengthValueTransformer.h"
|
#import "MPStringLengthValueTransformer.h"
|
||||||
|
#import "MPEntryMenuDelegate.h"
|
||||||
|
|
||||||
#import "HNHTableHeaderCell.h"
|
#import "HNHTableHeaderCell.h"
|
||||||
#import "HNHGradientView.h"
|
#import "HNHGradientView.h"
|
||||||
|
|
||||||
|
#import "Kdb4Node.h"
|
||||||
#import "KdbGroup+MPTreeTools.h"
|
#import "KdbGroup+MPTreeTools.h"
|
||||||
#import "KdbGroup+Undo.h"
|
#import "KdbGroup+Undo.h"
|
||||||
#import "KdbEntry+Undo.h"
|
#import "KdbEntry+Undo.h"
|
||||||
@@ -43,6 +45,7 @@ typedef NS_ENUM(NSUInteger,MPOVerlayInfoType) {
|
|||||||
MPOverlayInfoPassword,
|
MPOverlayInfoPassword,
|
||||||
MPOverlayInfoUsername,
|
MPOverlayInfoUsername,
|
||||||
MPOverlayInfoURL,
|
MPOverlayInfoURL,
|
||||||
|
MPOverlayInfoCustom
|
||||||
};
|
};
|
||||||
|
|
||||||
NSString *const MPEntryTableUserNameColumnIdentifier = @"MPUserNameColumnIdentifier";
|
NSString *const MPEntryTableUserNameColumnIdentifier = @"MPUserNameColumnIdentifier";
|
||||||
@@ -59,7 +62,9 @@ NSString *const _toggleFilterURLButton = @"SearchURL";
|
|||||||
NSString *const _toggleFilterTitleButton = @"SearchTitle";
|
NSString *const _toggleFilterTitleButton = @"SearchTitle";
|
||||||
NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
||||||
|
|
||||||
@interface MPEntryViewController ()
|
@interface MPEntryViewController () {
|
||||||
|
MPEntryMenuDelegate *_menuDelegate;
|
||||||
|
}
|
||||||
|
|
||||||
@property (strong) NSArrayController *entryArrayController;
|
@property (strong) NSArrayController *entryArrayController;
|
||||||
@property (strong) NSArray *filteredEntries;
|
@property (strong) NSArray *filteredEntries;
|
||||||
@@ -103,6 +108,9 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
|||||||
_entryArrayController = [[NSArrayController alloc] init];
|
_entryArrayController = [[NSArrayController alloc] init];
|
||||||
_dataSource = [[MPEntryTableDataSource alloc] init];
|
_dataSource = [[MPEntryTableDataSource alloc] init];
|
||||||
_dataSource.viewController = self;
|
_dataSource.viewController = self;
|
||||||
|
_menuDelegate = [[MPEntryMenuDelegate alloc] init];
|
||||||
|
_menuDelegate.viewController = self;
|
||||||
|
|
||||||
_selectedEntry = nil;
|
_selectedEntry = nil;
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
@@ -124,7 +132,7 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
|||||||
[self.entryTable setDoubleAction:@selector(_columnDoubleClick:)];
|
[self.entryTable setDoubleAction:@selector(_columnDoubleClick:)];
|
||||||
[self.entryTable setTarget:self];
|
[self.entryTable setTarget:self];
|
||||||
[self.entryTable setFloatsGroupRows:NO];
|
[self.entryTable setFloatsGroupRows:NO];
|
||||||
[self.entryTable registerForDraggedTypes:@[MPPasteBoardType]];
|
//[self.entryTable registerForDraggedTypes:@[MPPasteBoardType]];
|
||||||
[self _setupEntryMenu];
|
[self _setupEntryMenu];
|
||||||
|
|
||||||
NSTableColumn *parentColumn = [self.entryTable tableColumns][0];
|
NSTableColumn *parentColumn = [self.entryTable tableColumns][0];
|
||||||
@@ -140,6 +148,9 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
|||||||
[passwordColumn setIdentifier:MPEntryTablePasswordColumnIdentifier];
|
[passwordColumn setIdentifier:MPEntryTablePasswordColumnIdentifier];
|
||||||
[urlColumn setIdentifier:MPEntryTableURLColumnIdentifier];
|
[urlColumn setIdentifier:MPEntryTableURLColumnIdentifier];
|
||||||
|
|
||||||
|
[self.entryTable setAutosaveName:@"EntryTable"];
|
||||||
|
[self.entryTable setAutosaveTableColumns:YES];
|
||||||
|
|
||||||
NSSortDescriptor *titleColumSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES selector:@selector(compare:)];
|
NSSortDescriptor *titleColumSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES selector:@selector(compare:)];
|
||||||
NSSortDescriptor *userNameSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"username" ascending:YES selector:@selector(compare:)];
|
NSSortDescriptor *userNameSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"username" ascending:YES selector:@selector(compare:)];
|
||||||
NSSortDescriptor *urlSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"url" ascending:YES selector:@selector(compare:)];
|
NSSortDescriptor *urlSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"url" ascending:YES selector:@selector(compare:)];
|
||||||
@@ -159,6 +170,7 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
|||||||
[self.entryTable setDataSource:_dataSource];
|
[self.entryTable setDataSource:_dataSource];
|
||||||
|
|
||||||
[parentColumn setHidden:YES];
|
[parentColumn setHidden:YES];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setupNotifications:(MPDocumentWindowController *)windowController {
|
- (void)setupNotifications:(MPDocumentWindowController *)windowController {
|
||||||
@@ -395,7 +407,7 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)_copyToPasteboard:(NSString *)data overlayInfo:(MPOVerlayInfoType)overlayInfoType {
|
- (void)_copyToPasteboard:(NSString *)data overlayInfo:(MPOVerlayInfoType)overlayInfoType name:(NSString *)name{
|
||||||
if(data) {
|
if(data) {
|
||||||
[[MPPasteBoardController defaultController] copyObjects:@[ data ]];
|
[[MPPasteBoardController defaultController] copyObjects:@[ data ]];
|
||||||
}
|
}
|
||||||
@@ -416,6 +428,11 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
|||||||
infoImage = [[NSBundle mainBundle] imageForResource:@"09_IdentityTemplate"];
|
infoImage = [[NSBundle mainBundle] imageForResource:@"09_IdentityTemplate"];
|
||||||
infoText = NSLocalizedString(@"COPIED_USERNAME", @"Username was copied to the pasteboard");
|
infoText = NSLocalizedString(@"COPIED_USERNAME", @"Username was copied to the pasteboard");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case MPOverlayInfoCustom:
|
||||||
|
infoImage = [[NSBundle mainBundle] imageForResource:@"00_PasswordTemplate"];
|
||||||
|
infoText = [NSString stringWithFormat:NSLocalizedString(@"COPIED_FIELD_%@", "Field nam that was copied to the pasteboard"), name];
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
[[MPOverlayWindowController sharedController] displayOverlayImage:infoImage label:infoText atView:self.view];
|
[[MPOverlayWindowController sharedController] displayOverlayImage:infoImage label:infoText atView:self.view];
|
||||||
}
|
}
|
||||||
@@ -429,7 +446,9 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
|||||||
for(NSMenuItem *item in items) {
|
for(NSMenuItem *item in items) {
|
||||||
[menu addItem:item];
|
[menu addItem:item];
|
||||||
}
|
}
|
||||||
|
[menu setDelegate:_menuDelegate];
|
||||||
[self.entryTable setMenu:menu];
|
[self.entryTable setMenu:menu];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma makr Action Helper
|
#pragma makr Action Helper
|
||||||
@@ -451,21 +470,32 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
|||||||
- (void)copyPassword:(id)sender {
|
- (void)copyPassword:(id)sender {
|
||||||
KdbEntry *selectedEntry = [self _clickedOrSelectedEntry];
|
KdbEntry *selectedEntry = [self _clickedOrSelectedEntry];
|
||||||
if(selectedEntry) {
|
if(selectedEntry) {
|
||||||
[self _copyToPasteboard:selectedEntry.password overlayInfo:MPOverlayInfoPassword];
|
[self _copyToPasteboard:selectedEntry.password overlayInfo:MPOverlayInfoPassword name:nil];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)copyUsername:(id)sender {
|
- (void)copyUsername:(id)sender {
|
||||||
KdbEntry *selectedEntry = [self _clickedOrSelectedEntry];
|
KdbEntry *selectedEntry = [self _clickedOrSelectedEntry];
|
||||||
if(selectedEntry) {
|
if(selectedEntry) {
|
||||||
[self _copyToPasteboard:selectedEntry.username overlayInfo:MPOverlayInfoUsername];
|
[self _copyToPasteboard:selectedEntry.username overlayInfo:MPOverlayInfoUsername name:nil];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)copyCustomField:(id)sender {
|
||||||
|
KdbEntry *selectedEntry = [self _clickedOrSelectedEntry];
|
||||||
|
if(selectedEntry && [selectedEntry isKindOfClass:[Kdb4Entry class]]) {
|
||||||
|
Kdb4Entry *entry = (Kdb4Entry *)selectedEntry;
|
||||||
|
NSUInteger index = [sender tag];
|
||||||
|
NSAssert((index >= 0) && (index < [entry.stringFields count]), @"Index for custom field needs to be valid");
|
||||||
|
StringField *field = entry.stringFields[index];
|
||||||
|
[self _copyToPasteboard:field.value overlayInfo:MPOverlayInfoCustom name:field.key];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)copyURL:(id)sender {
|
- (void)copyURL:(id)sender {
|
||||||
KdbEntry *selectedEntry = [self _clickedOrSelectedEntry];
|
KdbEntry *selectedEntry = [self _clickedOrSelectedEntry];
|
||||||
if(selectedEntry) {
|
if(selectedEntry) {
|
||||||
[self _copyToPasteboard:selectedEntry.url overlayInfo:MPOverlayInfoURL];
|
[self _copyToPasteboard:selectedEntry.url overlayInfo:MPOverlayInfoURL name:nil];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -480,7 +510,12 @@ NSString *const _toggleFilterUsernameButton = @"SearchUsername";
|
|||||||
- (void)deleteNode:(id)sender {
|
- (void)deleteNode:(id)sender {
|
||||||
KdbEntry *entry =[self _clickedOrSelectedEntry];
|
KdbEntry *entry =[self _clickedOrSelectedEntry];
|
||||||
MPDocument *document = [[self windowController] document];
|
MPDocument *document = [[self windowController] document];
|
||||||
[document group:entry.parent removeEntry:entry];
|
[document deleteEntry:entry];
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark Validation
|
||||||
|
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
|
||||||
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)_toggleFilterSpace:(id)sender {
|
- (void)_toggleFilterSpace:(id)sender {
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
//
|
|
||||||
// MPFirstResonderNotification.h
|
|
||||||
// MacPass
|
|
||||||
//
|
|
||||||
// Created by Michael Starke on 20.06.13.
|
|
||||||
// Copyright (c) 2013 HicknHack Software GmbH. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
|
||||||
|
|
||||||
@protocol MPFirstResonderNotification <NSObject>
|
|
||||||
|
|
||||||
@required
|
|
||||||
- (BOOL)becomeFirstResponder;
|
|
||||||
|
|
||||||
@end
|
|
||||||
@@ -16,5 +16,7 @@
|
|||||||
@property (weak) IBOutlet NSPopUpButton *clearPasteboardTimeoutPopup;
|
@property (weak) IBOutlet NSPopUpButton *clearPasteboardTimeoutPopup;
|
||||||
@property (weak) IBOutlet NSPopUpButton *idleTimeOutPopup;
|
@property (weak) IBOutlet NSPopUpButton *idleTimeOutPopup;
|
||||||
@property (weak) IBOutlet NSButton *lockOnSleepCheckButton;
|
@property (weak) IBOutlet NSButton *lockOnSleepCheckButton;
|
||||||
|
@property (weak) IBOutlet NSButton *reopenLastDatabase;
|
||||||
|
@property (weak) IBOutlet NSButton *createUntitledOnActivation;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -32,6 +32,8 @@ NSString *const MPGeneralSetingsIdentifier = @"GeneralSettingsTab";
|
|||||||
|
|
||||||
- (void)didLoadView {
|
- (void)didLoadView {
|
||||||
NSUserDefaultsController *defaultsController = [NSUserDefaultsController sharedUserDefaultsController];
|
NSUserDefaultsController *defaultsController = [NSUserDefaultsController sharedUserDefaultsController];
|
||||||
|
NSString *reopenLastFilePath = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyReopenLastDatabaseOnLaunch];
|
||||||
|
//NSString *createUntitledOnActivatePaht = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyOpenEmptyDatabaseOnLaunch];
|
||||||
NSString *clearPasteboardKeyPath = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyClearPasteboardOnQuit];
|
NSString *clearPasteboardKeyPath = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyClearPasteboardOnQuit];
|
||||||
NSString *clearPasteboardTimeOutKeyPath = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyPasteboardClearTimeout];
|
NSString *clearPasteboardTimeOutKeyPath = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyPasteboardClearTimeout];
|
||||||
NSString *idleTimeOutKeyPath = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyIdleLockTimeOut];
|
NSString *idleTimeOutKeyPath = [NSString stringWithFormat:@"values.%@", kMPSettingsKeyIdleLockTimeOut];
|
||||||
@@ -40,5 +42,8 @@ NSString *const MPGeneralSetingsIdentifier = @"GeneralSettingsTab";
|
|||||||
[self.clearPasteboardTimeoutPopup bind:NSSelectedTagBinding toObject:defaultsController withKeyPath:clearPasteboardTimeOutKeyPath options:nil];
|
[self.clearPasteboardTimeoutPopup bind:NSSelectedTagBinding toObject:defaultsController withKeyPath:clearPasteboardTimeOutKeyPath options:nil];
|
||||||
[self.lockOnSleepCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:lockOnSleepKeyPath options:nil];
|
[self.lockOnSleepCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:lockOnSleepKeyPath options:nil];
|
||||||
[self.idleTimeOutPopup bind:NSSelectedTagBinding toObject:defaultsController withKeyPath:idleTimeOutKeyPath options:nil];
|
[self.idleTimeOutPopup bind:NSSelectedTagBinding toObject:defaultsController withKeyPath:idleTimeOutKeyPath options:nil];
|
||||||
|
[self.reopenLastDatabase bind:NSValueBinding toObject:defaultsController withKeyPath:reopenLastFilePath options:nil];
|
||||||
|
[self.createUntitledOnActivation setState:NSOffState];
|
||||||
|
//[self.createUntitledOnActivation bind:NSValueBinding toObject:defaultsController withKeyPath:createUntitledOnActivatePaht options:nil];
|
||||||
}
|
}
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -15,13 +15,23 @@ typedef NS_ENUM(NSUInteger, MPIconType) {
|
|||||||
MPIconServer,
|
MPIconServer,
|
||||||
MPIconKlipper,
|
MPIconKlipper,
|
||||||
MPIconLanguages,
|
MPIconLanguages,
|
||||||
|
MPIconBlockDevice,
|
||||||
MPIconNotepad,
|
MPIconNotepad,
|
||||||
MPIconSocket,
|
MPIconSocket,
|
||||||
MPIconIdentity,
|
MPIconIdentity,
|
||||||
MPIconContact,
|
MPIconContact,
|
||||||
MPIconCamera,
|
MPIconCamera,
|
||||||
MPIconTrash,
|
MPIconRemote,
|
||||||
MPIconInfo
|
MPIconKeys,
|
||||||
|
MPIconDisplay = 18,
|
||||||
|
MPIconFileSave = 26,
|
||||||
|
MPIconTrash = 43,
|
||||||
|
MPIconFolder = 48,
|
||||||
|
MPIconPhone = 68,
|
||||||
|
/* Custom Icons not used in Database */
|
||||||
|
MPIconInfo = 1000,
|
||||||
|
MPIconAddFolder,
|
||||||
|
MPIconHardDisk,
|
||||||
};
|
};
|
||||||
|
|
||||||
@interface MPIconHelper : NSObject
|
@interface MPIconHelper : NSObject
|
||||||
|
|||||||
@@ -10,13 +10,17 @@
|
|||||||
|
|
||||||
@implementation MPIconHelper
|
@implementation MPIconHelper
|
||||||
|
|
||||||
|
static NSDictionary *icons;
|
||||||
|
|
||||||
+ (NSImage *)icon:(MPIconType)type {
|
+ (NSImage *)icon:(MPIconType)type {
|
||||||
NSDictionary *icons = [MPIconHelper availableIconNames];
|
if(!icons) {
|
||||||
if(type >= [icons count]) {
|
icons = [MPIconHelper availableIconNames];
|
||||||
return [NSImage imageNamed:NSImageNameActionTemplate];
|
|
||||||
}
|
}
|
||||||
|
if([[icons allKeys] containsObject:@(type)]) {
|
||||||
NSString *imageName = icons[@(type)];
|
NSString *imageName = icons[@(type)];
|
||||||
return [[NSBundle mainBundle] imageForResource:imageName];
|
return [[NSBundle mainBundle] imageForResource:imageName];
|
||||||
|
}
|
||||||
|
return [NSImage imageNamed:NSImageNameActionTemplate];
|
||||||
}
|
}
|
||||||
|
|
||||||
+ (NSArray *)availableIcons {
|
+ (NSArray *)availableIcons {
|
||||||
@@ -30,19 +34,35 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
+ (NSDictionary *)availableIconNames {
|
+ (NSDictionary *)availableIconNames {
|
||||||
NSDictionary *imageNames = @{ @(MPIconKlipper): @"04_KlipperTemplate",
|
NSDictionary *imageNames = @{
|
||||||
@(MPIconLanguages): @"05_LanguagesTemplate",
|
|
||||||
@(MPIconPackageNetwork): @"01_PackageNetworkTemplate",
|
|
||||||
@(MPIconPassword): @"00_PasswordTemplate",
|
@(MPIconPassword): @"00_PasswordTemplate",
|
||||||
@(MPIconServer): @"03_ServerTemplate",
|
@(MPIconPackageNetwork): @"01_PackageNetworkTemplate",
|
||||||
@(MPIconWarning): @"02_MessageBoxWarningTemplate",
|
@(MPIconWarning): @"02_MessageBoxWarningTemplate",
|
||||||
@(MPIconCamera): @"11_CameraTemplate",
|
@(MPIconServer): @"03_ServerTemplate",
|
||||||
@(MPIconContact): @"10_ContactTemplate",
|
@(MPIconKlipper): @"04_KlipperTemplate",
|
||||||
@(MPIconIdentity): @"09_IdentityTemplate",
|
@(MPIconLanguages): @"05_LanguagesTemplate",
|
||||||
|
@(MPIconBlockDevice): @"06_BlockDeviceTemplate",
|
||||||
@(MPIconNotepad): @"07_NotepadTemplate",
|
@(MPIconNotepad): @"07_NotepadTemplate",
|
||||||
@(MPIconSocket): @"08_SocketTemplate",
|
@(MPIconSocket): @"08_SocketTemplate",
|
||||||
|
@(MPIconIdentity): @"09_IdentityTemplate",
|
||||||
|
@(MPIconContact): @"10_ContactTemplate",
|
||||||
|
@(MPIconCamera): @"11_CameraTemplate",
|
||||||
|
@(MPIconRemote): @"12_RemoteTemplate",
|
||||||
|
@(MPIconKeys): @"13_KeysTemplate",
|
||||||
|
|
||||||
|
@(MPIconDisplay): @"18_DisplayTemplate",
|
||||||
|
|
||||||
|
@(MPIconFileSave): @"26_FileSaveTemplate",
|
||||||
|
|
||||||
@(MPIconTrash): @"43_TrashTemplate",
|
@(MPIconTrash): @"43_TrashTemplate",
|
||||||
@(MPIconInfo): @"99_InfoTemplate"
|
|
||||||
|
@(MPIconFolder): @"48_FolderTemplate",
|
||||||
|
|
||||||
|
@(MPIconPhone): @"68_PhoneTemplate",
|
||||||
|
|
||||||
|
@(MPIconInfo): @"99_InfoTemplate",
|
||||||
|
@(MPIconAddFolder): @"99_AddFolderTemplate",
|
||||||
|
@(MPIconHardDisk): @"99_HarddiskTemplate"
|
||||||
};
|
};
|
||||||
return imageNames;
|
return imageNames;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,9 +12,10 @@
|
|||||||
@class KdbEntry;
|
@class KdbEntry;
|
||||||
@class KdbGroup;
|
@class KdbGroup;
|
||||||
@class HNHGradientView;
|
@class HNHGradientView;
|
||||||
|
@class HNHRoundedSecureTextField;
|
||||||
@class MPDocumentWindowController;
|
@class MPDocumentWindowController;
|
||||||
|
|
||||||
@interface MPInspectorViewController : MPViewController <NSPopoverDelegate, NSTableViewDelegate>
|
@interface MPInspectorViewController : MPViewController <NSPopoverDelegate>
|
||||||
|
|
||||||
@property (weak) IBOutlet MPPopupImageView *itemImageView;
|
@property (weak) IBOutlet MPPopupImageView *itemImageView;
|
||||||
@property (weak) IBOutlet NSTextField *itemNameTextfield;
|
@property (weak) IBOutlet NSTextField *itemNameTextfield;
|
||||||
@@ -22,7 +23,7 @@
|
|||||||
@property (weak) IBOutlet NSTextField *titleTextField;
|
@property (weak) IBOutlet NSTextField *titleTextField;
|
||||||
@property (weak) IBOutlet NSTextField *usernameTextField;
|
@property (weak) IBOutlet NSTextField *usernameTextField;
|
||||||
@property (weak) IBOutlet NSTextField *URLTextField;
|
@property (weak) IBOutlet NSTextField *URLTextField;
|
||||||
@property (weak) IBOutlet NSTextField *passwordTextField;
|
@property (weak) IBOutlet HNHRoundedSecureTextField *passwordTextField;
|
||||||
@property (weak) IBOutlet NSTextField *titleOrNameLabel;
|
@property (weak) IBOutlet NSTextField *titleOrNameLabel;
|
||||||
@property (weak) IBOutlet HNHGradientView *bottomBar;
|
@property (weak) IBOutlet HNHGradientView *bottomBar;
|
||||||
@property (weak) IBOutlet NSTextField *createdTextField;
|
@property (weak) IBOutlet NSTextField *createdTextField;
|
||||||
@@ -32,8 +33,12 @@
|
|||||||
@property (weak) IBOutlet NSTableView *customFieldsTableView;
|
@property (weak) IBOutlet NSTableView *customFieldsTableView;
|
||||||
@property (unsafe_unretained) IBOutlet NSTextView *notesTextView;
|
@property (unsafe_unretained) IBOutlet NSTextView *notesTextView;
|
||||||
@property (weak) IBOutlet NSTextField *customFieldsTextField;
|
@property (weak) IBOutlet NSTextField *customFieldsTextField;
|
||||||
|
@property (weak) IBOutlet NSButton *togglePassword;
|
||||||
|
|
||||||
|
|
||||||
|
@property (weak, nonatomic, readonly) KdbEntry *selectedEntry;
|
||||||
|
@property (weak, nonatomic, readonly) KdbGroup *selectedGroup;
|
||||||
|
|
||||||
/* Seperate call to ensure alle registered objects are in place */
|
/* Seperate call to ensure alle registered objects are in place */
|
||||||
- (void)setupNotifications:(MPDocumentWindowController *)windowController;
|
- (void)setupNotifications:(MPDocumentWindowController *)windowController;
|
||||||
|
|
||||||
|
|||||||