model changes are propagates for all changes to an entry

This commit is contained in:
michael starke
2016-08-30 18:34:48 +02:00
parent f3a77bfd2d
commit 7a14506156
21 changed files with 164 additions and 199 deletions

View File

@@ -103,7 +103,6 @@
4C46B88517063A070046109A /* NSString+MPPasswordCreation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C46B88417063A070046109A /* NSString+MPPasswordCreation.m */; }; 4C46B88517063A070046109A /* NSString+MPPasswordCreation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C46B88417063A070046109A /* NSString+MPPasswordCreation.m */; };
4C473A8718AFD85B0073FD2E /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C473A8518AFD7250073FD2E /* XCTest.framework */; }; 4C473A8718AFD85B0073FD2E /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C473A8518AFD7250073FD2E /* XCTest.framework */; };
4C4A100F176286FD00BBF2CA /* MPTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A100E176286FD00BBF2CA /* MPTableView.m */; }; 4C4A100F176286FD00BBF2CA /* MPTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4A100E176286FD00BBF2CA /* MPTableView.m */; };
4C4B5B3A1D759A4E005F329A /* MPDocument+ModelChange.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4B5B391D759A4E005F329A /* MPDocument+ModelChange.m */; };
4C4B728518E4B9B400A1A5D5 /* MPDockTileHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4B728418E4B9B400A1A5D5 /* MPDockTileHelper.m */; }; 4C4B728518E4B9B400A1A5D5 /* MPDockTileHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4B728418E4B9B400A1A5D5 /* MPDockTileHelper.m */; };
4C4B7EE917A45EC6000234C7 /* MPDatePickingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4B7EE717A45EC5000234C7 /* MPDatePickingViewController.m */; }; 4C4B7EE917A45EC6000234C7 /* MPDatePickingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4B7EE717A45EC5000234C7 /* MPDatePickingViewController.m */; };
4C4B7EEE17A467E1000234C7 /* MPGroupInspectorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4B7EEC17A467E1000234C7 /* MPGroupInspectorViewController.m */; }; 4C4B7EEE17A467E1000234C7 /* MPGroupInspectorViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4B7EEC17A467E1000234C7 /* MPGroupInspectorViewController.m */; };
@@ -415,7 +414,6 @@
4C473A8518AFD7250073FD2E /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 4C473A8518AFD7250073FD2E /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
4C4A100D176286FD00BBF2CA /* MPTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPTableView.h; sourceTree = "<group>"; }; 4C4A100D176286FD00BBF2CA /* MPTableView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPTableView.h; sourceTree = "<group>"; };
4C4A100E176286FD00BBF2CA /* MPTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTableView.m; sourceTree = "<group>"; }; 4C4A100E176286FD00BBF2CA /* MPTableView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTableView.m; sourceTree = "<group>"; };
4C4B5B391D759A4E005F329A /* MPDocument+ModelChange.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "MPDocument+ModelChange.m"; sourceTree = "<group>"; };
4C4B728318E4B9B400A1A5D5 /* MPDockTileHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDockTileHelper.h; sourceTree = "<group>"; }; 4C4B728318E4B9B400A1A5D5 /* MPDockTileHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDockTileHelper.h; sourceTree = "<group>"; };
4C4B728418E4B9B400A1A5D5 /* MPDockTileHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDockTileHelper.m; sourceTree = "<group>"; }; 4C4B728418E4B9B400A1A5D5 /* MPDockTileHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDockTileHelper.m; sourceTree = "<group>"; };
4C4B7EE617A45EC5000234C7 /* MPDatePickingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDatePickingViewController.h; sourceTree = "<group>"; }; 4C4B7EE617A45EC5000234C7 /* MPDatePickingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDatePickingViewController.h; sourceTree = "<group>"; };
@@ -500,6 +498,7 @@
4C7615771764C4A40015A1A6 /* de */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.simpleColoring; }; 4C7615771764C4A40015A1A6 /* de */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; lineEnding = 0; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.simpleColoring; };
4C7615781764C4A50015A1A6 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = de; path = de.lproj/Credits.rtf; sourceTree = "<group>"; }; 4C7615781764C4A50015A1A6 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = de; path = de.lproj/Credits.rtf; sourceTree = "<group>"; };
4C7615791764C4A50015A1A6 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 4C7615791764C4A50015A1A6 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = "<group>"; };
4C7679BC1D75E690001F33D6 /* MPModelChangeObserving.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPModelChangeObserving.h; sourceTree = "<group>"; };
4C7714A9176C998F00549F2A /* 43_TrashTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 43_TrashTemplate.pdf; sourceTree = "<group>"; }; 4C7714A9176C998F00549F2A /* 43_TrashTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 43_TrashTemplate.pdf; sourceTree = "<group>"; };
4C77547316E55FE800970E02 /* MPInspectorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPInspectorViewController.h; sourceTree = "<group>"; }; 4C77547316E55FE800970E02 /* MPInspectorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPInspectorViewController.h; sourceTree = "<group>"; };
4C77547416E55FE800970E02 /* MPInspectorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPInspectorViewController.m; sourceTree = "<group>"; }; 4C77547416E55FE800970E02 /* MPInspectorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPInspectorViewController.m; sourceTree = "<group>"; };
@@ -966,7 +965,6 @@
4C1FA07A18231900003A3F8C /* MPDocument+Autotype.m */, 4C1FA07A18231900003A3F8C /* MPDocument+Autotype.m */,
4C15B74518BCA3B1003F8008 /* MPDocument+Search.m */, 4C15B74518BCA3B1003F8008 /* MPDocument+Search.m */,
4C6B7C7C18BE7EB0001D5D77 /* MPDocument+HistoryBrowsing.m */, 4C6B7C7C18BE7EB0001D5D77 /* MPDocument+HistoryBrowsing.m */,
4C4B5B391D759A4E005F329A /* MPDocument+ModelChange.m */,
4C0AF62D195C1F2B009E658D /* MPEntrySearchContext.h */, 4C0AF62D195C1F2B009E658D /* MPEntrySearchContext.h */,
4C0AF62E195C1F2B009E658D /* MPEntrySearchContext.m */, 4C0AF62E195C1F2B009E658D /* MPEntrySearchContext.m */,
4CB44EEE1C972BFD00EE2D60 /* Proxies */, 4CB44EEE1C972BFD00EE2D60 /* Proxies */,
@@ -1297,6 +1295,7 @@
children = ( children = (
4CA0B30D15BCB6FD00654E32 /* MPSettingsTab.h */, 4CA0B30D15BCB6FD00654E32 /* MPSettingsTab.h */,
4C2B0B7419F66F6400E48913 /* MPTargetNodeResolving.h */, 4C2B0B7419F66F6400E48913 /* MPTargetNodeResolving.h */,
4C7679BC1D75E690001F33D6 /* MPModelChangeObserving.h */,
); );
name = Protocolls; name = Protocolls;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -1689,7 +1688,6 @@
4CA0B2FC15BCAF8600654E32 /* MPSettingsWindowController.m in Sources */, 4CA0B2FC15BCAF8600654E32 /* MPSettingsWindowController.m in Sources */,
4C4F72D118DF704400E8D378 /* DDHotKeyTextField.m in Sources */, 4C4F72D118DF704400E8D378 /* DDHotKeyTextField.m in Sources */,
4C83814215BF4677001AE468 /* MPDocumentWindowController.m in Sources */, 4C83814215BF4677001AE468 /* MPDocumentWindowController.m in Sources */,
4C4B5B3A1D759A4E005F329A /* MPDocument+ModelChange.m in Sources */,
4CD034AB1BFE113B003C002C /* MPPluginHost.m in Sources */, 4CD034AB1BFE113B003C002C /* MPPluginHost.m in Sources */,
4C2E382316D1421B00037A9D /* MPIconHelper.m in Sources */, 4C2E382316D1421B00037A9D /* MPIconHelper.m in Sources */,
4C2E382616D1470200037A9D /* MPViewController.m in Sources */, 4C2E382616D1470200037A9D /* MPViewController.m in Sources */,

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="9060" systemVersion="15B42" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="10117" systemVersion="15G31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="9060"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="10117"/>
</dependencies> </dependencies>
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="MPDatabaseSettingsWindowController"> <customObject id="-2" userLabel="File's Owner" customClass="MPDatabaseSettingsWindowController">
@@ -14,10 +14,13 @@
<outlet property="databaseNameTextField" destination="231" id="655"/> <outlet property="databaseNameTextField" destination="231" id="655"/>
<outlet property="defaultUsernameTextField" destination="1730" id="1819"/> <outlet property="defaultUsernameTextField" destination="1730" id="1819"/>
<outlet property="emptyTrashOnQuitCheckButton" destination="539" id="pgQ-AP-HB2"/> <outlet property="emptyTrashOnQuitCheckButton" destination="539" id="pgQ-AP-HB2"/>
<outlet property="enableHistoryCheckButton" destination="531" id="erw-Xj-ENh"/>
<outlet property="enableTrashCheckButton" destination="535" id="UNd-h9-aw3"/> <outlet property="enableTrashCheckButton" destination="535" id="UNd-h9-aw3"/>
<outlet property="encryptionRoundsTextField" destination="1647" id="1773"/> <outlet property="encryptionRoundsTextField" destination="1647" id="1773"/>
<outlet property="enforceKeyChangeCheckButton" destination="upv-b3-vCc" id="JjM-CX-15q"/> <outlet property="enforceKeyChangeCheckButton" destination="upv-b3-vCc" id="JjM-CX-15q"/>
<outlet property="enforceKeyChangeIntervalTextField" destination="VYh-cm-fix" id="aqu-Dm-tlH"/> <outlet property="enforceKeyChangeIntervalTextField" destination="VYh-cm-fix" id="aqu-Dm-tlH"/>
<outlet property="historyMaximumItemsTextField" destination="593" id="NrX-e0-8Dw"/>
<outlet property="historyMaxiumSizeTextField" destination="1273" id="5Fo-Pp-8dY"/>
<outlet property="protectNotesCheckButton" destination="513" id="677"/> <outlet property="protectNotesCheckButton" destination="513" id="677"/>
<outlet property="protectPasswortCheckButton" destination="504" id="662"/> <outlet property="protectPasswortCheckButton" destination="504" id="662"/>
<outlet property="protectTitleCheckButton" destination="463" id="660"/> <outlet property="protectTitleCheckButton" destination="463" id="660"/>
@@ -36,15 +39,14 @@
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="1"> <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="1">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/> <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="196" y="240" width="547" height="335"/> <rect key="contentRect" x="196" y="240" width="547" height="405"/>
<rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/> <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
<view key="contentView" id="2"> <view key="contentView" id="2">
<rect key="frame" x="0.0" y="0.0" width="547" height="335"/> <rect key="frame" x="0.0" y="0.0" width="547" height="405"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<subviews> <subviews>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="288"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="288">
<rect key="frame" x="474" y="13" width="59" height="32"/> <rect key="frame" x="474" y="13" width="59" height="32"/>
<animations/>
<buttonCell key="cell" type="push" title="OK" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="289"> <buttonCell key="cell" type="push" title="OK" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="289">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
@@ -58,7 +60,6 @@ DQ
</button> </button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="956"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="956">
<rect key="frame" x="392" y="13" width="82" height="32"/> <rect key="frame" x="392" y="13" width="82" height="32"/>
<animations/>
<buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="957"> <buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="957">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
@@ -71,8 +72,7 @@ Gw
</connections> </connections>
</button> </button>
<tabView translatesAutoresizingMaskIntoConstraints="NO" id="357"> <tabView translatesAutoresizingMaskIntoConstraints="NO" id="357">
<rect key="frame" x="13" y="41" width="521" height="288"/> <rect key="frame" x="13" y="41" width="521" height="358"/>
<animations/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<tabViewItems> <tabViewItems>
<tabViewItem label="General" identifier="1" id="358"> <tabViewItem label="General" identifier="1" id="358">
@@ -85,7 +85,6 @@ Gw
<constraints> <constraints>
<constraint firstAttribute="width" constant="280" id="cra-uC-nCv"/> <constraint firstAttribute="width" constant="280" id="cra-uC-nCv"/>
</constraints> </constraints>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="232"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="232">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
@@ -94,7 +93,6 @@ Gw
</textField> </textField>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="256"> <textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="256">
<rect key="frame" x="115" y="175" width="80" height="17"/> <rect key="frame" x="115" y="175" width="80" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Description:" id="257"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Description:" id="257">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -103,7 +101,6 @@ Gw
</textField> </textField>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="189"> <textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="189">
<rect key="frame" x="90" y="203" width="105" height="17"/> <rect key="frame" x="90" y="203" width="105" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Database name:" id="190"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Database name:" id="190">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -112,7 +109,6 @@ Gw
</textField> </textField>
<popUpButton verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1394"> <popUpButton verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1394">
<rect key="frame" x="199" y="48" width="67" height="26"/> <rect key="frame" x="199" y="48" width="67" height="26"/>
<animations/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="1395"> <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="1395">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/> <font key="font" metaFont="menu"/>
@@ -126,7 +122,6 @@ Gw
</popUpButton> </popUpButton>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1404"> <textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1404">
<rect key="frame" x="105" y="53" width="90" height="17"/> <rect key="frame" x="105" y="53" width="90" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Compression:" id="1405"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Compression:" id="1405">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -135,7 +130,6 @@ Gw
</textField> </textField>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1434"> <textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1434">
<rect key="frame" x="152" y="23" width="43" height="17"/> <rect key="frame" x="152" y="23" width="43" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Color:" id="1435"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Color:" id="1435">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -148,7 +142,6 @@ Gw
<constraint firstAttribute="width" constant="44" id="XBF-V3-71G"/> <constraint firstAttribute="width" constant="44" id="XBF-V3-71G"/>
<constraint firstAttribute="height" constant="23" id="fgN-h5-Mr8"/> <constraint firstAttribute="height" constant="23" id="fgN-h5-Mr8"/>
</constraints> </constraints>
<animations/>
<color key="color" red="0.05813049898" green="0.055541899059999997" blue="1" alpha="1" colorSpace="calibratedRGB"/> <color key="color" red="0.05813049898" green="0.055541899059999997" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</colorWell> </colorWell>
<scrollView horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1530"> <scrollView horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1530">
@@ -160,7 +153,6 @@ Gw
<textView importsGraphics="NO" findStyle="panel" continuousSpellChecking="YES" allowsUndo="YES" usesRuler="YES" usesFontPanel="YES" verticallyResizable="YES" allowsNonContiguousLayout="YES" spellingCorrection="YES" smartInsertDelete="YES" id="1531"> <textView importsGraphics="NO" findStyle="panel" continuousSpellChecking="YES" allowsUndo="YES" usesRuler="YES" usesFontPanel="YES" verticallyResizable="YES" allowsNonContiguousLayout="YES" spellingCorrection="YES" smartInsertDelete="YES" id="1531">
<rect key="frame" x="0.0" y="0.0" width="278" height="98"/> <rect key="frame" x="0.0" y="0.0" width="278" height="98"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<size key="minSize" width="278" height="98"/> <size key="minSize" width="278" height="98"/>
<size key="maxSize" width="463" height="10000000"/> <size key="maxSize" width="463" height="10000000"/>
@@ -169,23 +161,19 @@ Gw
<size key="maxSize" width="463" height="10000000"/> <size key="maxSize" width="463" height="10000000"/>
</textView> </textView>
</subviews> </subviews>
<animations/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</clipView> </clipView>
<constraints> <constraints>
<constraint firstAttribute="height" constant="100" id="8fE-cP-ksD"/> <constraint firstAttribute="height" constant="100" id="8fE-cP-ksD"/>
<constraint firstAttribute="width" constant="280" id="J06-kE-yVi"/> <constraint firstAttribute="width" constant="280" id="J06-kE-yVi"/>
</constraints> </constraints>
<animations/>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="1532"> <scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="1532">
<rect key="frame" x="-100" y="-100" width="87" height="18"/> <rect key="frame" x="-100" y="-100" width="87" height="18"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<animations/>
</scroller> </scroller>
<scroller key="verticalScroller" verticalHuggingPriority="750" horizontal="NO" id="1533"> <scroller key="verticalScroller" verticalHuggingPriority="750" horizontal="NO" id="1533">
<rect key="frame" x="263" y="1" width="16" height="98"/> <rect key="frame" x="263" y="1" width="16" height="98"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<animations/>
</scroller> </scroller>
</scrollView> </scrollView>
</subviews> </subviews>
@@ -212,72 +200,65 @@ Gw
<constraint firstItem="231" firstAttribute="leading" secondItem="189" secondAttribute="trailing" constant="8" symbolic="YES" id="uMg-uh-Qq6"/> <constraint firstItem="231" firstAttribute="leading" secondItem="189" secondAttribute="trailing" constant="8" symbolic="YES" id="uMg-uh-Qq6"/>
<constraint firstItem="256" firstAttribute="top" secondItem="189" secondAttribute="bottom" constant="11" id="z3y-bc-AMm"/> <constraint firstItem="256" firstAttribute="top" secondItem="189" secondAttribute="bottom" constant="11" id="z3y-bc-AMm"/>
</constraints> </constraints>
<animations/>
</view> </view>
</tabViewItem> </tabViewItem>
<tabViewItem label="Security" identifier="" id="370"> <tabViewItem label="Security" identifier="" id="370">
<view key="view" id="371"> <view key="view" misplaced="YES" id="371">
<rect key="frame" x="10" y="33" width="501" height="242"/> <rect key="frame" x="10" y="33" width="501" height="312"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<button misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="463"> <button misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="463">
<rect key="frame" x="172" y="206" width="98" height="18"/> <rect key="frame" x="172" y="276" width="98" height="18"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="14" id="ioE-LF-mdV"/> <constraint firstAttribute="height" constant="14" id="ioE-LF-mdV"/>
</constraints> </constraints>
<animations/>
<buttonCell key="cell" type="check" title="Protect Title" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="464"> <buttonCell key="cell" type="check" title="Protect Title" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="464">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<button misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="476"> <button misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="476">
<rect key="frame" x="172" y="186" width="133" height="18"/> <rect key="frame" x="172" y="256" width="133" height="18"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="14" id="muU-FJ-1tF"/> <constraint firstAttribute="height" constant="14" id="muU-FJ-1tF"/>
</constraints> </constraints>
<animations/>
<buttonCell key="cell" type="check" title="Protect Username" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="477"> <buttonCell key="cell" type="check" title="Protect Username" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="477">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<button misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="504"> <button misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="504">
<rect key="frame" x="172" y="166" width="129" height="18"/> <rect key="frame" x="172" y="236" width="129" height="18"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="14" id="7r7-zz-ay2"/> <constraint firstAttribute="height" constant="14" id="7r7-zz-ay2"/>
</constraints> </constraints>
<animations/>
<buttonCell key="cell" type="check" title="Protect Password" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="505"> <buttonCell key="cell" type="check" title="Protect Password" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="505">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<button misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="509"> <button misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="509">
<rect key="frame" x="172" y="94" width="95" height="18"/> <rect key="frame" x="172" y="164" width="95" height="18"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="14" id="ifc-cz-8Ge"/> <constraint firstAttribute="height" constant="14" id="ifc-cz-8Ge"/>
</constraints> </constraints>
<animations/>
<buttonCell key="cell" type="check" title="Protect URL" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="510"> <buttonCell key="cell" type="check" title="Protect URL" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="510">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<button misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="513"> <button misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="513">
<rect key="frame" x="172" y="74" width="106" height="18"/> <rect key="frame" x="172" y="144" width="106" height="18"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="14" id="rVu-uf-euL"/> <constraint firstAttribute="height" constant="14" id="rVu-uf-euL"/>
</constraints> </constraints>
<animations/>
<buttonCell key="cell" type="check" title="Protect Notes" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="514"> <buttonCell key="cell" type="check" title="Protect Notes" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="514">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1643"> <textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1643">
<rect key="frame" x="18" y="48" width="150" height="17"/> <rect key="frame" x="18" y="118" width="150" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Key encryption rounds:" id="1644"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Key encryption rounds:" id="1644">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -285,11 +266,10 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1647"> <textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1647">
<rect key="frame" x="174" y="46" width="130" height="22"/> <rect key="frame" x="174" y="116" width="130" height="22"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="130" id="Lgz-kV-K0Y"/> <constraint firstAttribute="width" constant="130" id="Lgz-kV-K0Y"/>
</constraints> </constraints>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" usesSingleLineMode="YES" id="1648"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" usesSingleLineMode="YES" id="1648">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
@@ -297,8 +277,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<button verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1774"> <button verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1774">
<rect key="frame" x="174" y="19" width="79" height="19"/> <rect key="frame" x="174" y="89" width="79" height="19"/>
<animations/>
<buttonCell key="cell" type="roundRect" title="Benchmark" bezelStyle="roundedRect" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="1775"> <buttonCell key="cell" type="roundRect" title="Benchmark" bezelStyle="roundedRect" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="1775">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="cellTitle"/> <font key="font" metaFont="cellTitle"/>
@@ -308,8 +287,7 @@ Gw
</connections> </connections>
</button> </button>
<textField horizontalHuggingPriority="249" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" misplaced="YES" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="69F-ej-1NB"> <textField horizontalHuggingPriority="249" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" misplaced="YES" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="69F-ej-1NB">
<rect key="frame" x="172" y="118" width="314" height="42"/> <rect key="frame" x="172" y="188" width="314" height="42"/>
<animations/>
<textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" title="Disabling password protection will remove unallowed characters in passwords. This will cause data loss after saving." id="iZR-sj-MHg"> <textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" title="Disabling password protection will remove unallowed characters in passwords. This will cause data loss after saving." id="iZR-sj-MHg">
<font key="font" metaFont="smallSystem"/> <font key="font" metaFont="smallSystem"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -346,7 +324,6 @@ Gw
<constraint firstItem="1643" firstAttribute="baseline" secondItem="1647" secondAttribute="baseline" id="tCe-Sq-PLK"/> <constraint firstItem="1643" firstAttribute="baseline" secondItem="1647" secondAttribute="baseline" id="tCe-Sq-PLK"/>
<constraint firstItem="504" firstAttribute="leading" secondItem="69F-ej-1NB" secondAttribute="leading" id="vU0-RG-dBk"/> <constraint firstItem="504" firstAttribute="leading" secondItem="69F-ej-1NB" secondAttribute="leading" id="vU0-RG-dBk"/>
</constraints> </constraints>
<animations/>
</view> </view>
</tabViewItem> </tabViewItem>
<tabViewItem label="Advanced" identifier="" id="368"> <tabViewItem label="Advanced" identifier="" id="368">
@@ -354,122 +331,109 @@ Gw
<rect key="frame" x="10" y="33" width="501" height="312"/> <rect key="frame" x="10" y="33" width="501" height="312"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<button verticalHuggingPriority="1000" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="531"> <button verticalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="531">
<rect key="frame" x="70" y="276" width="148" height="18"/> <rect key="frame" x="70" y="276" width="145" height="18"/>
<animations/>
<buttonCell key="cell" type="check" title="Enable Entry History" bezelStyle="regularSquare" imagePosition="left" enabled="NO" state="on" inset="2" id="532"> <buttonCell key="cell" type="check" title="Enable Entry History" bezelStyle="regularSquare" imagePosition="left" enabled="NO" state="on" inset="2" id="532">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<button misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="535"> <button translatesAutoresizingMaskIntoConstraints="NO" id="535">
<rect key="frame" x="70" y="178" width="138" height="18"/> <rect key="frame" x="70" y="178" width="137" height="18"/>
<animations/>
<buttonCell key="cell" type="check" title="Enable Recycle Bin" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="536"> <buttonCell key="cell" type="check" title="Enable Recycle Bin" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="536">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="557"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="557">
<rect key="frame" x="110" y="250" width="96" height="17"/> <rect key="frame" x="110" y="251" width="103" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" enabled="NO" sendsActionOnEndEditing="YES" title="Maximum Items:" id="558"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" enabled="NO" sendsActionOnEndEditing="YES" title="Maximum Items:" id="558">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="593"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="593">
<rect key="frame" x="212" y="248" width="96" height="22"/> <rect key="frame" x="219" y="248" width="96" height="22"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="96" id="pYi-8G-RA7"/> <constraint firstAttribute="width" constant="96" id="pYi-8G-RA7"/>
</constraints> </constraints>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" enabled="NO" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="594"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" enabled="NO" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="594">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="599"> <stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="599">
<rect key="frame" x="313" y="245" width="19" height="27"/> <rect key="frame" x="320" y="245" width="19" height="27"/>
<animations/>
<stepperCell key="cell" continuous="YES" enabled="NO" alignment="left" maxValue="100" id="600"/> <stepperCell key="cell" continuous="YES" enabled="NO" alignment="left" maxValue="100" id="600"/>
</stepper> </stepper>
<popUpButton verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="678"> <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="678">
<rect key="frame" x="210" y="172" width="220" height="26"/> <rect key="frame" x="217" y="172" width="220" height="26"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="215" id="AIY-63-gl0"/> <constraint firstAttribute="width" constant="215" id="AIY-63-gl0"/>
</constraints> </constraints>
<animations/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="679"> <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="679">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/> <font key="font" metaFont="menu"/>
<menu key="menu" title="OtherViews" id="680"/> <menu key="menu" title="OtherViews" id="680"/>
</popUpButtonCell> </popUpButtonCell>
</popUpButton> </popUpButton>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1268"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1268">
<rect key="frame" x="118" y="218" width="88" height="17"/> <rect key="frame" x="117" y="219" width="96" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" enabled="NO" sendsActionOnEndEditing="YES" title="Maximum Size:" id="1269"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" enabled="NO" sendsActionOnEndEditing="YES" title="Maximum Size:" id="1269">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1273"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1273">
<rect key="frame" x="212" y="216" width="96" height="22"/> <rect key="frame" x="219" y="216" width="96" height="22"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="96" id="lRA-HE-AaF"/> <constraint firstAttribute="width" constant="96" id="lRA-HE-AaF"/>
</constraints> </constraints>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" enabled="NO" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="1275"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" enabled="NO" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="1275">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1294"> <stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1294">
<rect key="frame" x="313" y="213" width="19" height="27"/> <rect key="frame" x="320" y="213" width="19" height="27"/>
<animations/>
<stepperCell key="cell" continuous="YES" enabled="NO" alignment="left" maxValue="100" id="1295"/> <stepperCell key="cell" continuous="YES" enabled="NO" alignment="left" maxValue="100" id="1295"/>
</stepper> </stepper>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1582"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1582">
<rect key="frame" x="85" y="125" width="121" height="17"/> <rect key="frame" x="96" y="126" width="117" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Default Username:" id="1591"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Default Username:" id="1591">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1584"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1584">
<rect key="frame" x="96" y="85" width="110" height="17"/> <rect key="frame" x="108" y="85" width="105" height="17"/>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Template Group:" id="1588"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Template Group:" id="1588">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1730"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1730">
<rect key="frame" x="212" y="123" width="215" height="22"/> <rect key="frame" x="219" y="123" width="215" height="22"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="215" id="J2z-RZ-eS1"/> <constraint firstAttribute="width" constant="215" id="J2z-RZ-eS1"/>
</constraints> </constraints>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="1731"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="1731">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<popUpButton verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="1738"> <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1738">
<rect key="frame" x="210" y="79" width="220" height="26"/> <rect key="frame" x="217" y="79" width="220" height="26"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="215" id="5P2-dy-dfo"/> <constraint firstAttribute="width" constant="215" id="5P2-dy-dfo"/>
</constraints> </constraints>
<animations/>
<popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="1741" id="1739"> <popUpButtonCell key="cell" type="push" title="Item 1" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="1741" id="1739">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/> <font key="font" metaFont="menu"/>
@@ -482,59 +446,52 @@ Gw
</menu> </menu>
</popUpButtonCell> </popUpButtonCell>
</popUpButton> </popUpButton>
<button verticalHuggingPriority="251" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Hqc-B0-xyz"> <button verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Hqc-B0-xyz">
<rect key="frame" x="70" y="53" width="217" height="18"/> <rect key="frame" x="70" y="54" width="211" height="18"/>
<animations/>
<buttonCell key="cell" type="check" title="Recommend key change every:" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="CtU-Eq-dgy"> <buttonCell key="cell" type="check" title="Recommend key change every:" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="CtU-Eq-dgy">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<button misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="upv-b3-vCc"> <button translatesAutoresizingMaskIntoConstraints="NO" id="upv-b3-vCc">
<rect key="frame" x="70" y="21" width="217" height="18"/> <rect key="frame" x="70" y="22" width="211" height="18"/>
<animations/>
<buttonCell key="cell" type="check" title="Force key change every:" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="z6u-YT-7LE"> <buttonCell key="cell" type="check" title="Force key change every:" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="z6u-YT-7LE">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="19r-LE-7X5"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="19r-LE-7X5">
<rect key="frame" x="293" y="52" width="38" height="22"/> <rect key="frame" x="287" y="52" width="38" height="22"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="38" id="Zyg-Bo-eBy"/> <constraint firstAttribute="width" constant="38" id="Zyg-Bo-eBy"/>
</constraints> </constraints>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="days" drawsBackground="YES" id="Nca-aw-6rR"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="days" drawsBackground="YES" id="Nca-aw-6rR">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="VYh-cm-fix"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="VYh-cm-fix">
<rect key="frame" x="293" y="20" width="38" height="22"/> <rect key="frame" x="287" y="20" width="38" height="22"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="38" id="hgc-dE-uYj"/> <constraint firstAttribute="width" constant="38" id="hgc-dE-uYj"/>
</constraints> </constraints>
<animations/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="days" drawsBackground="YES" id="M9G-Yy-1s4"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="days" drawsBackground="YES" id="M9G-Yy-1s4">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="GUO-6H-UI2"> <stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="GUO-6H-UI2">
<rect key="frame" x="336" y="49" width="19" height="27"/> <rect key="frame" x="330" y="49" width="19" height="27"/>
<animations/>
<stepperCell key="cell" continuous="YES" enabled="NO" alignment="left" maxValue="100" id="qQV-3d-GpK"/> <stepperCell key="cell" continuous="YES" enabled="NO" alignment="left" maxValue="100" id="qQV-3d-GpK"/>
</stepper> </stepper>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="lH4-xp-5QF"> <stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="lH4-xp-5QF">
<rect key="frame" x="336" y="17" width="19" height="27"/> <rect key="frame" x="330" y="17" width="19" height="27"/>
<animations/>
<stepperCell key="cell" continuous="YES" enabled="NO" alignment="left" maxValue="100" id="7Hw-Qf-zWf"/> <stepperCell key="cell" continuous="YES" enabled="NO" alignment="left" maxValue="100" id="7Hw-Qf-zWf"/>
</stepper> </stepper>
<button verticalHuggingPriority="1000" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="539"> <button verticalHuggingPriority="1000" translatesAutoresizingMaskIntoConstraints="NO" id="539">
<rect key="frame" x="110" y="151" width="186" height="18"/> <rect key="frame" x="110" y="151" width="182" height="18"/>
<animations/>
<buttonCell key="cell" type="check" title="Empty Recycle Bin on Quit" bezelStyle="regularSquare" imagePosition="left" enabled="NO" state="on" inset="2" id="540"> <buttonCell key="cell" type="check" title="Empty Recycle Bin on Quit" bezelStyle="regularSquare" imagePosition="left" enabled="NO" state="on" inset="2" id="540">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
@@ -585,7 +542,6 @@ Gw
<constraint firstItem="531" firstAttribute="leading" secondItem="535" secondAttribute="leading" id="ucf-w0-brS"/> <constraint firstItem="531" firstAttribute="leading" secondItem="535" secondAttribute="leading" id="ucf-w0-brS"/>
<constraint firstItem="1738" firstAttribute="top" secondItem="1730" secondAttribute="bottom" constant="20" symbolic="YES" id="wPN-zn-tg4"/> <constraint firstItem="1738" firstAttribute="top" secondItem="1730" secondAttribute="bottom" constant="20" symbolic="YES" id="wPN-zn-tg4"/>
</constraints> </constraints>
<animations/>
</view> </view>
</tabViewItem> </tabViewItem>
</tabViewItems> </tabViewItems>
@@ -601,9 +557,8 @@ Gw
<constraint firstItem="288" firstAttribute="leading" secondItem="956" secondAttribute="trailing" constant="12" symbolic="YES" id="959"/> <constraint firstItem="288" firstAttribute="leading" secondItem="956" secondAttribute="trailing" constant="12" symbolic="YES" id="959"/>
<constraint firstItem="956" firstAttribute="top" secondItem="357" secondAttribute="bottom" constant="10" id="1096"/> <constraint firstItem="956" firstAttribute="top" secondItem="357" secondAttribute="bottom" constant="10" id="1096"/>
</constraints> </constraints>
<animations/>
</view> </view>
<point key="canvasLocation" x="94.5" y="112.5"/> <point key="canvasLocation" x="535.5" y="227.5"/>
</window> </window>
</objects> </objects>
</document> </document>

View File

@@ -8,10 +8,10 @@
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>
@class MPDocument; @protocol MPModelChangeObserving;
@interface MPArrayController : NSArrayController @interface MPArrayController : NSArrayController
@property (weak) MPDocument *document; @property (weak) id<MPModelChangeObserving> observer;
@end @end

View File

@@ -7,16 +7,15 @@
// //
#import "MPArrayController.h" #import "MPArrayController.h"
#import "MPDocument.h" #import "MPModelChangeObserving.h"
@implementation MPArrayController @implementation MPArrayController
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath { - (void)setValue:(id)value forKeyPath:(NSString *)keyPath {
if([keyPath hasPrefix:@"selection."]) { if([keyPath hasPrefix:@"selection."]) {
[self.document willChangeModelProperty]; [self.observer willChangeModelProperty];
[super setValue:value forKeyPath:keyPath]; [super setValue:value forKeyPath:keyPath];
[self.document didChangeModelProperty]; [self.observer didChangeModelProperty];
} }
else { else {
[super setValue:value forKeyPath:keyPath]; [super setValue:value forKeyPath:keyPath];

View File

@@ -38,6 +38,9 @@ typedef NS_ENUM(NSUInteger, MPDatabaseSettingsTab) {
@property (weak) IBOutlet NSButton *benchmarkButton; @property (weak) IBOutlet NSButton *benchmarkButton;
/* Advanced Tab*/ /* Advanced Tab*/
@property (weak) IBOutlet NSButton *enableHistoryCheckButton;
@property (weak) IBOutlet NSTextField *historyMaximumItemsTextField;
@property (weak) IBOutlet NSTextField *historyMaxiumSizeTextField;
@property (weak) IBOutlet NSButton *enableTrashCheckButton; @property (weak) IBOutlet NSButton *enableTrashCheckButton;
@property (weak) IBOutlet NSButton *emptyTrashOnQuitCheckButton; @property (weak) IBOutlet NSButton *emptyTrashOnQuitCheckButton;
@property (weak) IBOutlet NSPopUpButton *selectTrashGoupPopUpButton; @property (weak) IBOutlet NSPopUpButton *selectTrashGoupPopUpButton;

View File

@@ -15,8 +15,6 @@ NS_ASSUME_NONNULL_BEGIN
@interface MPDatePickingViewController : MPViewController @interface MPDatePickingViewController : MPViewController
@property (nullable, weak) MPDocument *document;
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END

View File

@@ -62,9 +62,9 @@ typedef NS_ENUM(NSUInteger, MPDatePreset) {
} }
- (IBAction)useDate:(id)sender { - (IBAction)useDate:(id)sender {
[self.document willChangeModelProperty]; [self.observer willChangeModelProperty];
[self.representedObject timeInfo].expirationDate = self.datePicker.dateValue; [self.representedObject timeInfo].expirationDate = self.datePicker.dateValue;
[self.document didChangeModelProperty]; [self.observer didChangeModelProperty];
[self.view.window performClose:sender]; [self.view.window performClose:sender];
} }

View File

@@ -1,24 +0,0 @@
//
// MPDocument+ModelChange.m
// MacPass
//
// Created by Michael Starke on 30/08/16.
// Copyright © 2016 HicknHack Software GmbH. All rights reserved.
//
#import "MPDocument.h"
NSString *const MPDocumentWillChangeModelPropertyNotification = @"com.hicknhack.macpass.MPDocumentWillChangeModelPropertyNotification";
NSString *const MPDocumentDidChangeModelPropertyNotification = @"com.hicknhack.macpass.MPDocumentDidChangeModelPropertyNotification";
@implementation MPDocument (ModelChange)
- (void)willChangeModelProperty {
[[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentWillChangeModelPropertyNotification object:self];
}
- (void)didChangeModelProperty {
[[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentDidChangeModelPropertyNotification object:self];
}
@end

View File

@@ -24,6 +24,7 @@
#import <KeePassKit/KeePassKit.h> #import <KeePassKit/KeePassKit.h>
#import "MPEntrySearchContext.h" #import "MPEntrySearchContext.h"
#import "MPTargetNodeResolving.h" #import "MPTargetNodeResolving.h"
#import "MPModelChangeObserving.h"
/** /**
* Posted when a new group was added to the document. * Posted when a new group was added to the document.
@@ -31,23 +32,30 @@
* Undo/Redo will not cause this notification to be reposted * Undo/Redo will not cause this notification to be reposted
* The userInfo dictionary contains the added group at MPDocumentGroupKey * The userInfo dictionary contains the added group at MPDocumentGroupKey
*/ */
APPKIT_EXTERN NSString *const MPDocumentDidAddGroupNotification; FOUNDATION_EXPORT NSString *const MPDocumentDidAddGroupNotification;
/** /**
* Posted when the user has added a new entry to the document. * Posted when the user has added a new entry to the document.
* Undo/redo will not cause this notification to be reposted. * Undo/redo will not cause this notification to be reposted.
* The userInfo dictionary contains the added entry at MPDocumentEntryKey * The userInfo dictionary contains the added entry at MPDocumentEntryKey
*/ */
APPKIT_EXTERN NSString *const MPDocumentDidAddEntryNotification; FOUNDATION_EXPORT NSString *const MPDocumentDidAddEntryNotification;
APPKIT_EXTERN NSString *const MPDocumentDidRevertNotifiation; FOUNDATION_EXPORT NSString *const MPDocumentDidRevertNotifiation;
APPKIT_EXTERN NSString *const MPDocumentDidLockDatabaseNotification; FOUNDATION_EXPORT NSString *const MPDocumentDidLockDatabaseNotification;
APPKIT_EXTERN NSString *const MPDocumentDidUnlockDatabaseNotification; FOUNDATION_EXPORT NSString *const MPDocumentDidUnlockDatabaseNotification;
APPKIT_EXTERN NSString *const MPDocumentCurrentItemChangedNotification; FOUNDATION_EXPORT NSString *const MPDocumentCurrentItemChangedNotification;
/**
* Posted whenever a model change is initated via the user. This is mainly to broadcast changes
* to an entry done via the ui throuhgout the app.
*/
FOUNDATION_EXPORT NSString *const MPDocumentWillChangeModelPropertyNotification;
FOUNDATION_EXPORT NSString *const MPDocumentDidChangeModelPropertyNotification;
/* Keys used in userInfo NSDictionaries on notifications */ /* Keys used in userInfo NSDictionaries on notifications */
APPKIT_EXTERN NSString *const MPDocumentEntryKey; FOUNDATION_EXPORT NSString *const MPDocumentEntryKey;
APPKIT_EXTERN NSString *const MPDocumentGroupKey; FOUNDATION_EXPORT NSString *const MPDocumentGroupKey;
@class KPKGroup; @class KPKGroup;
@class KPKEntry; @class KPKEntry;
@@ -57,7 +65,7 @@ APPKIT_EXTERN NSString *const MPDocumentGroupKey;
@class KPKCompositeKey; @class KPKCompositeKey;
@class KPKNode; @class KPKNode;
@interface MPDocument : NSDocument <MPTargetNodeResolving> @interface MPDocument : NSDocument <MPTargetNodeResolving, MPModelChangeObserving>
@property (nonatomic, readonly, assign) BOOL encrypted; @property (nonatomic, readonly, assign) BOOL encrypted;
@property (nonatomic, readonly, assign) NSUInteger unlockCount; // Amount of times the Document was unlocked; @property (nonatomic, readonly, assign) NSUInteger unlockCount; // Amount of times the Document was unlocked;
@@ -224,27 +232,6 @@ FOUNDATION_EXPORT NSString *const MPDocumentDidExitHistoryNotification;
@end @end
#pragma mark -
#pragma mark ModelChanges
/**
* Notifications will be posted by the document to inform about changes to a model property being displayed
*/
FOUNDATION_EXPORT NSString *const MPDocumentWillChangeModelPropertyNotification;
FOUNDATION_EXPORT NSString *const MPDocumentDidChangeModelPropertyNotification;
@interface MPDocument (ModelChange)
/**
* Call this on the document ot inform it about changes about to happen. This is an entry point for views and controllers to notify others about changes done to the model.
* You coudl also observer modification times on objects but this way it's impossible to determine the source of the change. Undo/Redo or external plugins or merging can all introduce
* changes to a database that aren't relevant.
* The main use case for this is to update the history of entries on editing
*/
- (void)willChangeModelProperty;
- (void)didChangeModelProperty;
@end
#pragma mark - #pragma mark -
#pragma mark Search #pragma mark Search

View File

@@ -49,6 +49,9 @@ NSString *const MPDocumentDidUnlockDatabaseNotification = @"com.hicknhack.
NSString *const MPDocumentCurrentItemChangedNotification = @"com.hicknhack.macpass.MPDocumentCurrentItemChangedNotification"; NSString *const MPDocumentCurrentItemChangedNotification = @"com.hicknhack.macpass.MPDocumentCurrentItemChangedNotification";
NSString *const MPDocumentWillChangeModelPropertyNotification = @"com.hicknhack.macpass.MPDocumentWillChangeModelPropertyNotification";
NSString *const MPDocumentDidChangeModelPropertyNotification = @"com.hicknhack.macpass.MPDocumentDidChangeModelPropertyNotification";
NSString *const MPDocumentEntryKey = @"MPDocumentEntryKey"; NSString *const MPDocumentEntryKey = @"MPDocumentEntryKey";
NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey"; NSString *const MPDocumentGroupKey = @"MPDocumentGroupKey";
@@ -780,4 +783,16 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
return self.selectedGroups; return self.selectedGroups;
} }
#pragma mark -
#pragma mark MPModelChangeObserving
- (void)willChangeModelProperty {
[[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentWillChangeModelPropertyNotification object:self];
}
- (void)didChangeModelProperty {
[[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentDidChangeModelPropertyNotification object:self];
}
@end @end

View File

@@ -129,6 +129,7 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
selector:@selector(_didAddEntry:) selector:@selector(_didAddEntry:)
name:MPDocumentDidAddEntryNotification name:MPDocumentDidAddEntryNotification
object:document]; object:document];
_windowAssociationsController.observer = document;
} }
- (void)dealloc { - (void)dealloc {
@@ -139,12 +140,16 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
#pragma mark Actions #pragma mark Actions
- (void)addCustomField:(id)sender { - (void)addCustomField:(id)sender {
[self.observer willChangeModelProperty];
[self.windowController.document createCustomAttribute:self.representedObject]; [self.windowController.document createCustomAttribute:self.representedObject];
[self.observer didChangeModelProperty];
} }
- (void)removeCustomField:(id)sender { - (void)removeCustomField:(id)sender {
NSUInteger index = [sender tag]; NSUInteger index = [sender tag];
KPKAttribute *attribute = self.representedEntry.customAttributes[index]; KPKAttribute *attribute = self.representedEntry.customAttributes[index];
[self.observer willChangeModelProperty];
[self.representedEntry removeCustomAttribute:attribute]; [self.representedEntry removeCustomAttribute:attribute];
[self.observer didChangeModelProperty];
} }
- (void)saveAttachment:(id)sender { - (void)saveAttachment:(id)sender {
@@ -177,7 +182,9 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
if(result == NSFileHandlingPanelOKButton) { if(result == NSFileHandlingPanelOKButton) {
for (NSURL *attachmentURL in openPanel.URLs) { for (NSURL *attachmentURL in openPanel.URLs) {
KPKBinary *binary = [[KPKBinary alloc] initWithContentsOfURL:attachmentURL]; KPKBinary *binary = [[KPKBinary alloc] initWithContentsOfURL:attachmentURL];
[self.observer willChangeModelProperty];
[self.representedEntry addBinary:binary]; [self.representedEntry addBinary:binary];
[self.observer didChangeModelProperty];
} }
} }
}]; }];
@@ -189,18 +196,24 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
return; // no selection return; // no selection
} }
KPKBinary *binary = self.representedEntry.binaries[row]; KPKBinary *binary = self.representedEntry.binaries[row];
[self.observer willChangeModelProperty];
[self.representedEntry removeBinary:binary]; [self.representedEntry removeBinary:binary];
[self.observer didChangeModelProperty];
} }
- (void)addWindowAssociation:(id)sender { - (void)addWindowAssociation:(id)sender {
KPKWindowAssociation *associtation = [[KPKWindowAssociation alloc] initWithWindowTitle:NSLocalizedString(@"DEFAULT_WINDOW_TITLE", "") keystrokeSequence:nil]; KPKWindowAssociation *associtation = [[KPKWindowAssociation alloc] initWithWindowTitle:NSLocalizedString(@"DEFAULT_WINDOW_TITLE", "") keystrokeSequence:nil];
[self.observer willChangeModelProperty];
[self.representedEntry.autotype addAssociation:associtation]; [self.representedEntry.autotype addAssociation:associtation];
[self.observer didChangeModelProperty];
} }
- (void)removeWindowAssociation:(id)sender { - (void)removeWindowAssociation:(id)sender {
NSInteger row = self.windowAssociationsTableView.selectedRow; NSInteger row = self.windowAssociationsTableView.selectedRow;
if(row > - 1 && row < [self.representedEntry.autotype.associations count]) { if(row > - 1 && row < self.representedEntry.autotype.associations.count) {
[self.observer willChangeModelProperty];
[self.representedEntry.autotype removeAssociation:self.representedEntry.autotype.associations[row]]; [self.representedEntry.autotype removeAssociation:self.representedEntry.autotype.associations[row]];
[self.observer didChangeModelProperty];
} }
} }
@@ -267,7 +280,7 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
MPPasswordCreatorViewController *viewController = [[MPPasswordCreatorViewController alloc] init]; MPPasswordCreatorViewController *viewController = [[MPPasswordCreatorViewController alloc] init];
viewController.allowsEntryDefaults = YES; viewController.allowsEntryDefaults = YES;
viewController.representedObject = self.representedObject; viewController.representedObject = self.representedObject;
viewController.document = self.windowController.document; viewController.observer = self.windowController.document;
[self _showPopopver:viewController atView:self.passwordTextField onEdge:NSMinYEdge]; [self _showPopopver:viewController atView:self.passwordTextField onEdge:NSMinYEdge];
} }

View File

@@ -12,7 +12,6 @@
@interface MPIconSelectViewController : MPViewController <NSCollectionViewDelegate> @interface MPIconSelectViewController : MPViewController <NSCollectionViewDelegate>
@property (weak, nullable) MPDocument *document;
@property (weak, nullable) NSPopover *popover; @property (weak, nullable) NSPopover *popover;
@end @end

View File

@@ -34,9 +34,9 @@
- (IBAction)useDefault:(id)sender { - (IBAction)useDefault:(id)sender {
KPKNode *node = self.representedObject; KPKNode *node = self.representedObject;
[self.document willChangeModelProperty]; [self.observer willChangeModelProperty];
node.iconId = [[node class] defaultIcon]; node.iconId = [[node class] defaultIcon];
[self.document didChangeModelProperty]; [self.observer didChangeModelProperty];
[self.view.window performClose:sender]; [self.view.window performClose:sender];
} }
@@ -50,9 +50,9 @@
NSUInteger buttonIndex = [self.iconCollectionView.content indexOfObject:image]; NSUInteger buttonIndex = [self.iconCollectionView.content indexOfObject:image];
NSInteger newIconId = ((NSNumber *)[MPIconHelper databaseIconTypes][buttonIndex]).integerValue; NSInteger newIconId = ((NSNumber *)[MPIconHelper databaseIconTypes][buttonIndex]).integerValue;
KPKNode *node = self.representedObject; KPKNode *node = self.representedObject;
[self.document willChangeModelProperty]; [self.observer willChangeModelProperty];
node.iconId = newIconId; node.iconId = newIconId;
[self.document didChangeModelProperty]; [self.observer didChangeModelProperty];
[self.view.window performClose:sender]; [self.view.window performClose:sender];
} }

View File

@@ -119,6 +119,8 @@ typedef NS_ENUM(NSUInteger, MPContentTab) {
name:MPDocumentWillChangeModelPropertyNotification name:MPDocumentWillChangeModelPropertyNotification
object:document]; object:document];
self.entryViewController.observer = document;
[self.entryViewController registerNotificationsForDocument:document]; [self.entryViewController registerNotificationsForDocument:document];
} }
@@ -176,7 +178,7 @@ typedef NS_ENUM(NSUInteger, MPContentTab) {
MPIconSelectViewController *vc = [[MPIconSelectViewController alloc] init]; MPIconSelectViewController *vc = [[MPIconSelectViewController alloc] init];
vc.representedObject = self.representedObject; vc.representedObject = self.representedObject;
vc.popover = self.popover; vc.popover = self.popover;
vc.document = self.windowController.document; vc.observer = self.windowController.document;
self.popover.contentViewController = vc; self.popover.contentViewController = vc;
[self.popover showRelativeToRect:NSZeroRect ofView:sender preferredEdge:NSMinYEdge]; [self.popover showRelativeToRect:NSZeroRect ofView:sender preferredEdge:NSMinYEdge];
} }
@@ -191,7 +193,7 @@ typedef NS_ENUM(NSUInteger, MPContentTab) {
self.popover.behavior = NSPopoverBehaviorTransient; self.popover.behavior = NSPopoverBehaviorTransient;
MPDatePickingViewController *vc = [[MPDatePickingViewController alloc] init]; MPDatePickingViewController *vc = [[MPDatePickingViewController alloc] init];
vc.representedObject = self.representedObject; vc.representedObject = self.representedObject;
vc.document = self.windowController.document; vc.observer = self.windowController.document;
self.popover.contentViewController = vc; self.popover.contentViewController = vc;
[self.popover showRelativeToRect:NSZeroRect ofView:sender preferredEdge:NSMinYEdge]; [self.popover showRelativeToRect:NSZeroRect ofView:sender preferredEdge:NSMinYEdge];
} }

View File

@@ -0,0 +1,17 @@
//
// MPModelChangeNotification.h
// MacPass
//
// Created by Michael Starke on 30/08/16.
// Copyright © 2016 HicknHack Software GmbH. All rights reserved.
//
#import <Foundation/Foundation.h>
@protocol MPModelChangeObserving <NSObject>
@required
- (void)willChangeModelProperty;
- (void)didChangeModelProperty;
@end

View File

@@ -12,10 +12,10 @@
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
@class MPDocument; @class MPDocument;
@protocol MPModelChangeObserving;
@interface MPPasswordCreatorViewController : MPViewController <NSTextFieldDelegate> @interface MPPasswordCreatorViewController : MPViewController <NSTextFieldDelegate>
@property (weak, nullable) MPDocument *document;
@property (assign) BOOL allowsEntryDefaults; @property (assign) BOOL allowsEntryDefaults;
/** /**

View File

@@ -12,6 +12,7 @@
#import "MPUniqueCharactersFormatter.h" #import "MPUniqueCharactersFormatter.h"
#import "MPSettingsHelper.h" #import "MPSettingsHelper.h"
#import "MPDocument.h" #import "MPDocument.h"
#import "MPModelChangeObserving.h"
#import "MPFlagsHelper.h" #import "MPFlagsHelper.h"
@@ -177,9 +178,9 @@ typedef NS_ENUM(NSUInteger, MPPasswordRating) {
} }
KPKEntry *entry = self.representedObject; KPKEntry *entry = self.representedObject;
if(entry && self.password.length > 0) { if(entry && self.password.length > 0) {
[self.document willChangeModelProperty]; [self.observer willChangeModelProperty];
entry.password = self.password; entry.password = self.password;
[self.document didChangeModelProperty]; [self.observer didChangeModelProperty];
} }
[self.view.window performClose:sender]; [self.view.window performClose:sender];
} }

View File

@@ -7,13 +7,15 @@
// //
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
#import "MPModelChangeObserving.h"
@interface MPViewController : NSViewController @interface MPViewController : NSViewController
@property (nonatomic, readonly) NSWindowController *windowController; @property (nonatomic, readonly, nullable) NSWindowController *windowController;
@property (weak, nullable) id<MPModelChangeObserving> observer;
@property (nonatomic, readonly, nullable) NSResponder *reconmendedFirstResponder;
- (void)didLoadView; - (void)didLoadView;
- (NSResponder *)reconmendedFirstResponder;
- (void)updateResponderChain; - (void)updateResponderChain;
@end @end

View File

@@ -41,9 +41,9 @@
#pragma mark Binding observation #pragma mark Binding observation
- (void)setValue:(id)value forKeyPath:(NSString *)keyPath { - (void)setValue:(id)value forKeyPath:(NSString *)keyPath {
if([keyPath hasPrefix:@"representedObject."]) { if([keyPath hasPrefix:@"representedObject."]) {
[((MPDocument *)self.windowController.document) willChangeModelProperty]; [self.observer willChangeModelProperty];
[super setValue:value forKeyPath:keyPath]; [super setValue:value forKeyPath:keyPath];
[((MPDocument *)self.windowController.document) didChangeModelProperty]; [self.observer didChangeModelProperty];
} }
else { else {
[super setValue:value forKeyPath:keyPath]; [super setValue:value forKeyPath:keyPath];

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="4510" systemVersion="12F45" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="10117" systemVersion="15G31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment defaultVersion="1080" identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="4510"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="10117"/>
</dependencies> </dependencies>
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="MPSettingsWindowController"> <customObject id="-2" userLabel="File's Owner" customClass="MPSettingsWindowController">
@@ -11,11 +11,11 @@
</connections> </connections>
</customObject> </customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/> <customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" showsToolbarButton="NO" wantsToBeColor="NO" visibleAtLaunch="NO" animationBehavior="default" id="1"> <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="1">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/> <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
<rect key="contentRect" x="196" y="240" width="400" height="300"/> <rect key="contentRect" x="196" y="240" width="400" height="300"/>
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1058"/> <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
<view key="contentView" id="2"> <view key="contentView" id="2">
<rect key="frame" x="0.0" y="0.0" width="400" height="300"/> <rect key="frame" x="0.0" y="0.0" width="400" height="300"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>