mirror of
https://github.com/MacPass/MacPass.git
synced 2026-01-31 20:08:23 +00:00
Compare commits
117 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d7b016e5ef | ||
|
|
46b6ab3925 | ||
|
|
c5ed3c42e6 | ||
|
|
00d69d5bad | ||
|
|
fa58c7e423 | ||
|
|
f134290c27 | ||
|
|
3b244c3145 | ||
|
|
541ef6e749 | ||
|
|
eb9d15ffa5 | ||
|
|
05cfb73734 | ||
|
|
d9322d7544 | ||
|
|
7de8d0abd5 | ||
|
|
3289ffb2e4 | ||
|
|
38d64c7cb9 | ||
|
|
c76a8baa88 | ||
|
|
7e402601f8 | ||
|
|
88d7d8792a | ||
|
|
7671a6e3f5 | ||
|
|
c0c053d422 | ||
|
|
4cda972d14 | ||
|
|
48aa21faa8 | ||
|
|
c295f5df6f | ||
|
|
9298feea2d | ||
|
|
7f79dde83a | ||
|
|
ed4e4b0f72 | ||
|
|
62670a605e | ||
|
|
9e5d9f3bf5 | ||
|
|
4b04699b30 | ||
|
|
3910b117a8 | ||
|
|
b9fbe43653 | ||
|
|
145f27c334 | ||
|
|
bf93ab574d | ||
|
|
7fc1dd8a1b | ||
|
|
e31c7c6cd7 | ||
|
|
7d8bb85d9b | ||
|
|
245a58d81b | ||
|
|
6b94cbd81b | ||
|
|
cbc74ccca6 | ||
|
|
9b2f8e5f6f | ||
|
|
9c177afdb0 | ||
|
|
6b13ab37b8 | ||
|
|
d4efba00ae | ||
|
|
2d3e81a5c1 | ||
|
|
c523ba716f | ||
|
|
32c6bae7e4 | ||
|
|
2aba4cbd93 | ||
|
|
5fbd6d1cde | ||
|
|
091a565bc8 | ||
|
|
0d3bf5ba71 | ||
|
|
1baf2cd8e6 | ||
|
|
fc21257173 | ||
|
|
53b807788a | ||
|
|
024131de35 | ||
|
|
a47557672f | ||
|
|
9a55559e71 | ||
|
|
e82db2fe9d | ||
|
|
50dad4de30 | ||
|
|
f7eb7147f3 | ||
|
|
d37164ad89 | ||
|
|
add09827ba | ||
|
|
9a625dd57d | ||
|
|
3191e56e58 | ||
|
|
a5c97469eb | ||
|
|
02840548ba | ||
|
|
52720a79d4 | ||
|
|
71e795c4f4 | ||
|
|
2381acfde9 | ||
|
|
9d2819ce2c | ||
|
|
d5592774d1 | ||
|
|
55f1ce22a9 | ||
|
|
2d98c480da | ||
|
|
30a68fc9e3 | ||
|
|
32899cb707 | ||
|
|
b1cb776e14 | ||
|
|
176a3b7db4 | ||
|
|
38e61b96a5 | ||
|
|
54d7ce4f77 | ||
|
|
2e523f6018 | ||
|
|
077a5851cf | ||
|
|
3cab0ea4dd | ||
|
|
ddb0f92dce | ||
|
|
0c12236401 | ||
|
|
c7d85d6daa | ||
|
|
28817b6c80 | ||
|
|
972f775ab3 | ||
|
|
4a33a7ece2 | ||
|
|
e0d12bea5a | ||
|
|
8f5914afd2 | ||
|
|
eaa0f68c7b | ||
|
|
9f43d52917 | ||
|
|
9e474375bf | ||
|
|
714bba4ce5 | ||
|
|
8d66621803 | ||
|
|
3ef2c01859 | ||
|
|
4abdff79a5 | ||
|
|
f9b36177fd | ||
|
|
9134f4959b | ||
|
|
6e011c00fa | ||
|
|
64de5a0d21 | ||
|
|
5da86637e5 | ||
|
|
ba2fc255dc | ||
|
|
8cc701af5f | ||
|
|
305ce06ab4 | ||
|
|
349eb5791e | ||
|
|
2beb1bbceb | ||
|
|
c46dba59c3 | ||
|
|
25538dd3bf | ||
|
|
e8fa409cef | ||
|
|
6b6c4fb736 | ||
|
|
7c2cf6eadb | ||
|
|
853e47c43f | ||
|
|
a5da80f094 | ||
|
|
878cef88c5 | ||
|
|
43508ad3a5 | ||
|
|
d909c377fb | ||
|
|
ae4656c79a | ||
|
|
1c0a76dc74 |
1
.github/FUNDING.yml
vendored
Normal file
1
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
custom: https://flattr.com/thing/1550529/mstarkeMacPass-on-GitHub
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -24,3 +24,4 @@ Docs/Acknowlegements/*.fls
|
|||||||
Docs/Acknowlegements/*.log
|
Docs/Acknowlegements/*.log
|
||||||
Docs/Acknowlegements/*.synctex.gz
|
Docs/Acknowlegements/*.synctex.gz
|
||||||
docs/acknowledgement/*.lb
|
docs/acknowledgement/*.lb
|
||||||
|
MacPass/en.lproj/Localizable.strings.updated
|
||||||
|
|||||||
11
.travis.yml
11
.travis.yml
@@ -8,6 +8,16 @@ before_install:
|
|||||||
- gem install xcpretty --no-document --quiet
|
- gem install xcpretty --no-document --quiet
|
||||||
|
|
||||||
after_success:
|
after_success:
|
||||||
|
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage de
|
||||||
|
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage en
|
||||||
|
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage es
|
||||||
|
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage fr
|
||||||
|
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage it
|
||||||
|
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage nl
|
||||||
|
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage ru
|
||||||
|
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage sv-SE
|
||||||
|
- xcodebuild -project MacPass.xcodeproj -exportLocalizations -localizationPath Localisations -exportLanguage zh-Hans
|
||||||
|
- zip -9ry Localisations.zip Localisations
|
||||||
- cd ./build/Build/Products/Release
|
- cd ./build/Build/Products/Release
|
||||||
- zip -9ry MacPass-continuous.zip MacPass.app
|
- zip -9ry MacPass-continuous.zip MacPass.app
|
||||||
- shasum -a 256 MacPass-continuous.zip > MacPass-continuous.zip.sha256
|
- shasum -a 256 MacPass-continuous.zip > MacPass-continuous.zip.sha256
|
||||||
@@ -30,6 +40,7 @@ deploy:
|
|||||||
api_key:
|
api_key:
|
||||||
secure: AEb7fgi29S3aXFt5bXz+lq1KHISumny6bf4j06JBC5gUrSs+dW0/tmVFq68XRAqigeOQU31wwv20f7OHiy+GRYDXM2xBsX9ZBQ2IilnaXlDy/mPsNcJJJsZ2gyodi3KnU0rZtTb93me2YyU86H4Na/gtaZZUKjLwCFtGGziExD8=
|
secure: AEb7fgi29S3aXFt5bXz+lq1KHISumny6bf4j06JBC5gUrSs+dW0/tmVFq68XRAqigeOQU31wwv20f7OHiy+GRYDXM2xBsX9ZBQ2IilnaXlDy/mPsNcJJJsZ2gyodi3KnU0rZtTb93me2YyU86H4Na/gtaZZUKjLwCFtGGziExD8=
|
||||||
file:
|
file:
|
||||||
|
- Localisations.zip
|
||||||
- MacPass-continuous.zip
|
- MacPass-continuous.zip
|
||||||
- MacPass-continuous.zip.sha256
|
- MacPass-continuous.zip.sha256
|
||||||
overwrite: true
|
overwrite: true
|
||||||
|
|||||||
2
Cartfile
2
Cartfile
@@ -1,3 +1,3 @@
|
|||||||
github "sparkle-project/Sparkle" ~> 1.18.1
|
github "sparkle-project/Sparkle" ~> 1.22
|
||||||
github "MacPass/KeePassKit" ~> 2.4
|
github "MacPass/KeePassKit" ~> 2.4
|
||||||
github "mstarke/HNHUi" ~> 3.0
|
github "mstarke/HNHUi" ~> 3.0
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
github "MacPass/KeePassKit" "2.4.2"
|
github "MacPass/KeePassKit" "2.4.7"
|
||||||
github "mstarke/HNHUi" "3.0"
|
github "mstarke/HNHUi" "3.0"
|
||||||
github "robbiehanson/KissXML" "5.2.3"
|
github "robbiehanson/KissXML" "5.2.3"
|
||||||
github "sparkle-project/Sparkle" "1.20.0"
|
github "sparkle-project/Sparkle" "1.22.0"
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "1010"
|
LastUpgradeVersion = "1030"
|
||||||
version = "2.0">
|
version = "2.0">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
@@ -55,6 +55,11 @@
|
|||||||
value = "YES"
|
value = "YES"
|
||||||
isEnabled = "YES">
|
isEnabled = "YES">
|
||||||
</EnvironmentVariable>
|
</EnvironmentVariable>
|
||||||
|
<EnvironmentVariable
|
||||||
|
key = "MPIsRunningTests"
|
||||||
|
value = "YES"
|
||||||
|
isEnabled = "YES">
|
||||||
|
</EnvironmentVariable>
|
||||||
</EnvironmentVariables>
|
</EnvironmentVariables>
|
||||||
<AdditionalOptions>
|
<AdditionalOptions>
|
||||||
</AdditionalOptions>
|
</AdditionalOptions>
|
||||||
|
|||||||
@@ -1,14 +1,15 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14460.31"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
<customObject id="-2" userLabel="File's Owner" customClass="MPAutotypeCandidateSelectionViewController">
|
<customObject id="-2" userLabel="File's Owner" customClass="MPAutotypeCandidateSelectionViewController">
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="contextTableView" destination="Ih2-lo-t2W" id="8uy-Mz-1vc"/>
|
<outlet property="contextTableView" destination="Ih2-lo-t2W" id="8uy-Mz-1vc"/>
|
||||||
|
<outlet property="messageTextField" destination="kDw-2l-7gQ" id="7bW-as-yGU"/>
|
||||||
<outlet property="selectAutotypeContextButton" destination="V5B-Qq-GN8" id="mqv-H3-N01"/>
|
<outlet property="selectAutotypeContextButton" destination="V5B-Qq-GN8" id="mqv-H3-N01"/>
|
||||||
<outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
|
<outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
|
||||||
</connections>
|
</connections>
|
||||||
|
|||||||
149
MacPass/Base.lproj/AutotypeDoctorReportViewController.xib
Normal file
149
MacPass/Base.lproj/AutotypeDoctorReportViewController.xib
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||||
|
<dependencies>
|
||||||
|
<deployment identifier="macosx"/>
|
||||||
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
||||||
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
|
</dependencies>
|
||||||
|
<objects>
|
||||||
|
<customObject id="-2" userLabel="File's Owner" customClass="MPAutotypeDoctorReportViewController">
|
||||||
|
<connections>
|
||||||
|
<outlet property="accessibiltyStatusImageView" destination="Xzw-kJ-WoH" id="jEb-0z-dNB"/>
|
||||||
|
<outlet property="accessibiltyStatusTextField" destination="Pqa-Ff-7cc" id="h5M-ZN-GhR"/>
|
||||||
|
<outlet property="requestScreenRecordingButton" destination="d5Z-hD-bpr" id="gS2-vu-2zM"/>
|
||||||
|
<outlet property="screenRecordingStatusImageView" destination="vvZ-Lj-v22" id="7h0-cF-Mxt"/>
|
||||||
|
<outlet property="screenRecordingStatusTextField" destination="IP0-CP-tlA" id="AfL-XZ-KRk"/>
|
||||||
|
<outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
|
||||||
|
</connections>
|
||||||
|
</customObject>
|
||||||
|
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||||
|
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||||
|
<customView id="Hz6-mo-xeY">
|
||||||
|
<rect key="frame" x="0.0" y="0.0" width="400" height="469"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Xzw-kJ-WoH">
|
||||||
|
<rect key="frame" x="20" y="433" width="16" height="16"/>
|
||||||
|
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSStatusAvailable" id="DWu-HI-z3k"/>
|
||||||
|
</imageView>
|
||||||
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Pqa-Ff-7cc">
|
||||||
|
<rect key="frame" x="42" y="432" width="80" height="17"/>
|
||||||
|
<textFieldCell key="cell" lineBreakMode="clipping" title="Accessibility" id="aIL-8W-63g">
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
</textField>
|
||||||
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" verticalCompressionResistancePriority="751" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hY9-T0-hke">
|
||||||
|
<rect key="frame" x="42" y="368" width="340" height="56"/>
|
||||||
|
<textFieldCell key="cell" controlSize="small" selectable="YES" id="6GI-KJ-Xue">
|
||||||
|
<font key="font" metaFont="smallSystem"/>
|
||||||
|
<string key="title">MacPass will send key press events to the system when Autotype or Global Autotype is executed. Since macOS 10.14 Mojave this is only possible, if Accessibility permissions are granted to the application.</string>
|
||||||
|
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
</textField>
|
||||||
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="x9d-0h-hyJ">
|
||||||
|
<rect key="frame" x="38" y="320" width="236" height="32"/>
|
||||||
|
<buttonCell key="cell" type="push" title="Open Accessibilty Preferences…" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8m1-vs-pd5">
|
||||||
|
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
</buttonCell>
|
||||||
|
<connections>
|
||||||
|
<action selector="openAccessibiltyPreferences:" target="-2" id="aZf-xi-w73"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
|
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="vvZ-Lj-v22">
|
||||||
|
<rect key="frame" x="20" y="282" width="16" height="16"/>
|
||||||
|
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSStatusAvailable" id="kCX-CB-5vQ"/>
|
||||||
|
</imageView>
|
||||||
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" verticalCompressionResistancePriority="751" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6vq-iM-inn">
|
||||||
|
<rect key="frame" x="42" y="175" width="340" height="98"/>
|
||||||
|
<textFieldCell key="cell" controlSize="small" selectable="YES" id="7of-1z-Nfk">
|
||||||
|
<font key="font" metaFont="smallSystem"/>
|
||||||
|
<string key="title">MacPass will read every window title when Global Autotype is executed to find a match. Since macOS 10.15 Catalina it is not possible to read any window title, if the user has not granted permissions to record the screen. If you are running macOS 10.15 or higher, MacPass will check if it can read every window title of currently visible windows. This test will not read the actual title. The titles aren't stored or processed in any way.</string>
|
||||||
|
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
</textField>
|
||||||
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IP0-CP-tlA">
|
||||||
|
<rect key="frame" x="42" y="281" width="112" height="17"/>
|
||||||
|
<textFieldCell key="cell" lineBreakMode="clipping" title="Screen Recording" id="9gr-mz-2I4">
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
</textField>
|
||||||
|
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="BHb-cd-Q0r">
|
||||||
|
<rect key="frame" x="20" y="304" width="360" height="5"/>
|
||||||
|
</box>
|
||||||
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="d5Z-hD-bpr">
|
||||||
|
<rect key="frame" x="38" y="127" width="177" height="32"/>
|
||||||
|
<buttonCell key="cell" type="push" title="Request Permissions…" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="1Nx-Cg-TCn">
|
||||||
|
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
</buttonCell>
|
||||||
|
<connections>
|
||||||
|
<action selector="requestScreenRecordingPermissions:" target="-2" id="dvF-Aw-j5Q"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" preferredMaxLayoutWidth="336" translatesAutoresizingMaskIntoConstraints="NO" id="cu4-Jq-eaS">
|
||||||
|
<rect key="frame" x="42" y="84" width="340" height="42"/>
|
||||||
|
<textFieldCell key="cell" selectable="YES" id="Mhg-rd-1hK">
|
||||||
|
<font key="font" metaFont="smallSystem"/>
|
||||||
|
<string key="title">To request Screen Recording permissions, MacPass will try to capture a 1 by 1 Pixel sized screenshot of the top left part of your screen. The data is not stored nor processed in any way.</string>
|
||||||
|
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
</textField>
|
||||||
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="dek-ho-dPm">
|
||||||
|
<rect key="frame" x="38" y="48" width="271" height="32"/>
|
||||||
|
<buttonCell key="cell" type="push" title="Open Screen Recording Preferences…" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="lgB-Ys-L9R">
|
||||||
|
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
</buttonCell>
|
||||||
|
<connections>
|
||||||
|
<action selector="openScreenRecordingPreferences:" target="-2" id="rvE-ff-sR2"/>
|
||||||
|
</connections>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="IP0-CP-tlA" firstAttribute="top" secondItem="BHb-cd-Q0r" secondAttribute="bottom" constant="8" symbolic="YES" id="0sS-li-mx4"/>
|
||||||
|
<constraint firstItem="d5Z-hD-bpr" firstAttribute="top" secondItem="6vq-iM-inn" secondAttribute="bottom" constant="20" symbolic="YES" id="1SD-9R-lf0"/>
|
||||||
|
<constraint firstAttribute="trailing" secondItem="hY9-T0-hke" secondAttribute="trailing" constant="20" symbolic="YES" id="1lC-Hg-bzq"/>
|
||||||
|
<constraint firstItem="vvZ-Lj-v22" firstAttribute="leading" secondItem="Xzw-kJ-WoH" secondAttribute="leading" id="2ZC-Uf-Pe3"/>
|
||||||
|
<constraint firstItem="vvZ-Lj-v22" firstAttribute="centerY" secondItem="IP0-CP-tlA" secondAttribute="centerY" id="2t3-9h-RIf"/>
|
||||||
|
<constraint firstItem="Pqa-Ff-7cc" firstAttribute="leading" secondItem="Xzw-kJ-WoH" secondAttribute="trailing" constant="8" symbolic="YES" id="57a-U7-goz"/>
|
||||||
|
<constraint firstItem="6vq-iM-inn" firstAttribute="top" secondItem="IP0-CP-tlA" secondAttribute="bottom" constant="8" symbolic="YES" id="5ag-ah-YEW"/>
|
||||||
|
<constraint firstItem="dek-ho-dPm" firstAttribute="leading" secondItem="6vq-iM-inn" secondAttribute="leading" id="6Zj-Te-qHt"/>
|
||||||
|
<constraint firstItem="cu4-Jq-eaS" firstAttribute="leading" secondItem="6vq-iM-inn" secondAttribute="leading" id="A1C-96-raA"/>
|
||||||
|
<constraint firstItem="x9d-0h-hyJ" firstAttribute="top" secondItem="hY9-T0-hke" secondAttribute="bottom" constant="20" symbolic="YES" id="Avt-sj-8GL"/>
|
||||||
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Pqa-Ff-7cc" secondAttribute="trailing" constant="20" symbolic="YES" id="Bmg-tH-M7Q"/>
|
||||||
|
<constraint firstAttribute="trailing" secondItem="6vq-iM-inn" secondAttribute="trailing" constant="20" symbolic="YES" id="Cga-EU-fSf"/>
|
||||||
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="x9d-0h-hyJ" secondAttribute="trailing" constant="20" symbolic="YES" id="D8o-Gu-s2Y"/>
|
||||||
|
<constraint firstItem="dek-ho-dPm" firstAttribute="top" secondItem="cu4-Jq-eaS" secondAttribute="bottom" constant="8" symbolic="YES" id="EH9-BF-LGO"/>
|
||||||
|
<constraint firstItem="x9d-0h-hyJ" firstAttribute="leading" secondItem="Pqa-Ff-7cc" secondAttribute="leading" id="J4Y-VM-MZt"/>
|
||||||
|
<constraint firstAttribute="trailing" secondItem="cu4-Jq-eaS" secondAttribute="trailing" constant="20" symbolic="YES" id="Mvl-zI-d9a"/>
|
||||||
|
<constraint firstItem="BHb-cd-Q0r" firstAttribute="top" secondItem="x9d-0h-hyJ" secondAttribute="bottom" constant="20" symbolic="YES" id="TlD-dn-LEm"/>
|
||||||
|
<constraint firstItem="BHb-cd-Q0r" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="YdV-6E-JaO"/>
|
||||||
|
<constraint firstItem="IP0-CP-tlA" firstAttribute="leading" secondItem="Pqa-Ff-7cc" secondAttribute="leading" id="c76-Ak-WXw"/>
|
||||||
|
<constraint firstItem="Xzw-kJ-WoH" firstAttribute="centerY" secondItem="Pqa-Ff-7cc" secondAttribute="centerY" id="dF3-uj-K2q"/>
|
||||||
|
<constraint firstItem="Pqa-Ff-7cc" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" symbolic="YES" id="eyJ-B0-kI3"/>
|
||||||
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="d5Z-hD-bpr" secondAttribute="trailing" constant="20" symbolic="YES" id="hEn-cJ-Ymz"/>
|
||||||
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="dek-ho-dPm" secondAttribute="trailing" constant="20" symbolic="YES" id="jIb-UJ-efk"/>
|
||||||
|
<constraint firstItem="hY9-T0-hke" firstAttribute="leading" secondItem="Pqa-Ff-7cc" secondAttribute="leading" id="kLD-8A-d1Y"/>
|
||||||
|
<constraint firstItem="cu4-Jq-eaS" firstAttribute="top" secondItem="d5Z-hD-bpr" secondAttribute="bottom" constant="8" symbolic="YES" id="nRl-Zo-yCx"/>
|
||||||
|
<constraint firstItem="6vq-iM-inn" firstAttribute="leading" secondItem="IP0-CP-tlA" secondAttribute="leading" id="nby-S7-orD"/>
|
||||||
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="IP0-CP-tlA" secondAttribute="trailing" constant="20" symbolic="YES" id="ntn-yh-HC3"/>
|
||||||
|
<constraint firstItem="Xzw-kJ-WoH" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="oAi-Zl-LCI"/>
|
||||||
|
<constraint firstItem="hY9-T0-hke" firstAttribute="top" secondItem="Pqa-Ff-7cc" secondAttribute="bottom" constant="8" symbolic="YES" id="oK3-FK-r0S"/>
|
||||||
|
<constraint firstItem="d5Z-hD-bpr" firstAttribute="leading" secondItem="6vq-iM-inn" secondAttribute="leading" id="oZ8-mG-RYJ"/>
|
||||||
|
<constraint firstAttribute="trailing" secondItem="BHb-cd-Q0r" secondAttribute="trailing" constant="20" symbolic="YES" id="ryW-3O-g6b"/>
|
||||||
|
</constraints>
|
||||||
|
<point key="canvasLocation" x="-409" y="-112.5"/>
|
||||||
|
</customView>
|
||||||
|
</objects>
|
||||||
|
<resources>
|
||||||
|
<image name="NSStatusAvailable" width="16" height="16"/>
|
||||||
|
</resources>
|
||||||
|
</document>
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14460.31"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
@@ -51,13 +51,13 @@
|
|||||||
<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="500" height="360"/>
|
<rect key="contentRect" x="196" y="240" width="500" height="360"/>
|
||||||
<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="500" height="360"/>
|
<rect key="frame" x="0.0" y="0.0" width="553" height="484"/>
|
||||||
<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="427" y="13" width="59" height="32"/>
|
<rect key="frame" x="480" y="13" width="59" height="32"/>
|
||||||
<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"/>
|
||||||
@@ -70,7 +70,7 @@ DQ
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="956">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="956">
|
||||||
<rect key="frame" x="345" y="13" width="82" height="32"/>
|
<rect key="frame" x="398" y="13" width="82" height="32"/>
|
||||||
<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"/>
|
||||||
@@ -83,7 +83,7 @@ Gw
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<tabView translatesAutoresizingMaskIntoConstraints="NO" id="357">
|
<tabView translatesAutoresizingMaskIntoConstraints="NO" id="357">
|
||||||
<rect key="frame" x="13" y="41" width="474" height="313"/>
|
<rect key="frame" x="13" y="41" width="527" height="437"/>
|
||||||
<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">
|
||||||
@@ -159,7 +159,7 @@ Gw
|
|||||||
<rect key="frame" x="154" y="117" width="280" height="100"/>
|
<rect key="frame" x="154" y="117" width="280" height="100"/>
|
||||||
<clipView key="contentView" drawsBackground="NO" id="WOI-1v-RCe">
|
<clipView key="contentView" drawsBackground="NO" id="WOI-1v-RCe">
|
||||||
<rect key="frame" x="1" y="1" width="278" height="98"/>
|
<rect key="frame" x="1" y="1" width="278" height="98"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<textView importsGraphics="NO" verticallyResizable="YES" usesFontPanel="YES" findStyle="panel" continuousSpellChecking="YES" allowsUndo="YES" usesRuler="YES" allowsNonContiguousLayout="YES" spellingCorrection="YES" smartInsertDelete="YES" id="1531">
|
<textView importsGraphics="NO" verticallyResizable="YES" usesFontPanel="YES" findStyle="panel" continuousSpellChecking="YES" allowsUndo="YES" usesRuler="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"/>
|
||||||
@@ -265,7 +265,7 @@ Gw
|
|||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="P98-Cu-Tha">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="P98-Cu-Tha">
|
||||||
<rect key="frame" x="251.5" y="18" width="143" height="23"/>
|
<rect key="frame" x="251" y="18" width="143" height="23"/>
|
||||||
<buttonCell key="cell" type="roundTextured" title="Generate Parameters" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="PoI-Er-Y8P">
|
<buttonCell key="cell" type="roundTextured" title="Generate Parameters" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="PoI-Er-Y8P">
|
||||||
<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"/>
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14460.31"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
<customObject id="-2" userLabel="File's Owner" customClass="MPGeneralSettingsController">
|
<customObject id="-2" userLabel="File's Owner" customClass="MPGeneralPreferencesController">
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="clearPasteboardOnQuitCheckButton" destination="447" id="520"/>
|
<outlet property="clearPasteboardOnQuitCheckButton" destination="447" id="520"/>
|
||||||
<outlet property="clearPasteboardTimeoutPopup" destination="419" id="521"/>
|
<outlet property="clearPasteboardTimeoutPopup" destination="419" id="521"/>
|
||||||
@@ -24,12 +24,12 @@
|
|||||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||||
<customView translatesAutoresizingMaskIntoConstraints="NO" id="1">
|
<customView translatesAutoresizingMaskIntoConstraints="NO" id="1">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="400" height="524"/>
|
<rect key="frame" x="0.0" y="0.0" width="411" height="524"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<box autoresizesSubviews="NO" verticalHuggingPriority="500" borderType="line" title="Security" translatesAutoresizingMaskIntoConstraints="NO" id="465">
|
<box autoresizesSubviews="NO" verticalHuggingPriority="500" borderType="line" title="Security" translatesAutoresizingMaskIntoConstraints="NO" id="465">
|
||||||
<rect key="frame" x="17" y="16" width="366" height="357"/>
|
<rect key="frame" x="17" y="16" width="377" height="357"/>
|
||||||
<view key="contentView" id="mNh-3L-Z6E">
|
<view key="contentView" id="mNh-3L-Z6E">
|
||||||
<rect key="frame" x="3" y="3" width="360" height="339"/>
|
<rect key="frame" x="3" y="3" width="371" height="339"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="431">
|
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="431">
|
||||||
@@ -44,10 +44,7 @@
|
|||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="419">
|
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="419">
|
||||||
<rect key="frame" x="177" y="308" width="170" height="21"/>
|
<rect key="frame" x="138" y="308" width="143" height="21"/>
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="width" constant="165" id="877"/>
|
|
||||||
</constraints>
|
|
||||||
<popUpButtonCell key="cell" type="push" title="Never" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="429" id="420">
|
<popUpButtonCell key="cell" type="push" title="Never" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="429" id="420">
|
||||||
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||||
<font key="font" metaFont="menu"/>
|
<font key="font" metaFont="menu"/>
|
||||||
@@ -75,7 +72,7 @@
|
|||||||
</buttonCell>
|
</buttonCell>
|
||||||
</button>
|
</button>
|
||||||
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="584">
|
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="584">
|
||||||
<rect key="frame" x="177" y="168" width="170" height="25"/>
|
<rect key="frame" x="111" y="168" width="125" height="25"/>
|
||||||
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="585">
|
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="585">
|
||||||
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||||
<font key="font" metaFont="menu"/>
|
<font key="font" metaFont="menu"/>
|
||||||
@@ -114,7 +111,7 @@
|
|||||||
</buttonCell>
|
</buttonCell>
|
||||||
</button>
|
</button>
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="5cV-xX-SUU">
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="5cV-xX-SUU">
|
||||||
<rect key="frame" x="18" y="41" width="324" height="56"/>
|
<rect key="frame" x="18" y="41" width="335" height="56"/>
|
||||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" id="ACh-7H-42N">
|
<textFieldCell key="cell" sendsActionOnEndEditing="YES" id="ACh-7H-42N">
|
||||||
<font key="font" metaFont="smallSystem"/>
|
<font key="font" metaFont="smallSystem"/>
|
||||||
<string key="title">Enabling this compromises security. If enabled, your preferences will contain mappings from database to keyfile. Key locations for databases without a password will not be saved.</string>
|
<string key="title">Enabling this compromises security. If enabled, your preferences will contain mappings from database to keyfile. Key locations for databases without a password will not be saved.</string>
|
||||||
@@ -123,7 +120,7 @@
|
|||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="oQr-FC-HkN">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="oQr-FC-HkN">
|
||||||
<rect key="frame" x="160" y="5" width="190" height="32"/>
|
<rect key="frame" x="171" y="5" width="190" height="32"/>
|
||||||
<buttonCell key="cell" type="push" title="Clear all stored locations" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8Ri-2s-c39">
|
<buttonCell key="cell" type="push" title="Clear all stored locations" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8Ri-2s-c39">
|
||||||
<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"/>
|
||||||
@@ -147,7 +144,7 @@
|
|||||||
</buttonCell>
|
</buttonCell>
|
||||||
</button>
|
</button>
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hy4-RL-dAa">
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hy4-RL-dAa">
|
||||||
<rect key="frame" x="18" y="200" width="324" height="56"/>
|
<rect key="frame" x="18" y="200" width="335" height="56"/>
|
||||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" id="JGX-Tp-KJk">
|
<textFieldCell key="cell" sendsActionOnEndEditing="YES" id="JGX-Tp-KJk">
|
||||||
<font key="font" metaFont="smallSystem"/>
|
<font key="font" metaFont="smallSystem"/>
|
||||||
<string key="title">Disabling this compromises security. If enabled, anything copied to the Clipboard in MacPass will be available on your connected iOS devices. You should clear the clipboard on those devices manually.</string>
|
<string key="title">Disabling this compromises security. If enabled, anything copied to the Clipboard in MacPass will be available on your connected iOS devices. You should clear the clipboard on those devices manually.</string>
|
||||||
@@ -166,9 +163,9 @@
|
|||||||
<constraint firstItem="5SP-Vi-1sn" firstAttribute="leading" secondItem="447" secondAttribute="leading" id="Ylr-aA-jaD"/>
|
<constraint firstItem="5SP-Vi-1sn" firstAttribute="leading" secondItem="447" secondAttribute="leading" id="Ylr-aA-jaD"/>
|
||||||
<constraint firstItem="hy4-RL-dAa" firstAttribute="top" secondItem="nqZ-rB-mFS" secondAttribute="bottom" constant="8" symbolic="YES" id="a3i-tc-gUU"/>
|
<constraint firstItem="hy4-RL-dAa" firstAttribute="top" secondItem="nqZ-rB-mFS" secondAttribute="bottom" constant="8" symbolic="YES" id="a3i-tc-gUU"/>
|
||||||
<constraint firstItem="5SP-Vi-1sn" firstAttribute="top" secondItem="630" secondAttribute="bottom" constant="6" symbolic="YES" id="acg-vp-LeB"/>
|
<constraint firstItem="5SP-Vi-1sn" firstAttribute="top" secondItem="630" secondAttribute="bottom" constant="6" symbolic="YES" id="acg-vp-LeB"/>
|
||||||
<constraint firstItem="584" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="805" secondAttribute="trailing" constant="8" symbolic="YES" id="aoz-sS-O0n"/>
|
<constraint firstItem="584" firstAttribute="leading" secondItem="805" secondAttribute="trailing" constant="8" symbolic="YES" id="aoz-sS-O0n"/>
|
||||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="447" secondAttribute="trailing" constant="20" symbolic="YES" id="i8H-ad-IKb"/>
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="447" secondAttribute="trailing" constant="20" symbolic="YES" id="i8H-ad-IKb"/>
|
||||||
<constraint firstItem="419" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="431" secondAttribute="trailing" constant="8" symbolic="YES" id="pN3-pB-Z5I"/>
|
<constraint firstItem="419" firstAttribute="leading" secondItem="431" secondAttribute="trailing" constant="8" symbolic="YES" id="pN3-pB-Z5I"/>
|
||||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="5SP-Vi-1sn" secondAttribute="trailing" constant="20" symbolic="YES" id="q0v-Wo-mHx"/>
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="5SP-Vi-1sn" secondAttribute="trailing" constant="20" symbolic="YES" id="q0v-Wo-mHx"/>
|
||||||
<constraint firstItem="nqZ-rB-mFS" firstAttribute="top" secondItem="447" secondAttribute="bottom" constant="11" id="qLm-ih-A04"/>
|
<constraint firstItem="nqZ-rB-mFS" firstAttribute="top" secondItem="447" secondAttribute="bottom" constant="11" id="qLm-ih-A04"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="5cV-xX-SUU" secondAttribute="trailing" constant="20" symbolic="YES" id="qY0-io-RZ0"/>
|
<constraint firstAttribute="trailing" secondItem="5cV-xX-SUU" secondAttribute="trailing" constant="20" symbolic="YES" id="qY0-io-RZ0"/>
|
||||||
@@ -178,8 +175,8 @@
|
|||||||
</constraints>
|
</constraints>
|
||||||
</view>
|
</view>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="trailing" secondItem="419" secondAttribute="trailing" constant="16" id="1de-jU-TAq"/>
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="419" secondAttribute="trailing" constant="16" id="1de-jU-TAq"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="584" secondAttribute="trailing" constant="16" id="GAz-Mn-Z2y"/>
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="584" secondAttribute="trailing" constant="16" id="GAz-Mn-Z2y"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="oQr-FC-HkN" secondAttribute="bottom" constant="11" id="M71-WV-WFc"/>
|
<constraint firstAttribute="bottom" secondItem="oQr-FC-HkN" secondAttribute="bottom" constant="11" id="M71-WV-WFc"/>
|
||||||
<constraint firstItem="5cV-xX-SUU" firstAttribute="top" secondItem="bSt-Wf-FNZ" secondAttribute="bottom" constant="9" id="NYW-dJ-CHg"/>
|
<constraint firstItem="5cV-xX-SUU" firstAttribute="top" secondItem="bSt-Wf-FNZ" secondAttribute="bottom" constant="9" id="NYW-dJ-CHg"/>
|
||||||
<constraint firstItem="805" firstAttribute="centerY" secondItem="584" secondAttribute="centerY" id="OOq-TD-dmj"/>
|
<constraint firstItem="805" firstAttribute="centerY" secondItem="584" secondAttribute="centerY" id="OOq-TD-dmj"/>
|
||||||
@@ -195,15 +192,14 @@
|
|||||||
<constraint firstItem="oQr-FC-HkN" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="465" secondAttribute="leading" constant="16" id="kZ7-HL-y2Q"/>
|
<constraint firstItem="oQr-FC-HkN" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="465" secondAttribute="leading" constant="16" id="kZ7-HL-y2Q"/>
|
||||||
<constraint firstItem="oQr-FC-HkN" firstAttribute="top" secondItem="5cV-xX-SUU" secondAttribute="bottom" constant="8" id="qsT-Cs-vVj"/>
|
<constraint firstItem="oQr-FC-HkN" firstAttribute="top" secondItem="5cV-xX-SUU" secondAttribute="bottom" constant="8" id="qsT-Cs-vVj"/>
|
||||||
<constraint firstItem="447" firstAttribute="top" secondItem="419" secondAttribute="bottom" constant="8" symbolic="YES" id="u35-aE-Ui9"/>
|
<constraint firstItem="447" firstAttribute="top" secondItem="419" secondAttribute="bottom" constant="8" symbolic="YES" id="u35-aE-Ui9"/>
|
||||||
<constraint firstItem="419" firstAttribute="leading" secondItem="584" secondAttribute="leading" id="xws-PK-qQU"/>
|
|
||||||
<constraint firstItem="630" firstAttribute="leading" secondItem="447" secondAttribute="leading" id="ybt-cQ-JwG"/>
|
<constraint firstItem="630" firstAttribute="leading" secondItem="447" secondAttribute="leading" id="ybt-cQ-JwG"/>
|
||||||
<constraint firstItem="447" firstAttribute="top" secondItem="431" secondAttribute="bottom" constant="8" symbolic="YES" id="zkd-Hf-09b"/>
|
<constraint firstItem="447" firstAttribute="top" secondItem="431" secondAttribute="bottom" constant="8" symbolic="YES" id="zkd-Hf-09b"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</box>
|
</box>
|
||||||
<box autoresizesSubviews="NO" verticalHuggingPriority="500" borderType="line" title="File Handling" translatesAutoresizingMaskIntoConstraints="NO" id="888">
|
<box autoresizesSubviews="NO" verticalHuggingPriority="500" borderType="line" title="File Handling" translatesAutoresizingMaskIntoConstraints="NO" id="888">
|
||||||
<rect key="frame" x="17" y="375" width="366" height="129"/>
|
<rect key="frame" x="17" y="375" width="377" height="129"/>
|
||||||
<view key="contentView" id="cpg-tt-SHE">
|
<view key="contentView" id="cpg-tt-SHE">
|
||||||
<rect key="frame" x="3" y="3" width="360" height="111"/>
|
<rect key="frame" x="3" y="3" width="371" height="111"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<button verticalHuggingPriority="252" translatesAutoresizingMaskIntoConstraints="NO" id="530">
|
<button verticalHuggingPriority="252" translatesAutoresizingMaskIntoConstraints="NO" id="530">
|
||||||
@@ -220,9 +216,9 @@
|
|||||||
<font key="font" metaFont="system"/>
|
<font key="font" metaFont="system"/>
|
||||||
</buttonCell>
|
</buttonCell>
|
||||||
</button>
|
</button>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3Bo-Ml-1KB">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="3Bo-Ml-1KB">
|
||||||
<rect key="frame" x="18" y="45" width="324" height="14"/>
|
<rect key="frame" x="18" y="45" width="335" height="14"/>
|
||||||
<textFieldCell key="cell" controlSize="small" lineBreakMode="clipping" title="Close and open all documents for changes to take effect" id="ya5-ps-c4W">
|
<textFieldCell key="cell" controlSize="small" title="Close and open all documents for changes to take effect" id="ya5-ps-c4W">
|
||||||
<font key="font" metaFont="smallSystem"/>
|
<font key="font" metaFont="smallSystem"/>
|
||||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
@@ -237,7 +233,7 @@
|
|||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<popUpButton verticalHuggingPriority="750" horizontalCompressionResistancePriority="749" translatesAutoresizingMaskIntoConstraints="NO" id="wIu-Sh-2a2">
|
<popUpButton verticalHuggingPriority="750" horizontalCompressionResistancePriority="749" translatesAutoresizingMaskIntoConstraints="NO" id="wIu-Sh-2a2">
|
||||||
<rect key="frame" x="111" y="14" width="232" height="25"/>
|
<rect key="frame" x="111" y="14" width="38" height="25"/>
|
||||||
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="1R2-5t-LWk">
|
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="1R2-5t-LWk">
|
||||||
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||||
<font key="font" metaFont="menu"/>
|
<font key="font" metaFont="menu"/>
|
||||||
@@ -247,7 +243,7 @@
|
|||||||
</subviews>
|
</subviews>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="3Bo-Ml-1KB" firstAttribute="leading" secondItem="cpg-tt-SHE" secondAttribute="leading" constant="20" symbolic="YES" id="2Jh-pk-bN7"/>
|
<constraint firstItem="3Bo-Ml-1KB" firstAttribute="leading" secondItem="cpg-tt-SHE" secondAttribute="leading" constant="20" symbolic="YES" id="2Jh-pk-bN7"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="wIu-Sh-2a2" secondAttribute="trailing" constant="20" id="2Qw-fT-Dd8"/>
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="wIu-Sh-2a2" secondAttribute="trailing" constant="20" id="2Qw-fT-Dd8"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="3Bo-Ml-1KB" secondAttribute="trailing" constant="20" symbolic="YES" id="2UW-ao-hrC"/>
|
<constraint firstAttribute="trailing" secondItem="3Bo-Ml-1KB" secondAttribute="trailing" constant="20" symbolic="YES" id="2UW-ao-hrC"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="h3w-Ms-ohK" secondAttribute="bottom" constant="20" symbolic="YES" id="3KB-kR-5d6"/>
|
<constraint firstAttribute="bottom" secondItem="h3w-Ms-ohK" secondAttribute="bottom" constant="20" symbolic="YES" id="3KB-kR-5d6"/>
|
||||||
<constraint firstItem="h3w-Ms-ohK" firstAttribute="leading" secondItem="530" secondAttribute="leading" id="4Fi-rX-8e0"/>
|
<constraint firstItem="h3w-Ms-ohK" firstAttribute="leading" secondItem="530" secondAttribute="leading" id="4Fi-rX-8e0"/>
|
||||||
@@ -273,11 +269,11 @@
|
|||||||
<constraint firstItem="888" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="891"/>
|
<constraint firstItem="888" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="891"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="888" secondAttribute="trailing" constant="20" symbolic="YES" id="893"/>
|
<constraint firstAttribute="trailing" secondItem="888" secondAttribute="trailing" constant="20" symbolic="YES" id="893"/>
|
||||||
<constraint firstItem="888" firstAttribute="top" secondItem="1" secondAttribute="top" constant="20" symbolic="YES" id="903"/>
|
<constraint firstItem="888" firstAttribute="top" secondItem="1" secondAttribute="top" constant="20" symbolic="YES" id="903"/>
|
||||||
<constraint firstAttribute="width" constant="400" id="918"/>
|
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="400" id="918"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="465" secondAttribute="bottom" constant="20" symbolic="YES" id="uwq-az-XwJ"/>
|
<constraint firstAttribute="bottom" secondItem="465" secondAttribute="bottom" constant="20" symbolic="YES" id="uwq-az-XwJ"/>
|
||||||
<constraint firstItem="465" firstAttribute="top" secondItem="cpg-tt-SHE" secondAttribute="bottom" constant="5" id="wyH-HB-i2U"/>
|
<constraint firstItem="465" firstAttribute="top" secondItem="cpg-tt-SHE" secondAttribute="bottom" constant="5" id="wyH-HB-i2U"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
<point key="canvasLocation" x="-131" y="-93"/>
|
<point key="canvasLocation" x="-136.5" y="-93"/>
|
||||||
</customView>
|
</customView>
|
||||||
</objects>
|
</objects>
|
||||||
</document>
|
</document>
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14460.31"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
<customObject id="-2" userLabel="File's Owner" customClass="MPIntegrationSettingsController">
|
<customObject id="-2" userLabel="File's Owner" customClass="MPIntegrationPreferencesController">
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="autotypeStackView" destination="j52-9L-k7c" id="Mxw-aa-elx"/>
|
<outlet property="autotypeStackView" destination="j52-9L-k7c" id="Mxw-aa-elx"/>
|
||||||
<outlet property="autotypeWarningTextField" destination="hMJ-Mo-xOM" id="LcH-X2-TAm"/>
|
<outlet property="autotypeWarningTextField" destination="hMJ-Mo-xOM" id="LcH-X2-TAm"/>
|
||||||
@@ -26,34 +26,34 @@
|
|||||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||||
<customView translatesAutoresizingMaskIntoConstraints="NO" id="1">
|
<customView translatesAutoresizingMaskIntoConstraints="NO" id="1">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="400" height="463"/>
|
<rect key="frame" x="0.0" y="0.0" width="400" height="449"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<box autoresizesSubviews="NO" verticalHuggingPriority="500" borderType="line" title="Autotype" translatesAutoresizingMaskIntoConstraints="NO" id="P9N-HM-wER">
|
<box autoresizesSubviews="NO" verticalHuggingPriority="500" borderType="line" title="Autotype" translatesAutoresizingMaskIntoConstraints="NO" id="P9N-HM-wER">
|
||||||
<rect key="frame" x="17" y="115" width="366" height="328"/>
|
<rect key="frame" x="17" y="115" width="366" height="314"/>
|
||||||
<view key="contentView" id="faU-Ok-HJ3">
|
<view key="contentView" id="faU-Ok-HJ3">
|
||||||
<rect key="frame" x="3" y="3" width="360" height="310"/>
|
<rect key="frame" x="3" y="3" width="360" height="296"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<stackView orientation="vertical" alignment="leading" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="j52-9L-k7c">
|
<stackView orientation="vertical" alignment="leading" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="j52-9L-k7c">
|
||||||
<rect key="frame" x="16" y="17" width="328" height="283"/>
|
<rect key="frame" x="16" y="17" width="328" height="269"/>
|
||||||
<beginningViews>
|
<beginningViews>
|
||||||
<textField verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="328" translatesAutoresizingMaskIntoConstraints="NO" id="hMJ-Mo-xOM">
|
<textField verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="328" translatesAutoresizingMaskIntoConstraints="NO" id="hMJ-Mo-xOM">
|
||||||
<rect key="frame" x="-2" y="227" width="332" height="56"/>
|
<rect key="frame" x="-2" y="227" width="332" height="42"/>
|
||||||
<textFieldCell key="cell" controlSize="small" id="H37-ku-aTc">
|
<textFieldCell key="cell" controlSize="small" id="H37-ku-aTc">
|
||||||
<font key="font" metaFont="smallSystem"/>
|
<font key="font" metaFont="smallSystem"/>
|
||||||
<string key="title">Autotype is not available, because MacPass is not allowed to control your computer. To enable Autotype, go to the Security and Privacy Preferences and add MacPass to the Accessibilty group. Changes require a restart of MacPass.</string>
|
<string key="title">Autotype might not work properly. Some issues where found that prevent Autotype or Global Autotype to work. Please run the Autotype Doctor to fix those issues.</string>
|
||||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="labelColor" 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>
|
||||||
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="jai-b6-Qv4">
|
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="jai-b6-Qv4">
|
||||||
<rect key="frame" x="-6" y="191" width="160" height="32"/>
|
<rect key="frame" x="-6" y="191" width="177" height="32"/>
|
||||||
<buttonCell key="cell" type="push" title="Open Preferences…" bezelStyle="rounded" alignment="center" borderStyle="border" inset="2" id="NP0-R3-m6n">
|
<buttonCell key="cell" type="push" title="Run Autotype Doctor…" bezelStyle="rounded" alignment="center" borderStyle="border" inset="2" id="NP0-R3-m6n">
|
||||||
<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"/>
|
||||||
</buttonCell>
|
</buttonCell>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="openAccessibiltyPreferences:" target="-2" id="GTg-6Z-6nd"/>
|
<action selector="runAutotypeDoctor:" target="-2" id="u2q-ab-rQY"/>
|
||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<button fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="tik-Ar-FJg">
|
<button fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="tik-Ar-FJg">
|
||||||
@@ -229,7 +229,7 @@
|
|||||||
<constraint firstItem="P9N-HM-wER" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="20" id="ulV-xL-ldJ"/>
|
<constraint firstItem="P9N-HM-wER" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="20" id="ulV-xL-ldJ"/>
|
||||||
<constraint firstItem="VVs-b5-cX9" firstAttribute="leading" secondItem="P9N-HM-wER" secondAttribute="leading" id="z4a-9C-78h"/>
|
<constraint firstItem="VVs-b5-cX9" firstAttribute="leading" secondItem="P9N-HM-wER" secondAttribute="leading" id="z4a-9C-78h"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
<point key="canvasLocation" x="-357" y="-1007.5"/>
|
<point key="canvasLocation" x="-558" y="-1123"/>
|
||||||
</customView>
|
</customView>
|
||||||
</objects>
|
</objects>
|
||||||
</document>
|
</document>
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14313.18" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14313.18"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
|
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
|
||||||
@@ -317,12 +317,18 @@ CA
|
|||||||
</connections>
|
</connections>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
<menuItem isSeparatorItem="YES" id="1176"/>
|
<menuItem isSeparatorItem="YES" id="1176"/>
|
||||||
<menuItem title="Show Password Generator" keyEquivalent="p" id="1200">
|
<menuItem title="Password Generator" keyEquivalent="p" id="1200">
|
||||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="showPasswordCreator:" target="494" id="1202"/>
|
<action selector="showPasswordCreator:" target="494" id="1202"/>
|
||||||
</connections>
|
</connections>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
|
<menuItem title="Autotype Doctor" id="zWx-Re-iuJ">
|
||||||
|
<modifierMask key="keyEquivalentModifierMask"/>
|
||||||
|
<connections>
|
||||||
|
<action selector="showAutotypeDoctor:" target="494" id="fsq-lt-9gZ"/>
|
||||||
|
</connections>
|
||||||
|
</menuItem>
|
||||||
<menuItem isSeparatorItem="YES" id="92">
|
<menuItem isSeparatorItem="YES" id="92">
|
||||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||||
</menuItem>
|
</menuItem>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14460.31"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
|
|||||||
@@ -24,13 +24,13 @@
|
|||||||
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
|
<windowStyleMask key="styleMask" titled="YES" closable="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="403" height="219"/>
|
<rect key="contentRect" x="196" y="240" width="403" height="219"/>
|
||||||
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
|
<rect key="screenRect" x="0.0" y="0.0" width="1280" height="777"/>
|
||||||
<view key="contentView" misplaced="YES" id="2">
|
<view key="contentView" id="2">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="403" height="219"/>
|
<rect key="frame" x="0.0" y="0.0" width="403" height="219"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<pathControl verticalHuggingPriority="750" allowsExpansionToolTips="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4" customClass="MPPathControl">
|
<pathControl verticalHuggingPriority="750" allowsExpansionToolTips="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4" customClass="MPPathControl">
|
||||||
<rect key="frame" x="105" y="87" width="242" height="25"/>
|
<rect key="frame" x="105" y="87" width="242" height="26"/>
|
||||||
<pathCell key="cell" selectable="YES" editable="YES" alignment="left" pathStyle="popUp" id="23">
|
<pathCell key="cell" selectable="YES" editable="YES" alignment="left" pathStyle="popUp" id="23">
|
||||||
<font key="font" metaFont="system"/>
|
<font key="font" metaFont="system"/>
|
||||||
</pathCell>
|
</pathCell>
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6">
|
||||||
<rect key="frame" x="108" y="60" width="236" height="23"/>
|
<rect key="frame" x="108" y="59" width="236" height="25"/>
|
||||||
<buttonCell key="cell" type="roundTextured" title="Generate Keyfile" bezelStyle="texturedRounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="21">
|
<buttonCell key="cell" type="roundTextured" title="Generate Keyfile" bezelStyle="texturedRounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="21">
|
||||||
<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"/>
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="7">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="7">
|
||||||
<rect key="frame" x="352" y="153" width="31" height="23"/>
|
<rect key="frame" x="352" y="153" width="31" height="25"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="width" constant="31" id="59"/>
|
<constraint firstAttribute="width" constant="31" id="59"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
@@ -64,7 +64,7 @@
|
|||||||
</buttonCell>
|
</buttonCell>
|
||||||
</button>
|
</button>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="8">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="8">
|
||||||
<rect key="frame" x="352" y="89" width="31" height="23"/>
|
<rect key="frame" x="352" y="88" width="31" height="25"/>
|
||||||
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSStopProgressTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="19">
|
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSStopProgressTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="19">
|
||||||
<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"/>
|
||||||
@@ -74,7 +74,7 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<secureTextField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9" customClass="HNHUISecureTextField">
|
<secureTextField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9" customClass="HNHUISecureTextField">
|
||||||
<rect key="frame" x="108" y="152" width="236" height="24"/>
|
<rect key="frame" x="108" y="153" width="236" height="24"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="200" id="Gin-yR-DMk"/>
|
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="200" id="Gin-yR-DMk"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
@@ -88,7 +88,7 @@
|
|||||||
</secureTextFieldCell>
|
</secureTextFieldCell>
|
||||||
</secureTextField>
|
</secureTextField>
|
||||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="10">
|
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="10">
|
||||||
<rect key="frame" x="51" y="122" width="51" height="17"/>
|
<rect key="frame" x="51" y="123" width="51" height="17"/>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Repeat:" id="16">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Repeat:" id="16">
|
||||||
<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"/>
|
||||||
@@ -96,7 +96,7 @@
|
|||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<secureTextField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="11" customClass="HNHUISecureTextField">
|
<secureTextField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="11" customClass="HNHUISecureTextField">
|
||||||
<rect key="frame" x="108" y="118" width="236" height="24"/>
|
<rect key="frame" x="108" y="119" width="236" height="24"/>
|
||||||
<secureTextFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="Repeat Password" drawsBackground="YES" usesSingleLineMode="YES" id="15">
|
<secureTextFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="Repeat Password" drawsBackground="YES" usesSingleLineMode="YES" id="15">
|
||||||
<font key="font" size="13" name="Menlo-Regular"/>
|
<font key="font" size="13" name="Menlo-Regular"/>
|
||||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||||
@@ -107,8 +107,8 @@
|
|||||||
</secureTextFieldCell>
|
</secureTextFieldCell>
|
||||||
</secureTextField>
|
</secureTextField>
|
||||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="12">
|
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="12">
|
||||||
<rect key="frame" x="158" y="184" width="136" height="14"/>
|
<rect key="frame" x="161" y="185" width="131" height="14"/>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Missmatching Passwords" id="14">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Mismatching Passwords" id="14">
|
||||||
<font key="font" metaFont="smallSystem"/>
|
<font key="font" metaFont="smallSystem"/>
|
||||||
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
|
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||||
@@ -138,7 +138,7 @@ Gw
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<button horizontalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="yKc-I9-uzv">
|
<button horizontalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="yKc-I9-uzv">
|
||||||
<rect key="frame" x="18" y="155" width="84" height="18"/>
|
<rect key="frame" x="18" y="156" width="84" height="18"/>
|
||||||
<buttonCell key="cell" type="check" title="Password:" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="OQz-DA-SoY">
|
<buttonCell key="cell" type="check" title="Password:" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="OQz-DA-SoY">
|
||||||
<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"/>
|
||||||
@@ -189,7 +189,7 @@ Gw
|
|||||||
<constraint firstItem="6" firstAttribute="leading" secondItem="9" secondAttribute="leading" id="zeJ-6i-fY3"/>
|
<constraint firstItem="6" firstAttribute="leading" secondItem="9" secondAttribute="leading" id="zeJ-6i-fY3"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</view>
|
</view>
|
||||||
<point key="canvasLocation" x="-312" y="-21"/>
|
<point key="canvasLocation" x="-8" y="-14"/>
|
||||||
</window>
|
</window>
|
||||||
</objects>
|
</objects>
|
||||||
<resources>
|
<resources>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14460.31"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
<rect key="frame" x="0.0" y="0.0" width="508" height="392"/>
|
<rect key="frame" x="0.0" y="0.0" width="508" height="392"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2">
|
||||||
<rect key="frame" x="309" y="105" width="83" height="32"/>
|
<rect key="frame" x="310" y="105" width="83" height="32"/>
|
||||||
<buttonCell key="cell" type="push" title="Unlock" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="3">
|
<buttonCell key="cell" type="push" title="Unlock" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="3">
|
||||||
<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"/>
|
||||||
@@ -85,14 +85,14 @@ DQ
|
|||||||
</connections>
|
</connections>
|
||||||
</secureTextField>
|
</secureTextField>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="408">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="408">
|
||||||
<rect key="frame" x="357.5" y="185" width="29" height="23"/>
|
<rect key="frame" x="358" y="185" width="29" height="23"/>
|
||||||
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSQuickLookTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="409">
|
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSQuickLookTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="409">
|
||||||
<behavior key="behavior" pushIn="YES" changeContents="YES" lightByContents="YES"/>
|
<behavior key="behavior" pushIn="YES" changeContents="YES" lightByContents="YES"/>
|
||||||
<font key="font" metaFont="system"/>
|
<font key="font" metaFont="system"/>
|
||||||
</buttonCell>
|
</buttonCell>
|
||||||
</button>
|
</button>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="486">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="486">
|
||||||
<rect key="frame" x="357.5" y="152" width="29" height="23"/>
|
<rect key="frame" x="358" y="152" width="29" height="23"/>
|
||||||
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSStopProgressTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="487">
|
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSStopProgressTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="487">
|
||||||
<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"/>
|
||||||
@@ -109,7 +109,7 @@ DQ
|
|||||||
</buttonCell>
|
</buttonCell>
|
||||||
</button>
|
</button>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2pb-ZG-spA">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2pb-ZG-spA">
|
||||||
<rect key="frame" x="227" y="105" width="82" height="32"/>
|
<rect key="frame" x="228" y="105" width="82" height="32"/>
|
||||||
<buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="erj-mR-UyO">
|
<buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="erj-mR-UyO">
|
||||||
<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"/>
|
||||||
@@ -152,7 +152,7 @@ Gw
|
|||||||
<constraint firstItem="d8O-Ha-rrS" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="vxq-YP-UhR"/>
|
<constraint firstItem="d8O-Ha-rrS" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="vxq-YP-UhR"/>
|
||||||
<constraint firstItem="2" firstAttribute="leading" secondItem="2pb-ZG-spA" secondAttribute="trailing" constant="12" id="ytJ-5Z-5rT"/>
|
<constraint firstItem="2" firstAttribute="leading" secondItem="2pb-ZG-spA" secondAttribute="trailing" constant="12" id="ytJ-5Z-5rT"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
<point key="canvasLocation" x="-217" y="-96"/>
|
<point key="canvasLocation" x="147" y="-80"/>
|
||||||
</customView>
|
</customView>
|
||||||
</objects>
|
</objects>
|
||||||
<resources>
|
<resources>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14313.18" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14313.18"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
@@ -31,6 +31,9 @@
|
|||||||
<buttonCell key="cell" type="push" title="Select" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="6Wi-9i-Tcb">
|
<buttonCell key="cell" type="push" title="Select" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="6Wi-9i-Tcb">
|
||||||
<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"/>
|
||||||
|
<string key="keyEquivalent" base64-UTF8="YES">
|
||||||
|
DQ
|
||||||
|
</string>
|
||||||
</buttonCell>
|
</buttonCell>
|
||||||
<connections>
|
<connections>
|
||||||
<action selector="pickField:" target="-2" id="fLO-qW-oC9"/>
|
<action selector="pickField:" target="-2" id="fLO-qW-oC9"/>
|
||||||
@@ -121,11 +124,11 @@
|
|||||||
</tableView>
|
</tableView>
|
||||||
</subviews>
|
</subviews>
|
||||||
</clipView>
|
</clipView>
|
||||||
<scroller key="horizontalScroller" verticalHuggingPriority="750" horizontal="YES" id="RHy-ph-0lP">
|
<scroller key="horizontalScroller" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="RHy-ph-0lP">
|
||||||
<rect key="frame" x="1" y="255" width="432" height="16"/>
|
<rect key="frame" x="1" y="255" width="432" height="16"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</scroller>
|
</scroller>
|
||||||
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="b5D-WW-IPI">
|
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="b5D-WW-IPI">
|
||||||
<rect key="frame" x="224" y="17" width="15" height="102"/>
|
<rect key="frame" x="224" y="17" width="15" height="102"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
</scroller>
|
</scroller>
|
||||||
|
|||||||
@@ -1,14 +1,15 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14460.31"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
<customObject id="-2" userLabel="File's Owner" customClass="MPPluginPreferencesController">
|
<customObject id="-2" userLabel="File's Owner" customClass="MPPluginPreferencesController">
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="addRemovePluginsControl" destination="B9Q-hq-K4N" id="Oqj-Ko-8UR"/>
|
<outlet property="addRemovePluginsControl" destination="B9Q-hq-K4N" id="Oqj-Ko-8UR"/>
|
||||||
|
<outlet property="allowRemoteConnectionCheckButton" destination="K0z-aD-K2P" id="VDW-fd-evK"/>
|
||||||
<outlet property="fallbackDescriptionTextField" destination="qPL-FR-ky7" id="xCb-ED-NIX"/>
|
<outlet property="fallbackDescriptionTextField" destination="qPL-FR-ky7" id="xCb-ED-NIX"/>
|
||||||
<outlet property="fallbackSettingsView" destination="wIk-iw-Tcz" id="dHl-zW-0aI"/>
|
<outlet property="fallbackSettingsView" destination="wIk-iw-Tcz" id="dHl-zW-0aI"/>
|
||||||
<outlet property="forceIncompatiblePluginsCheckButton" destination="XIl-03-JZP" id="Aj4-rc-Ao0"/>
|
<outlet property="forceIncompatiblePluginsCheckButton" destination="XIl-03-JZP" id="Aj4-rc-Ao0"/>
|
||||||
@@ -21,19 +22,19 @@
|
|||||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||||
<customView translatesAutoresizingMaskIntoConstraints="NO" id="Hz6-mo-xeY">
|
<customView translatesAutoresizingMaskIntoConstraints="NO" id="Hz6-mo-xeY">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="600" height="473"/>
|
<rect key="frame" x="0.0" y="0.0" width="607" height="502"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<box borderType="line" title="Box" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="vBs-Ga-aq0">
|
<box borderType="line" title="Box" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="vBs-Ga-aq0">
|
||||||
<rect key="frame" x="175" y="46" width="408" height="321"/>
|
<rect key="frame" x="175" y="46" width="415" height="306"/>
|
||||||
<view key="contentView" id="tD5-Na-7XI">
|
<view key="contentView" id="tD5-Na-7XI">
|
||||||
<rect key="frame" x="3" y="3" width="402" height="315"/>
|
<rect key="frame" x="3" y="3" width="409" height="300"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<customView translatesAutoresizingMaskIntoConstraints="NO" id="wIk-iw-Tcz">
|
<customView translatesAutoresizingMaskIntoConstraints="NO" id="wIk-iw-Tcz">
|
||||||
<rect key="frame" x="20" y="20" width="362" height="275"/>
|
<rect key="frame" x="20" y="20" width="369" height="260"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="qPL-FR-ky7">
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="qPL-FR-ky7">
|
||||||
<rect key="frame" x="18" y="238" width="326" height="17"/>
|
<rect key="frame" x="18" y="223" width="333" height="17"/>
|
||||||
<textFieldCell key="cell" controlSize="mini" sendsActionOnEndEditing="YES" title="Plugin Settings Info" id="OOr-SW-jZb">
|
<textFieldCell key="cell" controlSize="mini" sendsActionOnEndEditing="YES" title="Plugin Settings Info" id="OOr-SW-jZb">
|
||||||
<font key="font" metaFont="system"/>
|
<font key="font" metaFont="system"/>
|
||||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||||
@@ -58,14 +59,14 @@
|
|||||||
</view>
|
</view>
|
||||||
</box>
|
</box>
|
||||||
<button translatesAutoresizingMaskIntoConstraints="NO" id="CqP-oK-S8k">
|
<button translatesAutoresizingMaskIntoConstraints="NO" id="CqP-oK-S8k">
|
||||||
<rect key="frame" x="18" y="437" width="159" height="18"/>
|
<rect key="frame" x="18" y="422" width="159" height="18"/>
|
||||||
<buttonCell key="cell" type="check" title="Load unsecure Plugins" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="C4B-6z-ZqX">
|
<buttonCell key="cell" type="check" title="Load unsecure Plugins" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="C4B-6z-ZqX">
|
||||||
<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 horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="aoG-FD-ds8">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="aoG-FD-ds8">
|
||||||
<rect key="frame" x="18" y="403" width="564" height="28"/>
|
<rect key="frame" x="18" y="388" width="571" height="28"/>
|
||||||
<textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" id="2bX-8S-9XM">
|
<textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" id="2bX-8S-9XM">
|
||||||
<font key="font" metaFont="smallSystem"/>
|
<font key="font" metaFont="smallSystem"/>
|
||||||
<string key="title">If enabled, Plugins without proper signatures will be allowed to load. Keep in mind, that Plugins have full access to your data! Changes take affect on restart.</string>
|
<string key="title">If enabled, Plugins without proper signatures will be allowed to load. Keep in mind, that Plugins have full access to your data! Changes take affect on restart.</string>
|
||||||
@@ -74,13 +75,13 @@
|
|||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<scrollView autohidesScrollers="YES" horizontalLineScroll="37" horizontalPageScroll="10" verticalLineScroll="37" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fCk-fL-jU8">
|
<scrollView autohidesScrollers="YES" horizontalLineScroll="37" horizontalPageScroll="10" verticalLineScroll="37" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fCk-fL-jU8">
|
||||||
<rect key="frame" x="20" y="50" width="150" height="315"/>
|
<rect key="frame" x="20" y="50" width="150" height="300"/>
|
||||||
<clipView key="contentView" id="lTL-Q2-k45">
|
<clipView key="contentView" id="lTL-Q2-k45">
|
||||||
<rect key="frame" x="1" y="1" width="148" height="313"/>
|
<rect key="frame" x="1" y="1" width="148" height="298"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnSelection="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="35" rowSizeStyle="automatic" viewBased="YES" id="Ocu-C0-03d">
|
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnSelection="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="35" rowSizeStyle="automatic" viewBased="YES" id="Ocu-C0-03d">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="148" height="313"/>
|
<rect key="frame" x="0.0" y="0.0" width="148" height="298"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<size key="intercellSpacing" width="3" height="2"/>
|
<size key="intercellSpacing" width="3" height="2"/>
|
||||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
@@ -104,7 +105,7 @@
|
|||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="q1P-PD-0LW">
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="q1P-PD-0LW">
|
||||||
<rect key="frame" x="0.0" y="18" width="127" height="17"/>
|
<rect key="frame" x="0.0" y="18" width="145" height="17"/>
|
||||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Table View Cell" id="fug-79-n9g">
|
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Table View Cell" id="fug-79-n9g">
|
||||||
<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"/>
|
||||||
@@ -125,7 +126,7 @@
|
|||||||
<constraint firstAttribute="trailing" secondItem="fQy-Sz-4VA" secondAttribute="trailing" constant="2" id="Iy0-iV-Mbx"/>
|
<constraint firstAttribute="trailing" secondItem="fQy-Sz-4VA" secondAttribute="trailing" constant="2" id="Iy0-iV-Mbx"/>
|
||||||
<constraint firstItem="fQy-Sz-4VA" firstAttribute="top" secondItem="q1P-PD-0LW" secondAttribute="bottom" constant="2" id="RZb-58-Zwr"/>
|
<constraint firstItem="fQy-Sz-4VA" firstAttribute="top" secondItem="q1P-PD-0LW" secondAttribute="bottom" constant="2" id="RZb-58-Zwr"/>
|
||||||
<constraint firstItem="q1P-PD-0LW" firstAttribute="leading" secondItem="vVt-P3-yLp" secondAttribute="leading" constant="2" id="bTc-2c-BYB"/>
|
<constraint firstItem="q1P-PD-0LW" firstAttribute="leading" secondItem="vVt-P3-yLp" secondAttribute="leading" constant="2" id="bTc-2c-BYB"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="q1P-PD-0LW" secondAttribute="trailing" constant="20" symbolic="YES" id="gSi-vN-xzX"/>
|
<constraint firstAttribute="trailing" secondItem="q1P-PD-0LW" secondAttribute="trailing" constant="2" id="gSi-vN-xzX"/>
|
||||||
<constraint firstItem="q1P-PD-0LW" firstAttribute="top" secondItem="vVt-P3-yLp" secondAttribute="top" id="tTs-2E-33f"/>
|
<constraint firstItem="q1P-PD-0LW" firstAttribute="top" secondItem="vVt-P3-yLp" secondAttribute="top" id="tTs-2E-33f"/>
|
||||||
<constraint firstItem="fQy-Sz-4VA" firstAttribute="leading" secondItem="vVt-P3-yLp" secondAttribute="leading" constant="2" id="zLP-Ci-nUM"/>
|
<constraint firstItem="fQy-Sz-4VA" firstAttribute="leading" secondItem="vVt-P3-yLp" secondAttribute="leading" constant="2" id="zLP-Ci-nUM"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
@@ -167,7 +168,7 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</segmentedControl>
|
</segmentedControl>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="SNe-cc-CZs">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="SNe-cc-CZs">
|
||||||
<rect key="frame" x="406" y="19" width="174" height="23"/>
|
<rect key="frame" x="413" y="19" width="174" height="23"/>
|
||||||
<buttonCell key="cell" type="roundTextured" title="Browse Available Plugins…" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="sqO-8H-n1y">
|
<buttonCell key="cell" type="roundTextured" title="Browse Available Plugins…" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="sqO-8H-n1y">
|
||||||
<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"/>
|
||||||
@@ -177,30 +178,51 @@
|
|||||||
</connections>
|
</connections>
|
||||||
</button>
|
</button>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XIl-03-JZP">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="XIl-03-JZP">
|
||||||
<rect key="frame" x="18" y="371" width="250" height="18"/>
|
<rect key="frame" x="18" y="356" width="250" height="18"/>
|
||||||
<buttonCell key="cell" type="check" title="Force loading of incompatible Plugins" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="yak-fS-jtA">
|
<buttonCell key="cell" type="check" title="Force loading of incompatible Plugins" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="yak-fS-jtA">
|
||||||
<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 verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="K0z-aD-K2P">
|
||||||
|
<rect key="frame" x="18" y="466" width="243" height="18"/>
|
||||||
|
<buttonCell key="cell" type="check" title="Download current plugin information" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="uHR-uL-Ddm">
|
||||||
|
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
</buttonCell>
|
||||||
|
</button>
|
||||||
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="nrf-Hz-0vB">
|
||||||
|
<rect key="frame" x="18" y="446" width="349" height="14"/>
|
||||||
|
<textFieldCell key="cell" controlSize="small" selectable="YES" title="If enabled, a remote connection is established to macpassapp.org" id="i3S-9b-Bpf">
|
||||||
|
<font key="font" metaFont="smallSystem"/>
|
||||||
|
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
</textFieldCell>
|
||||||
|
</textField>
|
||||||
</subviews>
|
</subviews>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="CqP-oK-S8k" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" id="1Rj-zS-7t2"/>
|
<constraint firstItem="CqP-oK-S8k" firstAttribute="top" secondItem="nrf-Hz-0vB" secondAttribute="bottom" constant="8" symbolic="YES" id="1Rj-zS-7t2"/>
|
||||||
<constraint firstItem="XIl-03-JZP" firstAttribute="top" secondItem="aoG-FD-ds8" secondAttribute="bottom" constant="16" id="2Wk-4D-AHu"/>
|
<constraint firstItem="XIl-03-JZP" firstAttribute="top" secondItem="aoG-FD-ds8" secondAttribute="bottom" constant="16" id="2Wk-4D-AHu"/>
|
||||||
<constraint firstItem="vBs-Ga-aq0" firstAttribute="top" secondItem="fCk-fL-jU8" secondAttribute="top" id="2h6-C9-4N5"/>
|
<constraint firstItem="vBs-Ga-aq0" firstAttribute="top" secondItem="fCk-fL-jU8" secondAttribute="top" id="2h6-C9-4N5"/>
|
||||||
|
<constraint firstItem="nrf-Hz-0vB" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="2hE-FW-30g"/>
|
||||||
<constraint firstItem="B9Q-hq-K4N" firstAttribute="top" secondItem="fCk-fL-jU8" secondAttribute="bottom" constant="8" symbolic="YES" id="3vA-Oh-cFO"/>
|
<constraint firstItem="B9Q-hq-K4N" firstAttribute="top" secondItem="fCk-fL-jU8" secondAttribute="bottom" constant="8" symbolic="YES" id="3vA-Oh-cFO"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="B9Q-hq-K4N" secondAttribute="bottom" constant="20" symbolic="YES" id="7HD-ji-Whc"/>
|
<constraint firstAttribute="bottom" secondItem="B9Q-hq-K4N" secondAttribute="bottom" constant="20" symbolic="YES" id="7HD-ji-Whc"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="SNe-cc-CZs" secondAttribute="trailing" constant="20" symbolic="YES" id="8Je-yg-f1l"/>
|
<constraint firstAttribute="trailing" secondItem="SNe-cc-CZs" secondAttribute="trailing" constant="20" symbolic="YES" id="8Je-yg-f1l"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="aoG-FD-ds8" secondAttribute="trailing" constant="20" symbolic="YES" id="95O-Jh-0KG"/>
|
<constraint firstAttribute="trailing" secondItem="aoG-FD-ds8" secondAttribute="trailing" constant="20" symbolic="YES" id="95O-Jh-0KG"/>
|
||||||
<constraint firstItem="vBs-Ga-aq0" firstAttribute="bottom" secondItem="fCk-fL-jU8" secondAttribute="bottom" id="BQ2-Wp-Fsh"/>
|
<constraint firstItem="vBs-Ga-aq0" firstAttribute="bottom" secondItem="fCk-fL-jU8" secondAttribute="bottom" id="BQ2-Wp-Fsh"/>
|
||||||
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="K0z-aD-K2P" secondAttribute="trailing" constant="20" symbolic="YES" id="CFf-LD-G7q"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="SNe-cc-CZs" secondAttribute="bottom" constant="20" symbolic="YES" id="Fqe-ch-vsS"/>
|
<constraint firstAttribute="bottom" secondItem="SNe-cc-CZs" secondAttribute="bottom" constant="20" symbolic="YES" id="Fqe-ch-vsS"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="vBs-Ga-aq0" secondAttribute="trailing" constant="20" id="LUb-Un-azV"/>
|
<constraint firstAttribute="trailing" secondItem="vBs-Ga-aq0" secondAttribute="trailing" constant="20" id="LUb-Un-azV"/>
|
||||||
<constraint firstItem="aoG-FD-ds8" firstAttribute="leading" secondItem="CqP-oK-S8k" secondAttribute="leading" id="NcW-ya-DPx"/>
|
<constraint firstItem="aoG-FD-ds8" firstAttribute="leading" secondItem="CqP-oK-S8k" secondAttribute="leading" id="NcW-ya-DPx"/>
|
||||||
<constraint firstItem="B9Q-hq-K4N" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="Rtj-Ad-zkg"/>
|
<constraint firstItem="B9Q-hq-K4N" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="Rtj-Ad-zkg"/>
|
||||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="CqP-oK-S8k" secondAttribute="trailing" constant="20" symbolic="YES" id="TXL-mf-nxu"/>
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="CqP-oK-S8k" secondAttribute="trailing" constant="20" symbolic="YES" id="TXL-mf-nxu"/>
|
||||||
|
<constraint firstItem="K0z-aD-K2P" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="XzM-3L-OgP"/>
|
||||||
<constraint firstItem="SNe-cc-CZs" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="B9Q-hq-K4N" secondAttribute="trailing" constant="8" symbolic="YES" id="a62-en-kDA"/>
|
<constraint firstItem="SNe-cc-CZs" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="B9Q-hq-K4N" secondAttribute="trailing" constant="8" symbolic="YES" id="a62-en-kDA"/>
|
||||||
<constraint firstItem="fCk-fL-jU8" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" id="fzW-4b-L8S"/>
|
<constraint firstItem="fCk-fL-jU8" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" id="fzW-4b-L8S"/>
|
||||||
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="nrf-Hz-0vB" secondAttribute="trailing" constant="20" symbolic="YES" id="hMs-HE-d8h"/>
|
||||||
|
<constraint firstItem="nrf-Hz-0vB" firstAttribute="top" secondItem="K0z-aD-K2P" secondAttribute="bottom" constant="8" symbolic="YES" id="ohE-9y-xO4"/>
|
||||||
<constraint firstItem="XIl-03-JZP" firstAttribute="leading" secondItem="CqP-oK-S8k" secondAttribute="leading" id="oqX-wa-jm0"/>
|
<constraint firstItem="XIl-03-JZP" firstAttribute="leading" secondItem="CqP-oK-S8k" secondAttribute="leading" id="oqX-wa-jm0"/>
|
||||||
|
<constraint firstItem="K0z-aD-K2P" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" symbolic="YES" id="q4N-Jc-F3L"/>
|
||||||
<constraint firstItem="SNe-cc-CZs" firstAttribute="top" secondItem="vBs-Ga-aq0" secondAttribute="bottom" constant="8" symbolic="YES" id="r4X-iM-iYU"/>
|
<constraint firstItem="SNe-cc-CZs" firstAttribute="top" secondItem="vBs-Ga-aq0" secondAttribute="bottom" constant="8" symbolic="YES" id="r4X-iM-iYU"/>
|
||||||
<constraint firstItem="CqP-oK-S8k" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" id="rN1-3Z-BBi"/>
|
<constraint firstItem="CqP-oK-S8k" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" id="rN1-3Z-BBi"/>
|
||||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="XIl-03-JZP" secondAttribute="trailing" constant="20" symbolic="YES" id="rkN-ew-RtP"/>
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="XIl-03-JZP" secondAttribute="trailing" constant="20" symbolic="YES" id="rkN-ew-RtP"/>
|
||||||
@@ -208,7 +230,7 @@
|
|||||||
<constraint firstItem="vBs-Ga-aq0" firstAttribute="leading" secondItem="fCk-fL-jU8" secondAttribute="trailing" constant="8" id="xNu-Sj-xQO"/>
|
<constraint firstItem="vBs-Ga-aq0" firstAttribute="leading" secondItem="fCk-fL-jU8" secondAttribute="trailing" constant="8" id="xNu-Sj-xQO"/>
|
||||||
<constraint firstItem="aoG-FD-ds8" firstAttribute="top" secondItem="CqP-oK-S8k" secondAttribute="bottom" constant="8" symbolic="YES" id="zSW-h3-BrT"/>
|
<constraint firstItem="aoG-FD-ds8" firstAttribute="top" secondItem="CqP-oK-S8k" secondAttribute="bottom" constant="8" symbolic="YES" id="zSW-h3-BrT"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
<point key="canvasLocation" x="110" y="-97"/>
|
<point key="canvasLocation" x="179" y="115"/>
|
||||||
</customView>
|
</customView>
|
||||||
</objects>
|
</objects>
|
||||||
<resources>
|
<resources>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14460.31"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
@@ -228,7 +228,7 @@
|
|||||||
<constraint firstItem="bGv-Zc-Vrk" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" id="tk3-kF-k22"/>
|
<constraint firstItem="bGv-Zc-Vrk" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" id="tk3-kF-k22"/>
|
||||||
<constraint firstItem="d2Q-7O-ilP" firstAttribute="leading" secondItem="fjQ-ni-Ayx" secondAttribute="trailing" constant="8" symbolic="YES" id="wHQ-Lk-2fv"/>
|
<constraint firstItem="d2Q-7O-ilP" firstAttribute="leading" secondItem="fjQ-ni-Ayx" secondAttribute="trailing" constant="8" symbolic="YES" id="wHQ-Lk-2fv"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
<point key="canvasLocation" x="-130" y="-66"/>
|
<point key="canvasLocation" x="193" y="-18"/>
|
||||||
</customView>
|
</customView>
|
||||||
</objects>
|
</objects>
|
||||||
</document>
|
</document>
|
||||||
@@ -1,11 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="10117" systemVersion="15G31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="10117"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
||||||
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
<customObject id="-2" userLabel="File's Owner" customClass="MPUpdateSettingsController">
|
<customObject id="-2" userLabel="File's Owner" customClass="MPUpdatePreferencesController">
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="automaticallyCheckForUpdatesCheckButton" destination="Z6x-oU-NC5" id="xHU-Lt-PmA"/>
|
<outlet property="automaticallyCheckForUpdatesCheckButton" destination="Z6x-oU-NC5" id="xHU-Lt-PmA"/>
|
||||||
<outlet property="checkIntervallPopupButton" destination="pWJ-eJ-MBf" id="znu-Me-2Me"/>
|
<outlet property="checkIntervallPopupButton" destination="pWJ-eJ-MBf" id="znu-Me-2Me"/>
|
||||||
@@ -17,8 +18,8 @@
|
|||||||
<customView translatesAutoresizingMaskIntoConstraints="NO" id="1">
|
<customView translatesAutoresizingMaskIntoConstraints="NO" id="1">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="400" height="95"/>
|
<rect key="frame" x="0.0" y="0.0" width="400" height="95"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<button verticalHuggingPriority="500" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Z6x-oU-NC5">
|
<button verticalHuggingPriority="500" translatesAutoresizingMaskIntoConstraints="NO" id="Z6x-oU-NC5">
|
||||||
<rect key="frame" x="21" y="59" width="228" height="18"/>
|
<rect key="frame" x="22" y="59" width="221" height="18"/>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstAttribute="height" constant="14" id="ppB-Ka-SVN"/>
|
<constraint firstAttribute="height" constant="14" id="ppB-Ka-SVN"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
@@ -27,8 +28,8 @@
|
|||||||
<font key="font" metaFont="system"/>
|
<font key="font" metaFont="system"/>
|
||||||
</buttonCell>
|
</buttonCell>
|
||||||
</button>
|
</button>
|
||||||
<popUpButton verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="pWJ-eJ-MBf">
|
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="pWJ-eJ-MBf">
|
||||||
<rect key="frame" x="145" y="17" width="112" height="26"/>
|
<rect key="frame" x="144" y="17" width="114" height="25"/>
|
||||||
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="Hl5-gO-B1c">
|
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="Hl5-gO-B1c">
|
||||||
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||||
<font key="font" metaFont="menu"/>
|
<font key="font" metaFont="menu"/>
|
||||||
@@ -44,8 +45,8 @@
|
|||||||
</menu>
|
</menu>
|
||||||
</popUpButtonCell>
|
</popUpButtonCell>
|
||||||
</popUpButton>
|
</popUpButton>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ckg-9t-MDS">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ckg-9t-MDS">
|
||||||
<rect key="frame" x="21" y="23" width="120" height="17"/>
|
<rect key="frame" x="22" y="22" width="118" height="17"/>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Check for Updates" id="9tL-CA-Vdg">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Check for Updates" id="9tL-CA-Vdg">
|
||||||
<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"/>
|
||||||
@@ -61,10 +62,11 @@
|
|||||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="pWJ-eJ-MBf" secondAttribute="trailing" constant="20" symbolic="YES" id="QsU-uT-lfo"/>
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="pWJ-eJ-MBf" secondAttribute="trailing" constant="20" symbolic="YES" id="QsU-uT-lfo"/>
|
||||||
<constraint firstItem="ckg-9t-MDS" firstAttribute="leading" secondItem="Z6x-oU-NC5" secondAttribute="leading" id="W0y-Rp-Ucq"/>
|
<constraint firstItem="ckg-9t-MDS" firstAttribute="leading" secondItem="Z6x-oU-NC5" secondAttribute="leading" id="W0y-Rp-Ucq"/>
|
||||||
<constraint firstItem="pWJ-eJ-MBf" firstAttribute="top" secondItem="Z6x-oU-NC5" secondAttribute="bottom" constant="20" symbolic="YES" id="fhM-Ri-Op9"/>
|
<constraint firstItem="pWJ-eJ-MBf" firstAttribute="top" secondItem="Z6x-oU-NC5" secondAttribute="bottom" constant="20" symbolic="YES" id="fhM-Ri-Op9"/>
|
||||||
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Z6x-oU-NC5" secondAttribute="trailing" constant="20" symbolic="YES" id="mpe-6b-p3W"/>
|
||||||
<constraint firstItem="ckg-9t-MDS" firstAttribute="baseline" secondItem="pWJ-eJ-MBf" secondAttribute="baseline" id="ozZ-bW-f7y"/>
|
<constraint firstItem="ckg-9t-MDS" firstAttribute="baseline" secondItem="pWJ-eJ-MBf" secondAttribute="baseline" id="ozZ-bW-f7y"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="pWJ-eJ-MBf" secondAttribute="bottom" constant="20" symbolic="YES" id="pHW-e8-EU6"/>
|
<constraint firstAttribute="bottom" secondItem="pWJ-eJ-MBf" secondAttribute="bottom" constant="20" symbolic="YES" id="pHW-e8-EU6"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
<point key="canvasLocation" x="504" y="511.5"/>
|
<point key="canvasLocation" x="21" y="2"/>
|
||||||
</customView>
|
</customView>
|
||||||
</objects>
|
</objects>
|
||||||
</document>
|
</document>
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14460.31"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
@@ -187,7 +187,7 @@
|
|||||||
<constraint firstItem="ITj-5P-sn9" firstAttribute="leading" secondItem="9Nv-Zl-Z9p" secondAttribute="leading" constant="20" id="oWL-PJ-VCT"/>
|
<constraint firstItem="ITj-5P-sn9" firstAttribute="leading" secondItem="9Nv-Zl-Z9p" secondAttribute="leading" constant="20" id="oWL-PJ-VCT"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="ITj-5P-sn9" secondAttribute="bottom" id="syW-TO-uwv"/>
|
<constraint firstAttribute="bottom" secondItem="ITj-5P-sn9" secondAttribute="bottom" id="syW-TO-uwv"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
<point key="canvasLocation" x="-378" y="-552"/>
|
<point key="canvasLocation" x="-680" y="-522"/>
|
||||||
</view>
|
</view>
|
||||||
</objects>
|
</objects>
|
||||||
<resources>
|
<resources>
|
||||||
|
|||||||
@@ -1,16 +1,17 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="10117" systemVersion="15G31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="10117"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
||||||
<capability name="box content view" minToolsVersion="7.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
<customObject id="-2" userLabel="File's Owner" customClass="MPWorkflowSettingsController">
|
<customObject id="-2" userLabel="File's Owner" customClass="MPWorkflowPreferencesController">
|
||||||
<connections>
|
<connections>
|
||||||
<outlet property="browserPopup" destination="ehI-gq-lsb" id="YMy-L1-pQw"/>
|
<outlet property="browserPopup" destination="ehI-gq-lsb" id="YMy-L1-pQw"/>
|
||||||
<outlet property="doubleClickTitlePopup" destination="40" id="aKJ-q9-xjb"/>
|
<outlet property="doubleClickTitlePopup" destination="40" id="aKJ-q9-xjb"/>
|
||||||
<outlet property="doubleClickURLPopup" destination="13" id="fGP-5I-0XK"/>
|
<outlet property="doubleClickURLPopup" destination="13" id="fGP-5I-0XK"/>
|
||||||
|
<outlet property="hideAfterCopyToClipboardCheckButton" destination="vT4-wF-ned" id="d7e-vc-cAQ"/>
|
||||||
<outlet property="updatePasswordOnTemplateEntriesCheckButton" destination="LPY-sM-hjS" id="wav-op-uck"/>
|
<outlet property="updatePasswordOnTemplateEntriesCheckButton" destination="LPY-sM-hjS" id="wav-op-uck"/>
|
||||||
<outlet property="view" destination="1" id="52"/>
|
<outlet property="view" destination="1" id="52"/>
|
||||||
</connections>
|
</connections>
|
||||||
@@ -18,16 +19,16 @@
|
|||||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||||
<customView translatesAutoresizingMaskIntoConstraints="NO" id="1">
|
<customView translatesAutoresizingMaskIntoConstraints="NO" id="1">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="400" height="231"/>
|
<rect key="frame" x="0.0" y="0.0" width="400" height="315"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<box autoresizesSubviews="NO" verticalHuggingPriority="500" title="Entry Table" borderType="line" translatesAutoresizingMaskIntoConstraints="NO" id="2">
|
<box autoresizesSubviews="NO" verticalHuggingPriority="500" borderType="line" title="Entry Table" translatesAutoresizingMaskIntoConstraints="NO" id="2">
|
||||||
<rect key="frame" x="17" y="90" width="366" height="92"/>
|
<rect key="frame" x="17" y="166" width="366" height="100"/>
|
||||||
<view key="contentView" id="cfa-nq-Kzt">
|
<view key="contentView" id="cfa-nq-Kzt">
|
||||||
<rect key="frame" x="1" y="1" width="364" height="76"/>
|
<rect key="frame" x="3" y="3" width="360" height="82"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9">
|
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9">
|
||||||
<rect key="frame" x="17" y="47" width="133" height="17"/>
|
<rect key="frame" x="18" y="53" width="134" height="17"/>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Double-click on URL:" id="10">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Double-click on URL:" id="10">
|
||||||
<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"/>
|
||||||
@@ -35,7 +36,7 @@
|
|||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="13">
|
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="13">
|
||||||
<rect key="frame" x="154" y="42" width="108" height="26"/>
|
<rect key="frame" x="156" y="48" width="109" height="25"/>
|
||||||
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="14">
|
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="14">
|
||||||
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||||
<font key="font" metaFont="menu"/>
|
<font key="font" metaFont="menu"/>
|
||||||
@@ -48,7 +49,7 @@
|
|||||||
</popUpButtonCell>
|
</popUpButtonCell>
|
||||||
</popUpButton>
|
</popUpButton>
|
||||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="36">
|
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="36">
|
||||||
<rect key="frame" x="16" y="16" width="134" height="17"/>
|
<rect key="frame" x="18" y="22" width="134" height="17"/>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" enabled="NO" sendsActionOnEndEditing="YES" title="Double-click on Title:" id="37">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" enabled="NO" sendsActionOnEndEditing="YES" title="Double-click on Title:" id="37">
|
||||||
<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"/>
|
||||||
@@ -56,7 +57,7 @@
|
|||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="40">
|
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="40">
|
||||||
<rect key="frame" x="154" y="11" width="138" height="26"/>
|
<rect key="frame" x="156" y="17" width="139" height="25"/>
|
||||||
<popUpButtonCell key="cell" type="push" title="Opens Inspector" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="44" id="41">
|
<popUpButtonCell key="cell" type="push" title="Opens Inspector" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="44" id="41">
|
||||||
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||||
<font key="font" metaFont="menu"/>
|
<font key="font" metaFont="menu"/>
|
||||||
@@ -69,24 +70,27 @@
|
|||||||
</popUpButtonCell>
|
</popUpButtonCell>
|
||||||
</popUpButton>
|
</popUpButton>
|
||||||
</subviews>
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="40" secondAttribute="trailing" constant="20" symbolic="YES" id="3iK-WD-tbs"/>
|
||||||
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="13" secondAttribute="trailing" constant="20" symbolic="YES" id="EQn-DK-viK"/>
|
||||||
|
<constraint firstItem="9" firstAttribute="leading" secondItem="cfa-nq-Kzt" secondAttribute="leading" constant="20" symbolic="YES" id="FHR-zo-tjR"/>
|
||||||
|
<constraint firstItem="9" firstAttribute="firstBaseline" secondItem="13" secondAttribute="firstBaseline" id="Swb-ay-7G0"/>
|
||||||
|
<constraint firstItem="36" firstAttribute="firstBaseline" secondItem="40" secondAttribute="firstBaseline" id="dWh-SS-Sc4"/>
|
||||||
|
<constraint firstItem="36" firstAttribute="leading" secondItem="cfa-nq-Kzt" secondAttribute="leading" constant="20" symbolic="YES" id="eqy-R2-mpP"/>
|
||||||
|
<constraint firstAttribute="bottom" secondItem="40" secondAttribute="bottom" constant="20" symbolic="YES" id="lle-u8-JWP"/>
|
||||||
|
</constraints>
|
||||||
</view>
|
</view>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="13" firstAttribute="leading" secondItem="9" secondAttribute="trailing" constant="8" symbolic="YES" id="1WE-nm-pp2"/>
|
<constraint firstItem="13" firstAttribute="leading" secondItem="9" secondAttribute="trailing" constant="8" symbolic="YES" id="1WE-nm-pp2"/>
|
||||||
<constraint firstItem="40" firstAttribute="centerY" secondItem="36" secondAttribute="centerY" id="1hi-oU-uNn"/>
|
<constraint firstItem="40" firstAttribute="centerY" secondItem="36" secondAttribute="centerY" id="1hi-oU-uNn"/>
|
||||||
<constraint firstItem="36" firstAttribute="leading" secondItem="2" secondAttribute="leading" constant="16" id="MEC-5G-cdx"/>
|
|
||||||
<constraint firstItem="13" firstAttribute="top" secondItem="2" secondAttribute="top" constant="25" id="Nd9-4H-y8b"/>
|
<constraint firstItem="13" firstAttribute="top" secondItem="2" secondAttribute="top" constant="25" id="Nd9-4H-y8b"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="40" secondAttribute="bottom" constant="11" id="OcJ-8r-v55"/>
|
|
||||||
<constraint firstItem="36" firstAttribute="centerY" secondItem="40" secondAttribute="centerY" id="Rts-Ze-x1u"/>
|
|
||||||
<constraint firstItem="40" firstAttribute="top" secondItem="13" secondAttribute="bottom" constant="10" symbolic="YES" id="YWX-K2-P8C"/>
|
<constraint firstItem="40" firstAttribute="top" secondItem="13" secondAttribute="bottom" constant="10" symbolic="YES" id="YWX-K2-P8C"/>
|
||||||
<constraint firstItem="13" firstAttribute="centerY" secondItem="9" secondAttribute="centerY" id="YqK-Q6-jmb"/>
|
|
||||||
<constraint firstItem="13" firstAttribute="leading" secondItem="40" secondAttribute="leading" id="mih-x6-1K0"/>
|
<constraint firstItem="13" firstAttribute="leading" secondItem="40" secondAttribute="leading" id="mih-x6-1K0"/>
|
||||||
<constraint firstItem="40" firstAttribute="leading" secondItem="36" secondAttribute="trailing" constant="8" symbolic="YES" id="tsy-wg-saI"/>
|
<constraint firstItem="40" firstAttribute="leading" secondItem="36" secondAttribute="trailing" constant="8" symbolic="YES" id="tsy-wg-saI"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
<color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
|
|
||||||
<color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
|
||||||
</box>
|
</box>
|
||||||
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ehI-gq-lsb">
|
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ehI-gq-lsb">
|
||||||
<rect key="frame" x="115" y="187" width="134" height="26"/>
|
<rect key="frame" x="113" y="271" width="135" height="25"/>
|
||||||
<popUpButtonCell key="cell" type="push" title="Default Browser" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="7YX-EA-9KA" id="7Ip-sU-sAK">
|
<popUpButtonCell key="cell" type="push" title="Default Browser" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="7YX-EA-9KA" id="7Ip-sU-sAK">
|
||||||
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||||
<font key="font" metaFont="menu"/>
|
<font key="font" metaFont="menu"/>
|
||||||
@@ -100,21 +104,21 @@
|
|||||||
</popUpButtonCell>
|
</popUpButtonCell>
|
||||||
</popUpButton>
|
</popUpButton>
|
||||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="lOo-NI-b07">
|
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="lOo-NI-b07">
|
||||||
<rect key="frame" x="20" y="190" width="91" height="21"/>
|
<rect key="frame" x="18" y="274" width="91" height="19"/>
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" enabled="NO" sendsActionOnEndEditing="YES" title="Open URLs in:" id="soD-wI-YOH">
|
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" enabled="NO" sendsActionOnEndEditing="YES" title="Open URLs in:" id="soD-wI-YOH">
|
||||||
<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>
|
||||||
<box title="Templates" borderType="line" translatesAutoresizingMaskIntoConstraints="NO" id="Xvt-tP-TbR">
|
<box borderType="line" title="Templates" translatesAutoresizingMaskIntoConstraints="NO" id="Xvt-tP-TbR">
|
||||||
<rect key="frame" x="17" y="16" width="366" height="70"/>
|
<rect key="frame" x="17" y="92" width="366" height="72"/>
|
||||||
<view key="contentView" id="g0i-00-sng">
|
<view key="contentView" id="g0i-00-sng">
|
||||||
<rect key="frame" x="1" y="1" width="364" height="54"/>
|
<rect key="frame" x="3" y="3" width="360" height="54"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="LPY-sM-hjS">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="LPY-sM-hjS">
|
||||||
<rect key="frame" x="18" y="18" width="328" height="18"/>
|
<rect key="frame" x="18" y="18" width="222" height="18"/>
|
||||||
<buttonCell key="cell" type="check" title="Update password for new entries" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="RaM-t2-DVR">
|
<buttonCell key="cell" type="check" title="Update password for new entries" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="RaM-t2-DVR">
|
||||||
<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"/>
|
||||||
@@ -125,31 +129,53 @@
|
|||||||
<constraint firstItem="LPY-sM-hjS" firstAttribute="top" secondItem="g0i-00-sng" secondAttribute="top" constant="20" symbolic="YES" id="Ip3-vX-0L9"/>
|
<constraint firstItem="LPY-sM-hjS" firstAttribute="top" secondItem="g0i-00-sng" secondAttribute="top" constant="20" symbolic="YES" id="Ip3-vX-0L9"/>
|
||||||
<constraint firstItem="LPY-sM-hjS" firstAttribute="leading" secondItem="g0i-00-sng" secondAttribute="leading" constant="20" symbolic="YES" id="RE9-Jf-nFR"/>
|
<constraint firstItem="LPY-sM-hjS" firstAttribute="leading" secondItem="g0i-00-sng" secondAttribute="leading" constant="20" symbolic="YES" id="RE9-Jf-nFR"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="LPY-sM-hjS" secondAttribute="bottom" constant="20" symbolic="YES" id="nGd-XA-Jj9"/>
|
<constraint firstAttribute="bottom" secondItem="LPY-sM-hjS" secondAttribute="bottom" constant="20" symbolic="YES" id="nGd-XA-Jj9"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="LPY-sM-hjS" secondAttribute="trailing" constant="20" symbolic="YES" id="wyU-eZ-BSC"/>
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="LPY-sM-hjS" secondAttribute="trailing" constant="20" symbolic="YES" id="wyU-eZ-BSC"/>
|
||||||
|
</constraints>
|
||||||
|
</view>
|
||||||
|
</box>
|
||||||
|
<box title="Clipboard" translatesAutoresizingMaskIntoConstraints="NO" id="Kff-Xp-hAT">
|
||||||
|
<rect key="frame" x="17" y="16" width="366" height="72"/>
|
||||||
|
<view key="contentView" id="Ntf-zj-VZL">
|
||||||
|
<rect key="frame" x="3" y="3" width="360" height="54"/>
|
||||||
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
|
<subviews>
|
||||||
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="vT4-wF-ned">
|
||||||
|
<rect key="frame" x="18" y="18" width="280" height="18"/>
|
||||||
|
<buttonCell key="cell" type="check" title="Hide application after copying to clipboard" bezelStyle="regularSquare" imagePosition="left" inset="2" id="1Vr-nY-Ogv">
|
||||||
|
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||||
|
<font key="font" metaFont="system"/>
|
||||||
|
</buttonCell>
|
||||||
|
</button>
|
||||||
|
</subviews>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstItem="vT4-wF-ned" firstAttribute="leading" secondItem="Ntf-zj-VZL" secondAttribute="leading" constant="20" symbolic="YES" id="3ck-ZU-EY0"/>
|
||||||
|
<constraint firstAttribute="bottom" secondItem="vT4-wF-ned" secondAttribute="bottom" constant="20" symbolic="YES" id="coG-iy-hF8"/>
|
||||||
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="vT4-wF-ned" secondAttribute="trailing" constant="20" symbolic="YES" id="grJ-mW-4AM"/>
|
||||||
|
<constraint firstItem="vT4-wF-ned" firstAttribute="top" secondItem="Ntf-zj-VZL" secondAttribute="top" constant="20" symbolic="YES" id="ibE-Gy-bR6"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
</view>
|
</view>
|
||||||
<color key="borderColor" white="0.0" alpha="0.41999999999999998" colorSpace="calibratedWhite"/>
|
|
||||||
<color key="fillColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
|
||||||
</box>
|
</box>
|
||||||
</subviews>
|
</subviews>
|
||||||
<constraints>
|
<constraints>
|
||||||
<constraint firstItem="2" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="5"/>
|
<constraint firstItem="2" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="5"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="2" secondAttribute="trailing" constant="20" symbolic="YES" id="8"/>
|
<constraint firstAttribute="trailing" secondItem="2" secondAttribute="trailing" constant="20" symbolic="YES" id="8"/>
|
||||||
<constraint firstAttribute="width" constant="400" id="53"/>
|
<constraint firstAttribute="width" constant="400" id="53"/>
|
||||||
<constraint firstItem="Xvt-tP-TbR" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="20" id="BH4-4y-uma"/>
|
<constraint firstItem="Kff-Xp-hAT" firstAttribute="top" secondItem="Xvt-tP-TbR" secondAttribute="bottom" constant="8" symbolic="YES" id="3RL-tm-4wu"/>
|
||||||
|
<constraint firstAttribute="bottom" secondItem="Kff-Xp-hAT" secondAttribute="bottom" constant="20" symbolic="YES" id="8k6-1d-wPj"/>
|
||||||
|
<constraint firstItem="Xvt-tP-TbR" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="BH4-4y-uma"/>
|
||||||
<constraint firstItem="2" firstAttribute="top" secondItem="ehI-gq-lsb" secondAttribute="bottom" constant="8" symbolic="YES" id="CnN-aU-Qa1"/>
|
<constraint firstItem="2" firstAttribute="top" secondItem="ehI-gq-lsb" secondAttribute="bottom" constant="8" symbolic="YES" id="CnN-aU-Qa1"/>
|
||||||
<constraint firstAttribute="bottom" secondItem="Xvt-tP-TbR" secondAttribute="bottom" constant="20" symbolic="YES" id="Dnn-I2-lsA"/>
|
|
||||||
<constraint firstItem="Xvt-tP-TbR" firstAttribute="top" secondItem="cfa-nq-Kzt" secondAttribute="bottom" constant="5" id="FVK-Uf-kLv"/>
|
<constraint firstItem="Xvt-tP-TbR" firstAttribute="top" secondItem="cfa-nq-Kzt" secondAttribute="bottom" constant="5" id="FVK-Uf-kLv"/>
|
||||||
<constraint firstItem="ehI-gq-lsb" firstAttribute="leading" secondItem="lOo-NI-b07" secondAttribute="trailing" constant="8" symbolic="YES" id="KxB-TG-rH5"/>
|
<constraint firstItem="ehI-gq-lsb" firstAttribute="leading" secondItem="lOo-NI-b07" secondAttribute="trailing" constant="8" symbolic="YES" id="KxB-TG-rH5"/>
|
||||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="ehI-gq-lsb" secondAttribute="trailing" constant="20" symbolic="YES" id="Ldw-aO-wuX"/>
|
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="ehI-gq-lsb" secondAttribute="trailing" constant="20" symbolic="YES" id="Ldw-aO-wuX"/>
|
||||||
<constraint firstItem="ehI-gq-lsb" firstAttribute="top" secondItem="1" secondAttribute="top" constant="20" symbolic="YES" id="MAe-l7-8k2"/>
|
<constraint firstItem="ehI-gq-lsb" firstAttribute="top" secondItem="1" secondAttribute="top" constant="20" symbolic="YES" id="MAe-l7-8k2"/>
|
||||||
<constraint firstItem="lOo-NI-b07" firstAttribute="centerY" secondItem="ehI-gq-lsb" secondAttribute="centerY" id="agv-2Z-m5A"/>
|
<constraint firstAttribute="trailing" secondItem="Kff-Xp-hAT" secondAttribute="trailing" constant="20" symbolic="YES" id="VLC-2A-Vdd"/>
|
||||||
|
<constraint firstItem="Kff-Xp-hAT" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="Vle-Z0-mh8"/>
|
||||||
<constraint firstAttribute="trailing" secondItem="Xvt-tP-TbR" secondAttribute="trailing" constant="20" id="anU-nC-YAw"/>
|
<constraint firstAttribute="trailing" secondItem="Xvt-tP-TbR" secondAttribute="trailing" constant="20" id="anU-nC-YAw"/>
|
||||||
<constraint firstItem="lOo-NI-b07" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="22" id="kaP-lB-tDY"/>
|
<constraint firstItem="lOo-NI-b07" firstAttribute="firstBaseline" secondItem="ehI-gq-lsb" secondAttribute="firstBaseline" id="gFK-Ce-Q3b"/>
|
||||||
<constraint firstItem="lOo-NI-b07" firstAttribute="top" secondItem="1" secondAttribute="top" constant="20" symbolic="YES" id="tEf-Ag-oTi"/>
|
<constraint firstItem="lOo-NI-b07" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="kaP-lB-tDY"/>
|
||||||
<constraint firstItem="2" firstAttribute="top" secondItem="lOo-NI-b07" secondAttribute="bottom" constant="8" symbolic="YES" id="xlS-Dj-cOt"/>
|
<constraint firstItem="2" firstAttribute="top" secondItem="lOo-NI-b07" secondAttribute="bottom" constant="8" symbolic="YES" id="xlS-Dj-cOt"/>
|
||||||
</constraints>
|
</constraints>
|
||||||
<point key="canvasLocation" x="435" y="649"/>
|
<point key="canvasLocation" x="-2" y="125"/>
|
||||||
</customView>
|
</customView>
|
||||||
</objects>
|
</objects>
|
||||||
</document>
|
</document>
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<deployment identifier="macosx"/>
|
<deployment identifier="macosx"/>
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14460.31"/>
|
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<objects>
|
<objects>
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
#import "KPKEntry+MPCustomAttributeProperties.h"
|
#import "KPKEntry+MPCustomAttributeProperties.h"
|
||||||
#import <objc/runtime.h>
|
#import <objc/runtime.h>
|
||||||
|
|
||||||
NSString *const MPCustomAttributePropertyPrefix = @"valueForCustomAttribute";
|
NSString *const MPCustomAttributePropertyPrefix = @"mp_valueForCustomAttribute";
|
||||||
|
|
||||||
@implementation KPKEntry (MPCustomAttributeProperties)
|
@implementation KPKEntry (MPCustomAttributeProperties)
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ static id propertyIMP(id self, SEL _cmd) {
|
|||||||
|
|
||||||
+ (BOOL)resolveInstanceMethod:(SEL)aSEL {
|
+ (BOOL)resolveInstanceMethod:(SEL)aSEL {
|
||||||
if ([NSStringFromSelector(aSEL) hasPrefix:MPCustomAttributePropertyPrefix]) {
|
if ([NSStringFromSelector(aSEL) hasPrefix:MPCustomAttributePropertyPrefix]) {
|
||||||
class_addMethod([self class], aSEL,(IMP)propertyIMP, "@@:");
|
class_addMethod(self.class, aSEL,(IMP)propertyIMP, "@@:");
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
return [super resolveInstanceMethod:aSEL];
|
return [super resolveInstanceMethod:aSEL];
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ typedef NS_ENUM(NSUInteger, MPActionType) {
|
|||||||
MPActionAddGroup, // Add a new group
|
MPActionAddGroup, // Add a new group
|
||||||
MPActionDuplicateEntry, // Simply duplicate an entry (including history)
|
MPActionDuplicateEntry, // Simply duplicate an entry (including history)
|
||||||
MPActionDuplicateEntryWithOptions, // Request user input on what to duplicate
|
MPActionDuplicateEntryWithOptions, // Request user input on what to duplicate
|
||||||
|
MPActionDuplicateGroup, // Duplicate the group and all it's children
|
||||||
MPActionReverToHistoryEntry, // Restore an entry to an older state in history
|
MPActionReverToHistoryEntry, // Restore an entry to an older state in history
|
||||||
MPActionDelete, // Delete entry or group
|
MPActionDelete, // Delete entry or group
|
||||||
MPActionCopyUsername, // copy username to pasteboard
|
MPActionCopyUsername, // copy username to pasteboard
|
||||||
@@ -47,6 +48,7 @@ typedef NS_ENUM(NSUInteger, MPActionType) {
|
|||||||
MPActionToggleQuicklook,
|
MPActionToggleQuicklook,
|
||||||
MPActionShowEntryHistory, // show history
|
MPActionShowEntryHistory, // show history
|
||||||
MPActionHideEntryHistory, // exit history
|
MPActionHideEntryHistory, // exit history
|
||||||
|
MPActionShowGroupInOutline, // show the group (of the entry) in the outline view
|
||||||
MPActionPerformAutotypeForSelectedEntry, // Perform Autotype for selected Entry
|
MPActionPerformAutotypeForSelectedEntry, // Perform Autotype for selected Entry
|
||||||
MPActionRemoveAttachment // Remove an attachment
|
MPActionRemoveAttachment // Remove an attachment
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -38,6 +38,7 @@
|
|||||||
@(MPActionAddGroup): NSStringFromSelector(@selector(createGroup:)),
|
@(MPActionAddGroup): NSStringFromSelector(@selector(createGroup:)),
|
||||||
@(MPActionDuplicateEntry): NSStringFromSelector(@selector(duplicateEntry:)),
|
@(MPActionDuplicateEntry): NSStringFromSelector(@selector(duplicateEntry:)),
|
||||||
@(MPActionDuplicateEntryWithOptions): NSStringFromSelector(@selector(duplicateEntryWithOptions:)),
|
@(MPActionDuplicateEntryWithOptions): NSStringFromSelector(@selector(duplicateEntryWithOptions:)),
|
||||||
|
@(MPActionDuplicateGroup): NSStringFromSelector(@selector(duplicateGroup:)),
|
||||||
@(MPActionReverToHistoryEntry): NSStringFromSelector(@selector(revertToHistoryEntry:)),
|
@(MPActionReverToHistoryEntry): NSStringFromSelector(@selector(revertToHistoryEntry:)),
|
||||||
@(MPActionCopyPassword): NSStringFromSelector(@selector(copyPassword:)),
|
@(MPActionCopyPassword): NSStringFromSelector(@selector(copyPassword:)),
|
||||||
@(MPActionCopyURL): NSStringFromSelector(@selector(copyURL:)),
|
@(MPActionCopyURL): NSStringFromSelector(@selector(copyURL:)),
|
||||||
@@ -57,6 +58,7 @@
|
|||||||
@(MPActionToggleQuicklook): NSStringFromSelector(@selector(toggleQuicklookPreview:)),
|
@(MPActionToggleQuicklook): NSStringFromSelector(@selector(toggleQuicklookPreview:)),
|
||||||
@(MPActionShowEntryHistory): NSStringFromSelector(@selector(showEntryHistory:)),
|
@(MPActionShowEntryHistory): NSStringFromSelector(@selector(showEntryHistory:)),
|
||||||
@(MPActionHideEntryHistory): NSStringFromSelector(@selector(hideEntryHistory:)),
|
@(MPActionHideEntryHistory): NSStringFromSelector(@selector(hideEntryHistory:)),
|
||||||
|
@(MPActionShowGroupInOutline): NSStringFromSelector(@selector(showGroupInOutline:)),
|
||||||
@(MPActionPerformAutotypeForSelectedEntry): NSStringFromSelector(@selector(performAutotypeForEntry:)),
|
@(MPActionPerformAutotypeForSelectedEntry): NSStringFromSelector(@selector(performAutotypeForEntry:)),
|
||||||
@(MPActionRemoveAttachment): NSStringFromSelector(@selector(removeAttachment:))
|
@(MPActionRemoveAttachment): NSStringFromSelector(@selector(removeAttachment:))
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ APPKIT_EXTERN NSString *const MPDidChangeStoredKeyFilesSettings;
|
|||||||
- (IBAction)showPreferences:(id)sender;
|
- (IBAction)showPreferences:(id)sender;
|
||||||
- (IBAction)showPluginPrefences:(id)sender;
|
- (IBAction)showPluginPrefences:(id)sender;
|
||||||
- (IBAction)showPasswordCreator:(id)sender;
|
- (IBAction)showPasswordCreator:(id)sender;
|
||||||
|
- (IBAction)showAutotypeDoctor:(id)sender;
|
||||||
- (IBAction)createNewDatabase:(id)sender;
|
- (IBAction)createNewDatabase:(id)sender;
|
||||||
- (IBAction)openDatabase:(id)sender;
|
- (IBAction)openDatabase:(id)sender;
|
||||||
- (IBAction)showHelp:(id)sender;
|
- (IBAction)showHelp:(id)sender;
|
||||||
|
|||||||
@@ -42,8 +42,10 @@
|
|||||||
#import "MPWelcomeViewController.h"
|
#import "MPWelcomeViewController.h"
|
||||||
#import "MPPlugin.h"
|
#import "MPPlugin.h"
|
||||||
#import "MPEntryContextMenuDelegate.h"
|
#import "MPEntryContextMenuDelegate.h"
|
||||||
|
#import "MPAutotypeDoctor.h"
|
||||||
|
|
||||||
#import "NSApplication+MPAdditions.h"
|
#import "NSApplication+MPAdditions.h"
|
||||||
|
#import "NSTextView+MPTouchBarExtension.h"
|
||||||
|
|
||||||
#import "KeePassKit/KeePassKit.h"
|
#import "KeePassKit/KeePassKit.h"
|
||||||
|
|
||||||
@@ -51,6 +53,12 @@
|
|||||||
|
|
||||||
NSString *const MPDidChangeStoredKeyFilesSettings = @"com.hicknhack.macpass.MPDidChangeStoredKeyFilesSettings";
|
NSString *const MPDidChangeStoredKeyFilesSettings = @"com.hicknhack.macpass.MPDidChangeStoredKeyFilesSettings";
|
||||||
|
|
||||||
|
typedef NS_OPTIONS(NSInteger, MPAppStartupState) {
|
||||||
|
MPAppStartupStateNone = 0,
|
||||||
|
MPAppStartupStateRestoredWindows = 1,
|
||||||
|
MPAppStartupStateFinishedLaunch = 2
|
||||||
|
};
|
||||||
|
|
||||||
@interface MPAppDelegate () {
|
@interface MPAppDelegate () {
|
||||||
@private
|
@private
|
||||||
MPDockTileHelper *_dockTileHelper;
|
MPDockTileHelper *_dockTileHelper;
|
||||||
@@ -62,6 +70,7 @@ NSString *const MPDidChangeStoredKeyFilesSettings = @"com.hicknhack.macpass.MPDi
|
|||||||
@property (strong) IBOutlet NSWindow *passwordCreatorWindow;
|
@property (strong) IBOutlet NSWindow *passwordCreatorWindow;
|
||||||
@property (strong, nonatomic) MPPreferencesWindowController *preferencesController;
|
@property (strong, nonatomic) MPPreferencesWindowController *preferencesController;
|
||||||
@property (strong, nonatomic) MPPasswordCreatorViewController *passwordCreatorController;
|
@property (strong, nonatomic) MPPasswordCreatorViewController *passwordCreatorController;
|
||||||
|
@property (assign, nonatomic) MPAppStartupState startupState;
|
||||||
|
|
||||||
@property (strong) MPEntryContextMenuDelegate *itemActionMenuDelegate;
|
@property (strong) MPEntryContextMenuDelegate *itemActionMenuDelegate;
|
||||||
|
|
||||||
@@ -82,11 +91,22 @@ NSString *const MPDidChangeStoredKeyFilesSettings = @"com.hicknhack.macpass.MPDi
|
|||||||
if(self) {
|
if(self) {
|
||||||
_userNotificationCenterDelegate = [[MPUserNotificationCenterDelegate alloc] init];
|
_userNotificationCenterDelegate = [[MPUserNotificationCenterDelegate alloc] init];
|
||||||
self.itemActionMenuDelegate = [[MPEntryContextMenuDelegate alloc] init];
|
self.itemActionMenuDelegate = [[MPEntryContextMenuDelegate alloc] init];
|
||||||
|
_shouldOpenFile = NO;
|
||||||
|
self.startupState = MPAppStartupStateNone;
|
||||||
|
|
||||||
|
[NSNotificationCenter.defaultCenter addObserver:self
|
||||||
|
selector:@selector(_applicationDidFinishRestoringWindows:)
|
||||||
|
name:NSApplicationDidFinishRestoringWindowsNotification
|
||||||
|
object:nil];
|
||||||
|
|
||||||
/* We know that we do not use the variable after instantiation */
|
/* We know that we do not use the variable after instantiation */
|
||||||
#pragma clang diagnostic push
|
#pragma clang diagnostic push
|
||||||
#pragma clang diagnostic ignored "-Wunused-variable"
|
#pragma clang diagnostic ignored "-Wunused-variable"
|
||||||
MPDocumentController *documentController = [[MPDocumentController alloc] init];
|
MPDocumentController *documentController = [[MPDocumentController alloc] init];
|
||||||
#pragma clang diagnostic pop
|
#pragma clang diagnostic pop
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
@@ -109,6 +129,17 @@ NSString *const MPDidChangeStoredKeyFilesSettings = @"com.hicknhack.macpass.MPDi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)setStartupState:(MPAppStartupState)notificationState {
|
||||||
|
if(notificationState != self.startupState) {
|
||||||
|
_startupState = notificationState;
|
||||||
|
BOOL restored = self.startupState & MPAppStartupStateRestoredWindows;
|
||||||
|
BOOL launched = self.startupState & MPAppStartupStateFinishedLaunch;
|
||||||
|
if(restored && launched ) {
|
||||||
|
[self _applicationDidFinishLaunchingAndDidRestoreWindows];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void)awakeFromNib {
|
- (void)awakeFromNib {
|
||||||
_isAllowedToStoreKeyFile = NO;
|
_isAllowedToStoreKeyFile = NO;
|
||||||
/* Update the … at the save menu */
|
/* Update the … at the save menu */
|
||||||
@@ -127,7 +158,7 @@ NSString *const MPDidChangeStoredKeyFilesSettings = @"com.hicknhack.macpass.MPDi
|
|||||||
[fileMenu insertItem:item atIndex:insertIndex];
|
[fileMenu insertItem:item atIndex:insertIndex];
|
||||||
}
|
}
|
||||||
[self.itemMenu removeAllItems];
|
[self.itemMenu removeAllItems];
|
||||||
for(NSMenuItem *item in [MPContextMenuHelper contextMenuItemsWithItems:MPContextMenuFull]) {
|
for(NSMenuItem *item in [MPContextMenuHelper contextMenuItemsWithItems:MPContextMenuFull|MPContextMenuShowGroupInOutline]) {
|
||||||
[self.itemMenu addItem:item];
|
[self.itemMenu addItem:item];
|
||||||
}
|
}
|
||||||
self.itemMenu.delegate = self.itemActionMenuDelegate;
|
self.itemMenu.delegate = self.itemActionMenuDelegate;
|
||||||
@@ -154,23 +185,13 @@ NSString *const MPDidChangeStoredKeyFilesSettings = @"com.hicknhack.macpass.MPDi
|
|||||||
return [NSUserDefaults.standardUserDefaults boolForKey:kMPSettingsKeyOpenEmptyDatabaseOnLaunch];
|
return [NSUserDefaults.standardUserDefaults boolForKey:kMPSettingsKeyOpenEmptyDatabaseOnLaunch];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
- (void)applicationWillFinishLaunching:(NSNotification *)notification {
|
|
||||||
_shouldOpenFile = NO;
|
|
||||||
[NSNotificationCenter.defaultCenter addObserver:self
|
|
||||||
selector:@selector(_applicationDidFinishRestoringWindows:)
|
|
||||||
name:NSApplicationDidFinishRestoringWindowsNotification
|
|
||||||
object:nil];
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender {
|
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)sender {
|
||||||
return [NSUserDefaults.standardUserDefaults boolForKey:kMPSettingsKeyQuitOnLastWindowClose];
|
return [NSUserDefaults.standardUserDefaults boolForKey:kMPSettingsKeyQuitOnLastWindowClose];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
|
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {
|
||||||
if([[MPTemporaryFileStorageCenter defaultCenter] hasPendingStorages]) {
|
[self hideWelcomeWindow];
|
||||||
|
if(MPTemporaryFileStorageCenter.defaultCenter.hasPendingStorages) {
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
[MPTemporaryFileStorageCenter.defaultCenter cleanupStorages];
|
[MPTemporaryFileStorageCenter.defaultCenter cleanupStorages];
|
||||||
[sender replyToApplicationShouldTerminate:YES];
|
[sender replyToApplicationShouldTerminate:YES];
|
||||||
@@ -201,6 +222,13 @@ NSString *const MPDidChangeStoredKeyFilesSettings = @"com.hicknhack.macpass.MPDi
|
|||||||
/* Disable updates if in debug or nosparkle */
|
/* Disable updates if in debug or nosparkle */
|
||||||
[SUUpdater sharedUpdater];
|
[SUUpdater sharedUpdater];
|
||||||
#endif
|
#endif
|
||||||
|
self.startupState |= MPAppStartupStateFinishedLaunch;
|
||||||
|
// Here we just opt-in for allowing our bar to be customized throughout the app.
|
||||||
|
if([NSApplication.sharedApplication respondsToSelector:@selector(isAutomaticCustomizeTouchBarMenuItemEnabled)]) {
|
||||||
|
if(@available(macOS 10.12.2, *)) {
|
||||||
|
NSApplication.sharedApplication.automaticCustomizeTouchBarMenuItemEnabled = YES;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
@@ -290,6 +318,7 @@ NSString *const MPDidChangeStoredKeyFilesSettings = @"com.hicknhack.macpass.MPDi
|
|||||||
styleMask:NSWindowStyleMaskTitled|NSWindowStyleMaskClosable|NSWindowStyleMaskResizable
|
styleMask:NSWindowStyleMaskTitled|NSWindowStyleMaskClosable|NSWindowStyleMaskResizable
|
||||||
backing:NSBackingStoreBuffered
|
backing:NSBackingStoreBuffered
|
||||||
defer:NO];
|
defer:NO];
|
||||||
|
self.welcomeWindow.restorable = NO; // do not restore the welcome window!
|
||||||
self.welcomeWindow.releasedWhenClosed = NO;
|
self.welcomeWindow.releasedWhenClosed = NO;
|
||||||
}
|
}
|
||||||
if(!self.welcomeWindow.contentViewController) {
|
if(!self.welcomeWindow.contentViewController) {
|
||||||
@@ -313,11 +342,15 @@ NSString *const MPDidChangeStoredKeyFilesSettings = @"com.hicknhack.macpass.MPDi
|
|||||||
[NSWorkspace.sharedWorkspace openURL:[NSURL URLWithString:urlString]];
|
[NSWorkspace.sharedWorkspace openURL:[NSURL URLWithString:urlString]];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)showAutotypeDoctor:(id)sender {
|
||||||
|
[MPAutotypeDoctor.defaultDoctor runChecksAndPresentResults];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)checkForUpdates:(id)sender {
|
- (void)checkForUpdates:(id)sender {
|
||||||
#if defined(DEBUG) || defined(NO_SPARKLE)
|
#if defined(DEBUG) || defined(NO_SPARKLE)
|
||||||
NSAlert *alert = [[NSAlert alloc] init];
|
NSAlert *alert = [[NSAlert alloc] init];
|
||||||
alert.messageText = NSLocalizedString(@"ALERT_UPDATES_DISABLED_MESSAGE_TEXT", @"Message text for disabled updates alert!");
|
alert.messageText = NSLocalizedString(@"ALERT_UPDATES_DISABLED_MESSAGE_TEXT", @"Message text for disabled updates alert!");
|
||||||
alert.informativeText = [NSString stringWithFormat:NSLocalizedString(@"ALERT_UPDATES_DISABLED_INFORMATIVE_TEXT_%@!", @"Infromative text of the disabled updates alert!"), NSApp.applicationName];
|
alert.informativeText = [NSString stringWithFormat:NSLocalizedString(@"ALERT_UPDATES_DISABLED_INFORMATIVE_TEXT_%@!", @"Informative text of the disabled updates alert!"), NSApp.applicationName];
|
||||||
[alert addButtonWithTitle:NSLocalizedString(@"OK", @"Ok Button to dismiss disabled updates alert")];
|
[alert addButtonWithTitle:NSLocalizedString(@"OK", @"Ok Button to dismiss disabled updates alert")];
|
||||||
[alert runModal];
|
[alert runModal];
|
||||||
#else
|
#else
|
||||||
@@ -328,8 +361,12 @@ NSString *const MPDidChangeStoredKeyFilesSettings = @"com.hicknhack.macpass.MPDi
|
|||||||
#pragma mark -
|
#pragma mark -
|
||||||
#pragma mark Private Helper
|
#pragma mark Private Helper
|
||||||
- (void)_applicationDidFinishRestoringWindows:(NSNotification *)notification {
|
- (void)_applicationDidFinishRestoringWindows:(NSNotification *)notification {
|
||||||
|
self.startupState |= MPAppStartupStateRestoredWindows;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)_applicationDidFinishLaunchingAndDidRestoreWindows {
|
||||||
NSArray *documents = NSDocumentController.sharedDocumentController.documents;
|
NSArray *documents = NSDocumentController.sharedDocumentController.documents;
|
||||||
BOOL restoredWindows = documents.count > 0;
|
BOOL hasOpenDocuments = documents.count > 0;
|
||||||
|
|
||||||
for(NSDocument *document in documents) {
|
for(NSDocument *document in documents) {
|
||||||
for(NSWindowController *windowController in document.windowControllers) {
|
for(NSWindowController *windowController in document.windowControllers) {
|
||||||
@@ -338,17 +375,13 @@ NSString *const MPDidChangeStoredKeyFilesSettings = @"com.hicknhack.macpass.MPDi
|
|||||||
}
|
}
|
||||||
|
|
||||||
BOOL reopen = [NSUserDefaults.standardUserDefaults boolForKey:kMPSettingsKeyReopenLastDatabaseOnLaunch];
|
BOOL reopen = [NSUserDefaults.standardUserDefaults boolForKey:kMPSettingsKeyReopenLastDatabaseOnLaunch];
|
||||||
BOOL showWelcomeScreen = !restoredWindows && !_shouldOpenFile;
|
BOOL showWelcomeScreen = !hasOpenDocuments && !_shouldOpenFile;
|
||||||
if(reopen && !restoredWindows && !_shouldOpenFile) {
|
if(reopen && !hasOpenDocuments && !_shouldOpenFile) {
|
||||||
showWelcomeScreen = ![((MPDocumentController *)NSDocumentController.sharedDocumentController) reopenLastDocument];
|
showWelcomeScreen = ![((MPDocumentController *)NSDocumentController.sharedDocumentController) reopenLastDocument];
|
||||||
}
|
}
|
||||||
if(showWelcomeScreen) {
|
if(showWelcomeScreen) {
|
||||||
[self showWelcomeWindow];
|
[self showWelcomeWindow];
|
||||||
}
|
}
|
||||||
/* run check for accessibilty after the windowserver should have presented the UI */
|
|
||||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
|
||||||
[MPAutotypeDaemon.defaultDaemon checkForAccessibiltyPermissions];
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
@interface MPAutotypeCandidateSelectionViewController : NSViewController
|
@interface MPAutotypeCandidateSelectionViewController : NSViewController
|
||||||
|
|
||||||
@property (copy) NSArray *candidates;
|
@property (copy) NSArray *candidates;
|
||||||
|
@property (copy) NSString *windowTitle;
|
||||||
|
|
||||||
- (IBAction)selectAutotypeContext:(id)sender;
|
- (IBAction)selectAutotypeContext:(id)sender;
|
||||||
- (IBAction)cancelSelection:(id)sender;
|
- (IBAction)cancelSelection:(id)sender;
|
||||||
|
|||||||
@@ -28,8 +28,9 @@
|
|||||||
#import <KeePassKit/KeePassKit.h>
|
#import <KeePassKit/KeePassKit.h>
|
||||||
|
|
||||||
@interface MPAutotypeCandidateSelectionViewController () <NSTableViewDataSource, NSTableViewDelegate>
|
@interface MPAutotypeCandidateSelectionViewController () <NSTableViewDataSource, NSTableViewDelegate>
|
||||||
@property (weak) IBOutlet NSButton *selectAutotypeContextButton;
|
@property (strong) IBOutlet NSButton *selectAutotypeContextButton;
|
||||||
@property (weak) IBOutlet NSTableView *contextTableView;
|
@property (strong) IBOutlet NSTableView *contextTableView;
|
||||||
|
@property (strong) IBOutlet NSTextField *messageTextField;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@@ -41,6 +42,8 @@
|
|||||||
|
|
||||||
- (void)viewDidLoad {
|
- (void)viewDidLoad {
|
||||||
[super viewDidLoad];
|
[super viewDidLoad];
|
||||||
|
NSString *template = NSLocalizedString(@"AUTOTYPE_CANDIDATE_SELECTION_WINDOW_MESSAGE_%@", "Message text in the autotype selection window. Placeholder is %1 - windowTitle");
|
||||||
|
self.messageTextField.stringValue = [NSString stringWithFormat:template, self.windowTitle];
|
||||||
self.selectAutotypeContextButton.enabled = NO;
|
self.selectAutotypeContextButton.enabled = NO;
|
||||||
NSNotification *notification = [NSNotification notificationWithName:NSTableViewSelectionDidChangeNotification object:self.contextTableView];
|
NSNotification *notification = [NSNotification notificationWithName:NSTableViewSelectionDidChangeNotification object:self.contextTableView];
|
||||||
[self tableViewSelectionDidChange:notification];
|
[self tableViewSelectionDidChange:notification];
|
||||||
|
|||||||
@@ -35,13 +35,9 @@
|
|||||||
@property (weak) IBOutlet NSPopUpButton *matchSelectionButton;
|
@property (weak) IBOutlet NSPopUpButton *matchSelectionButton;
|
||||||
@property (readonly, strong) DDHotKey *registredHotKey;
|
@property (readonly, strong) DDHotKey *registredHotKey;
|
||||||
@property (readonly, strong, class) MPAutotypeDaemon *defaultDaemon;
|
@property (readonly, strong, class) MPAutotypeDaemon *defaultDaemon;
|
||||||
@property (nonatomic, readonly) BOOL autotypeSupported; // YES if the system allows for Autotype. NO if the user has denied this.
|
|
||||||
|
|
||||||
- (instancetype)init NS_UNAVAILABLE;
|
- (instancetype)init NS_UNAVAILABLE;
|
||||||
|
|
||||||
- (void)checkForAccessibiltyPermissions;
|
|
||||||
- (void)openAccessibiltyPreferences;
|
|
||||||
|
|
||||||
- (void)performAutotypeForEntry:(KPKEntry *)entry;
|
- (void)performAutotypeForEntry:(KPKEntry *)entry;
|
||||||
- (void)performAutotypeForEntry:(KPKEntry *)entry overrideSequence:(NSString *)sequence;
|
- (void)performAutotypeForEntry:(KPKEntry *)entry overrideSequence:(NSString *)sequence;
|
||||||
- (void)selectAutotypeCandiate:(MPAutotypeContext *)context;
|
- (void)selectAutotypeCandiate:(MPAutotypeContext *)context;
|
||||||
|
|||||||
@@ -26,10 +26,15 @@
|
|||||||
#import "MPAutotypeCommand.h"
|
#import "MPAutotypeCommand.h"
|
||||||
#import "MPAutotypeContext.h"
|
#import "MPAutotypeContext.h"
|
||||||
#import "MPAutotypePaste.h"
|
#import "MPAutotypePaste.h"
|
||||||
|
#import "MPAutotypeDelay.h"
|
||||||
#import "MPPasteBoardController.h"
|
#import "MPPasteBoardController.h"
|
||||||
#import "MPSettingsHelper.h"
|
#import "MPSettingsHelper.h"
|
||||||
#import "MPAutotypeCandidateSelectionViewController.h"
|
#import "MPAutotypeCandidateSelectionViewController.h"
|
||||||
#import "MPUserNotificationCenterDelegate.h"
|
#import "MPUserNotificationCenterDelegate.h"
|
||||||
|
#import "MPAutotypeDoctor.h"
|
||||||
|
|
||||||
|
#import "MPPluginHost.h"
|
||||||
|
#import "MPPlugin.h"
|
||||||
|
|
||||||
#import "NSApplication+MPAdditions.h"
|
#import "NSApplication+MPAdditions.h"
|
||||||
#import "NSUserNotification+MPAdditions.h"
|
#import "NSUserNotification+MPAdditions.h"
|
||||||
@@ -52,13 +57,12 @@ NSString *const kMPProcessIdentifierKey = @"kMPProcessIdentifierKey";
|
|||||||
@property (copy) NSString *targetWindowTitle; // The title of the window that we are targeting
|
@property (copy) NSString *targetWindowTitle; // The title of the window that we are targeting
|
||||||
@property (strong) NSRunningApplication *previousApplication; // The application that was active before we got invoked
|
@property (strong) NSRunningApplication *previousApplication; // The application that was active before we got invoked
|
||||||
@property (assign) NSTimeInterval userActionRequested;
|
@property (assign) NSTimeInterval userActionRequested;
|
||||||
|
@property (strong) id applicationActivationObserver;
|
||||||
|
@property (nonatomic, readonly) BOOL hasNecessaryAutotypePermissions;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation MPAutotypeDaemon
|
@implementation MPAutotypeDaemon
|
||||||
|
|
||||||
@dynamic autotypeSupported;
|
|
||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
#pragma mark Lifecylce
|
#pragma mark Lifecylce
|
||||||
|
|
||||||
@@ -104,19 +108,15 @@ static MPAutotypeDaemon *_sharedInstance;
|
|||||||
- (void)dealloc {
|
- (void)dealloc {
|
||||||
[NSNotificationCenter.defaultCenter removeObserver:self];
|
[NSNotificationCenter.defaultCenter removeObserver:self];
|
||||||
[NSWorkspace.sharedWorkspace.notificationCenter removeObserver:self];
|
[NSWorkspace.sharedWorkspace.notificationCenter removeObserver:self];
|
||||||
|
if(self.applicationActivationObserver) {
|
||||||
|
[NSWorkspace.sharedWorkspace.notificationCenter removeObserver:self.applicationActivationObserver name:NSWorkspaceDidActivateApplicationNotification object:nil];
|
||||||
|
}
|
||||||
[self unbind:NSStringFromSelector(@selector(enabled))];
|
[self unbind:NSStringFromSelector(@selector(enabled))];
|
||||||
[self unbind:NSStringFromSelector(@selector(hotKeyData))];
|
[self unbind:NSStringFromSelector(@selector(hotKeyData))];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
#pragma mark Properties
|
#pragma mark Properties
|
||||||
- (BOOL)autotypeSupported {
|
|
||||||
if(@available(macOS 10.14, *)) {
|
|
||||||
return AXIsProcessTrusted();
|
|
||||||
}
|
|
||||||
/* macOS 10.13 and lower allows us to send key events regardless of accessibilty trust */
|
|
||||||
return YES;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)setEnabled:(BOOL)enabled {
|
- (void)setEnabled:(BOOL)enabled {
|
||||||
if(_enabled != enabled) {
|
if(_enabled != enabled) {
|
||||||
@@ -135,45 +135,8 @@ static MPAutotypeDaemon *_sharedInstance;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)checkForAccessibiltyPermissions {
|
- (BOOL)hasNecessaryAutotypePermissions {
|
||||||
if(!self.enabled) {
|
return MPAutotypeDoctor.defaultDoctor.hasNecessaryAutotypePermissions;
|
||||||
return;
|
|
||||||
}
|
|
||||||
BOOL hideAlert = NO;
|
|
||||||
if(nil != [NSUserDefaults.standardUserDefaults objectForKey:kMPSettingsKeyAutotypeHideAccessibiltyWarning]) {
|
|
||||||
hideAlert = [NSUserDefaults.standardUserDefaults boolForKey:kMPSettingsKeyAutotypeHideAccessibiltyWarning];
|
|
||||||
}
|
|
||||||
if(hideAlert || self.autotypeSupported) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
NSAlert *alert = [[NSAlert alloc] init];
|
|
||||||
alert.alertStyle = NSWarningAlertStyle;
|
|
||||||
alert.messageText = NSLocalizedString(@"ALERT_AUTOTYPE_MISSING_ACCESSIBILTY_PERMISSIONS_MESSAGE_TEXT", @"Alert message displayed when Autotype performs self check and lacks accessibilty permissions");
|
|
||||||
alert.informativeText = NSLocalizedString(@"ALERT_AUTOTYPE_MISSING_ACCESSIBILTY_PERMISSIONS_INFORMATIVE_TEXT", @"Alert informative text displayed when Autotype performs self check and lacks accessibilty permissions");
|
|
||||||
alert.showsSuppressionButton = YES;
|
|
||||||
[alert addButtonWithTitle:NSLocalizedString(@"ALERT_AUTOTYPE_MISSING_ACCESSIBILTY_PERMISSIONS_BUTTON_OK", @"Button in dialog to leave autotype disabled and continiue!")];
|
|
||||||
[alert addButtonWithTitle:NSLocalizedString(@"ALERT_AUTOTYPE_MISSING_ACCESSIBILTY_PERMISSIONS_BUTTON_OPEN_PREFERENCES", @"Button in dialog to open accessibilty preferences pane!")];
|
|
||||||
NSModalResponse returnCode = [alert runModal];
|
|
||||||
BOOL suppressWarning = (alert.suppressionButton.state == NSOnState);
|
|
||||||
[NSUserDefaults.standardUserDefaults setBool:suppressWarning forKey:kMPSettingsKeyAutotypeHideAccessibiltyWarning];
|
|
||||||
switch(returnCode) {
|
|
||||||
case NSAlertFirstButtonReturn: {
|
|
||||||
/* ok, ignore */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case NSAlertSecondButtonReturn:
|
|
||||||
/* open prefs */
|
|
||||||
[self openAccessibiltyPreferences];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)openAccessibiltyPreferences {
|
|
||||||
[NSWorkspace.sharedWorkspace openURL:[NSURL URLWithString:@"x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility"]];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
@@ -205,7 +168,7 @@ static MPAutotypeDaemon *_sharedInstance;
|
|||||||
[self.matchSelectionWindow orderOut:self];
|
[self.matchSelectionWindow orderOut:self];
|
||||||
self.matchSelectionWindow = nil;
|
self.matchSelectionWindow = nil;
|
||||||
if(self.targetPID) {
|
if(self.targetPID) {
|
||||||
[self _orderApplicationToFront:self.targetPID];
|
[self _orderApplicationToFront:self.targetPID forContext:nil];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,16 +176,16 @@ static MPAutotypeDaemon *_sharedInstance;
|
|||||||
#pragma mark Autotype Execution
|
#pragma mark Autotype Execution
|
||||||
|
|
||||||
- (void)_performAutotypeForEntry:(KPKEntry *)entryOrNil {
|
- (void)_performAutotypeForEntry:(KPKEntry *)entryOrNil {
|
||||||
/*if(!self.autotypeSupported) {
|
if(!self.hasNecessaryAutotypePermissions) {
|
||||||
NSUserNotification *notification = [[NSUserNotification alloc] init];
|
NSUserNotification *notification = [[NSUserNotification alloc] init];
|
||||||
notification.title = NSApp.applicationName;
|
notification.title = NSApp.applicationName;
|
||||||
notification.informativeText = NSLocalizedString(@"AUTOTYPE_NOTIFICATION_MACPASS_HAS_NO_ACCESSIBILTY_PERMISSIONS", "Notification: Autotype failed, MacPass has no permission to send key strokes");
|
notification.informativeText = NSLocalizedString(@"AUTOTYPE_NOTIFICATION_MACPASS_IS_MISSING_PERMISSIONS", "Notification: Autotype failed, MacPass has not enough permissions to perform autotype");
|
||||||
notification.actionButtonTitle = NSLocalizedString(@"OPEN_PREFERENCES", "Action button in Notification to show the Accessibilty preferences");
|
notification.actionButtonTitle = NSLocalizedString(@"SHOW_AUTOTYPE_DOCTOR", "Action button in Notification to show the Autotype Doctor");
|
||||||
notification.userInfo = @{ MPUserNotificationTypeKey: MPUserNotificationTypeShowAccessibiltyPreferences };
|
notification.userInfo = @{ MPUserNotificationTypeKey: MPUserNotificationTypeRunAutotypeDoctor };
|
||||||
notification.showsButtons = YES;
|
notification.showsButtons = YES;
|
||||||
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification];
|
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification];
|
||||||
return;
|
return;
|
||||||
}*/
|
}
|
||||||
NSInteger pid = NSProcessInfo.processInfo.processIdentifier;
|
NSInteger pid = NSProcessInfo.processInfo.processIdentifier;
|
||||||
if(self.targetPID == pid) {
|
if(self.targetPID == pid) {
|
||||||
return; // We do not perform Autotype on ourselves
|
return; // We do not perform Autotype on ourselves
|
||||||
@@ -246,7 +209,8 @@ static MPAutotypeDaemon *_sharedInstance;
|
|||||||
|
|
||||||
NSPredicate *filterPredicate = [NSPredicate predicateWithBlock:^BOOL(id _Nonnull evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {
|
NSPredicate *filterPredicate = [NSPredicate predicateWithBlock:^BOOL(id _Nonnull evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {
|
||||||
MPDocument *document = evaluatedObject;
|
MPDocument *document = evaluatedObject;
|
||||||
return !document.encrypted;}];
|
return !document.encrypted;
|
||||||
|
}];
|
||||||
NSArray *unlockedDocuments = [documents filteredArrayUsingPredicate:filterPredicate];
|
NSArray *unlockedDocuments = [documents filteredArrayUsingPredicate:filterPredicate];
|
||||||
/* We look for all unlocked documents, if all open documents are locked, we pop the front most and try to search again */
|
/* We look for all unlocked documents, if all open documents are locked, we pop the front most and try to search again */
|
||||||
if(unlockedDocuments.count == 0) {
|
if(unlockedDocuments.count == 0) {
|
||||||
@@ -263,7 +227,7 @@ static MPAutotypeDaemon *_sharedInstance;
|
|||||||
}
|
}
|
||||||
|
|
||||||
MPAutotypeContext *context = [self _autotypeContextForDocuments:documents forWindowTitle:self.targetWindowTitle preferredEntry:entryOrNil];
|
MPAutotypeContext *context = [self _autotypeContextForDocuments:documents forWindowTitle:self.targetWindowTitle preferredEntry:entryOrNil];
|
||||||
/* TODO: that's popping up if the mulit selection dialog goes up! */
|
/* TODO: that's popping up if the multi selection dialog goes up! */
|
||||||
if(self.matchSelectionWindow) {
|
if(self.matchSelectionWindow) {
|
||||||
return; // we present the match selection window, just return
|
return; // we present the match selection window, just return
|
||||||
}
|
}
|
||||||
@@ -301,7 +265,7 @@ static MPAutotypeDaemon *_sharedInstance;
|
|||||||
if(candidates == 1 ) {
|
if(candidates == 1 ) {
|
||||||
return autotypeCandidates.lastObject;
|
return autotypeCandidates.lastObject;
|
||||||
}
|
}
|
||||||
[self _presentSelectionWindow:autotypeCandidates];
|
[self _presentCandiadates:autotypeCandidates forWindowTitle:windowTitle];
|
||||||
return nil; // Nothing to do, we get called back by the window
|
return nil; // Nothing to do, we get called back by the window
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -310,14 +274,29 @@ static MPAutotypeDaemon *_sharedInstance;
|
|||||||
return; // No context to work with
|
return; // No context to work with
|
||||||
}
|
}
|
||||||
|
|
||||||
if([self _orderApplicationToFront:self.targetPID]) {
|
if(NO == [self _orderApplicationToFront:self.targetPID forContext:(MPAutotypeContext *)context]) {
|
||||||
/* Sleep a bit after the app was activated */
|
return; // We will get called back when the application is in front - hopfully
|
||||||
/* TODO - we might be able to a notification to check if the app actally was activated instead of guessing a waiting time */
|
|
||||||
usleep(1 * NSEC_PER_MSEC);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
useconds_t globalDelay = 0;
|
||||||
for(MPAutotypeCommand *command in [MPAutotypeCommand commandsForContext:context]) {
|
for(MPAutotypeCommand *command in [MPAutotypeCommand commandsForContext:context]) {
|
||||||
|
/*
|
||||||
|
FIXME: Introduce a global state for execution to allow command to set state value
|
||||||
|
e.g. [command executeWithContext:(MPCommandExectionContext *)context]
|
||||||
|
and inside the command set the sate e.g. context.delay = myDelay
|
||||||
|
then use this state in the command scheduling to set the global delay
|
||||||
|
*/
|
||||||
|
if([command isKindOfClass:MPAutotypeDelay.class]) {
|
||||||
|
MPAutotypeDelay *delayCommand = (MPAutotypeDelay *)command;
|
||||||
|
if(delayCommand.isGlobal) {
|
||||||
|
globalDelay = (useconds_t)delayCommand.delay;
|
||||||
|
}
|
||||||
|
}
|
||||||
/* dispatch commands to main thread since most of them translate key events which is disallowed on background thread */
|
/* dispatch commands to main thread since most of them translate key events which is disallowed on background thread */
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
|
if(globalDelay > 0) {
|
||||||
|
usleep(globalDelay*NSEC_PER_USEC);
|
||||||
|
}
|
||||||
[command execute];
|
[command execute];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -367,10 +346,14 @@ static MPAutotypeDaemon *_sharedInstance;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(currentWindows.count > 0 && infoDict.count == 0) {
|
||||||
|
// show some information about not being able to determine any windows
|
||||||
|
NSLog(@"Unable to retrieve any window names. If you encounter this issue you might be running 10.15 and MacPass has no permission for screen recording.");
|
||||||
|
}
|
||||||
return infoDict;
|
return infoDict;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)_presentSelectionWindow:(NSArray *)candidates {
|
- (void)_presentCandiadates:(NSArray *)candidates forWindowTitle:(NSString *)windowTitle {
|
||||||
if(!self.matchSelectionWindow) {
|
if(!self.matchSelectionWindow) {
|
||||||
self.matchSelectionWindow = [[NSPanel alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
|
self.matchSelectionWindow = [[NSPanel alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
|
||||||
styleMask:NSWindowStyleMaskNonactivatingPanel|NSWindowStyleMaskTitled
|
styleMask:NSWindowStyleMaskNonactivatingPanel|NSWindowStyleMaskTitled
|
||||||
@@ -379,6 +362,7 @@ static MPAutotypeDaemon *_sharedInstance;
|
|||||||
self.matchSelectionWindow.level = kCGAssistiveTechHighWindowLevel;
|
self.matchSelectionWindow.level = kCGAssistiveTechHighWindowLevel;
|
||||||
MPAutotypeCandidateSelectionViewController *vc = [[MPAutotypeCandidateSelectionViewController alloc] init];
|
MPAutotypeCandidateSelectionViewController *vc = [[MPAutotypeCandidateSelectionViewController alloc] init];
|
||||||
vc.candidates = candidates;
|
vc.candidates = candidates;
|
||||||
|
vc.windowTitle = windowTitle;
|
||||||
self.matchSelectionWindow.collectionBehavior |= (NSWindowCollectionBehaviorFullScreenAuxiliary |
|
self.matchSelectionWindow.collectionBehavior |= (NSWindowCollectionBehaviorFullScreenAuxiliary |
|
||||||
NSWindowCollectionBehaviorMoveToActiveSpace |
|
NSWindowCollectionBehaviorMoveToActiveSpace |
|
||||||
NSWindowCollectionBehaviorTransient );
|
NSWindowCollectionBehaviorTransient );
|
||||||
@@ -416,15 +400,30 @@ static MPAutotypeDaemon *_sharedInstance;
|
|||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
#pragma mark Application information
|
#pragma mark Application information
|
||||||
- (BOOL)_orderApplicationToFront:(pid_t)processIdentifier {
|
- (BOOL)_orderApplicationToFront:(pid_t)processIdentifier forContext:(MPAutotypeContext *)context {
|
||||||
NSRunningApplication *runingApplication = [NSRunningApplication runningApplicationWithProcessIdentifier:processIdentifier];
|
NSRunningApplication *runingApplication = [NSRunningApplication runningApplicationWithProcessIdentifier:processIdentifier];
|
||||||
NSRunningApplication *frontApplication = NSWorkspace.sharedWorkspace.frontmostApplication;
|
NSRunningApplication *frontApplication = NSWorkspace.sharedWorkspace.frontmostApplication;
|
||||||
if(frontApplication.processIdentifier == processIdentifier) {
|
if(frontApplication.processIdentifier == processIdentifier) {
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
[runingApplication activateWithOptions:NSApplicationActivateIgnoringOtherApps];
|
|
||||||
return YES;
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* cleanup before to make sure everything is top notch */
|
||||||
|
if(self.applicationActivationObserver) {
|
||||||
|
[NSWorkspace.sharedWorkspace.notificationCenter removeObserver:self.applicationActivationObserver name:NSWorkspaceDidActivateApplicationNotification object:nil];
|
||||||
|
self.applicationActivationObserver = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.applicationActivationObserver = [NSWorkspace.sharedWorkspace.notificationCenter addObserverForName:NSWorkspaceDidActivateApplicationNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
|
||||||
|
if(self.applicationActivationObserver) {
|
||||||
|
[NSWorkspace.sharedWorkspace.notificationCenter removeObserver:self.applicationActivationObserver name:NSWorkspaceDidActivateApplicationNotification object:nil];
|
||||||
|
}
|
||||||
|
[self _performAutotypeForContext:context];
|
||||||
|
}];
|
||||||
|
|
||||||
|
[runingApplication activateWithOptions:NSApplicationActivateIgnoringOtherApps];
|
||||||
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)_updateTargetInformationForFrontMostApplication {
|
- (void)_updateTargetInformationForFrontMostApplication {
|
||||||
[self _updateTargeInformationForApplication:NSWorkspace.sharedWorkspace.frontmostApplication];
|
[self _updateTargeInformationForApplication:NSWorkspace.sharedWorkspace.frontmostApplication];
|
||||||
}
|
}
|
||||||
@@ -436,8 +435,19 @@ static MPAutotypeDaemon *_sharedInstance;
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
NSDictionary *frontApplicationInfoDict = [self _infoDictionaryForApplication:application];
|
NSDictionary *frontApplicationInfoDict = [self _infoDictionaryForApplication:application];
|
||||||
|
|
||||||
self.targetPID = [frontApplicationInfoDict[kMPProcessIdentifierKey] intValue];
|
self.targetPID = [frontApplicationInfoDict[kMPProcessIdentifierKey] intValue];
|
||||||
self.targetWindowTitle = frontApplicationInfoDict[kMPWindowTitleKey];
|
self.targetWindowTitle = frontApplicationInfoDict[kMPWindowTitleKey];
|
||||||
|
|
||||||
|
/* if we have any resolvers, let them provide the window title */
|
||||||
|
NSArray *resolvers = [MPPluginHost.sharedHost windowTitleResolverForRunningApplication:application];
|
||||||
|
for(MPPlugin<MPAutotypeWindowTitleResolverPlugin> *resolver in resolvers) {
|
||||||
|
NSString *windowTitle = [resolver windowTitleForRunningApplication:application];
|
||||||
|
if(windowTitle.length > 0) {
|
||||||
|
self.targetWindowTitle = windowTitle;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,7 @@
|
|||||||
@interface MPAutotypeDelay : MPAutotypeCommand
|
@interface MPAutotypeDelay : MPAutotypeCommand
|
||||||
|
|
||||||
@property (readonly) NSUInteger delay;
|
@property (readonly) NSUInteger delay;
|
||||||
|
@property (readonly) BOOL isGlobal;
|
||||||
/**
|
/**
|
||||||
* Creates an DelayCommand that delays the execution for n milliseconds
|
* Creates an DelayCommand that delays the execution for n milliseconds
|
||||||
*
|
*
|
||||||
@@ -33,5 +34,6 @@
|
|||||||
* @return <#return value description#>
|
* @return <#return value description#>
|
||||||
*/
|
*/
|
||||||
- (instancetype)initWithDelay:(NSUInteger)delay;
|
- (instancetype)initWithDelay:(NSUInteger)delay;
|
||||||
|
- (instancetype)initWithGlobalDelay:(NSUInteger)delay;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -29,7 +29,7 @@
|
|||||||
@implementation MPAutotypeDelay
|
@implementation MPAutotypeDelay
|
||||||
|
|
||||||
- (id)init {
|
- (id)init {
|
||||||
self = [self initWithDelay:0];
|
self = [self _initWithDelay:0 global:NO];
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,17 +38,32 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (instancetype)initWithDelay:(NSUInteger)delay {
|
- (instancetype)initWithDelay:(NSUInteger)delay {
|
||||||
|
self = [self _initWithDelay:delay global:NO];
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (instancetype)initWithGlobalDelay:(NSUInteger)delay {
|
||||||
|
self = [self _initWithDelay:delay global:YES];
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (instancetype)_initWithDelay:(NSUInteger)delay global:(BOOL)global {
|
||||||
self = [super init];
|
self = [super init];
|
||||||
if(self) {
|
if(self) {
|
||||||
|
_isGlobal = global;
|
||||||
/* Delays longer than a minute are a bit long */
|
/* Delays longer than a minute are a bit long */
|
||||||
_delay = MIN(60*1000,delay);
|
_delay = MIN(60*NSEC_PER_USEC,delay);
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)execute {
|
- (void)execute {
|
||||||
/* milliseconds * 10000 = microseconds */
|
/* milliseconds * 10000 = microseconds */
|
||||||
usleep((useconds_t)(self.delay*1000));
|
if(self.isGlobal) {
|
||||||
|
return; // global delays should not be executed locally
|
||||||
|
}
|
||||||
|
usleep((useconds_t)(self.delay*NSEC_PER_USEC));
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
30
MacPass/MPAutotypeDoctor.h
Normal file
30
MacPass/MPAutotypeDoctor.h
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
//
|
||||||
|
// MPAutotypeDoctor.h
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Michael Starke on 03.07.19.
|
||||||
|
// Copyright © 2019 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@interface MPAutotypeDoctor : NSObject
|
||||||
|
|
||||||
|
|
||||||
|
@property (class, readonly, strong) MPAutotypeDoctor *defaultDoctor;
|
||||||
|
@property (nonatomic, readonly) BOOL hasNecessaryAutotypePermissions; // MacPass has all the permissions it needs to run autotype on the current system
|
||||||
|
|
||||||
|
- (BOOL)hasScreenRecordingPermissions:(NSError *__autoreleasing*)error;
|
||||||
|
- (BOOL)hasAccessibiltyPermissions:(NSError *__autoreleasing*)error;
|
||||||
|
|
||||||
|
- (void)runChecksAndPresentResults;
|
||||||
|
- (void)openScreenRecordingPreferences;
|
||||||
|
- (void)requestScreenRecordingPermission;
|
||||||
|
- (void)openAccessibiltyPreferences;
|
||||||
|
- (void)openAutomationPreferences;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
||||||
153
MacPass/MPAutotypeDoctor.m
Normal file
153
MacPass/MPAutotypeDoctor.m
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
//
|
||||||
|
// MPAutotypeDoctor.m
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Michael Starke on 03.07.19.
|
||||||
|
// Copyright © 2019 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "MPAutotypeDoctor.h"
|
||||||
|
#import "MPSettingsHelper.h"
|
||||||
|
#import "NSApplication+MPAdditions.h"
|
||||||
|
#import "MPAutotypeDoctorReportViewController.h"
|
||||||
|
#import "NSError+Messages.h"
|
||||||
|
|
||||||
|
|
||||||
|
@interface MPReportItem : NSObject
|
||||||
|
|
||||||
|
@property (copy) NSString *statusDescription;
|
||||||
|
@property (copy) NSString *label;
|
||||||
|
@property (copy) NSString *actionLabel;
|
||||||
|
@property BOOL isOK;
|
||||||
|
@property (weak) id target;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation MPReportItem
|
||||||
|
|
||||||
|
- (instancetype)init {
|
||||||
|
self = [super init];
|
||||||
|
if(self) {
|
||||||
|
_isOK = NO;
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
@interface MPAutotypeDoctor () <NSWindowDelegate>
|
||||||
|
@property (strong) NSWindow *reportWindow;
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation MPAutotypeDoctor
|
||||||
|
|
||||||
|
+ (MPAutotypeDoctor *)defaultDoctor {
|
||||||
|
static MPAutotypeDoctor *instance;
|
||||||
|
static dispatch_once_t onceToken;
|
||||||
|
dispatch_once(&onceToken, ^{
|
||||||
|
instance = [[MPAutotypeDoctor alloc] init];
|
||||||
|
});
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)hasNecessaryAutotypePermissions {
|
||||||
|
if(![self hasAccessibiltyPermissions:NULL]) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
if(![self hasScreenRecordingPermissions:NULL]) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)hasScreenRecordingPermissions:(NSError *__autoreleasing*)error {
|
||||||
|
/* macos 10.14 and lower do not require screen recording permission to get window titles */
|
||||||
|
if (@available(macOS 10.15, *)) {
|
||||||
|
CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
|
||||||
|
NSUInteger numberOfWindows = CFArrayGetCount(windowList);
|
||||||
|
NSUInteger numberOfWindowsWithName = 0;
|
||||||
|
for(int idx = 0; idx < numberOfWindows; idx++) {
|
||||||
|
NSDictionary *windowInfo = (NSDictionary *)CFArrayGetValueAtIndex(windowList, idx);
|
||||||
|
NSString *windowName = windowInfo[(id)kCGWindowName];
|
||||||
|
if(windowName) {
|
||||||
|
numberOfWindowsWithName++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
break; //breaking early, numberOfWindowsWithName not increased
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CFRelease(windowList);
|
||||||
|
BOOL canRecordScreen = (numberOfWindows == numberOfWindowsWithName);
|
||||||
|
if(!canRecordScreen && error) {
|
||||||
|
*error = [NSError errorInDomain:MPAutotypeErrorDomain withCode:MPErrorAutotypeIsMissingScreenRecordingPermissions description:NSLocalizedString(@"ERROR_NO_PERMISSION_TO_RECORD_SCREEN", "Error description for missing screen recording permissions")];
|
||||||
|
}
|
||||||
|
return canRecordScreen;
|
||||||
|
}
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)hasAccessibiltyPermissions:(NSError *__autoreleasing*)error {
|
||||||
|
BOOL isTrusted = YES;
|
||||||
|
/* macOS 10.13 and lower allows us to send key events regardless of accessibilty trust */
|
||||||
|
if(@available(macOS 10.14, *)) {
|
||||||
|
isTrusted = AXIsProcessTrusted();
|
||||||
|
if(!isTrusted && error) {
|
||||||
|
*error = [NSError errorInDomain:MPAutotypeErrorDomain withCode:MPErrorAutotypeIsMissingAccessibiltyPermissions description:NSLocalizedString(@"ERROR_NO_ACCESSIBILTY_PERMISSIONS", "Error description for missing accessibilty permissions")];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return isTrusted;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)openAccessibiltyPreferences {
|
||||||
|
[NSWorkspace.sharedWorkspace openURL:[NSURL URLWithString:@"x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility"]];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)openScreenRecordingPreferences {
|
||||||
|
[NSWorkspace.sharedWorkspace openURL:[NSURL URLWithString:@"x-apple.systempreferences:com.apple.preference.security?Privacy_ScreenCapture"]];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)requestScreenRecordingPermission {
|
||||||
|
/* macos 10.14 and lower do not require screen recording permission to get window titles */
|
||||||
|
if(@available(macos 10.15, *)) {
|
||||||
|
/*
|
||||||
|
To minimize the intrusion just make a 1px image of the upper left corner
|
||||||
|
This way there is no real possibilty to access any private data
|
||||||
|
*/
|
||||||
|
CGImageRef screenshot = CGWindowListCreateImage(
|
||||||
|
CGRectMake(0, 0, 1, 1),
|
||||||
|
kCGWindowListOptionOnScreenOnly,
|
||||||
|
kCGNullWindowID,
|
||||||
|
kCGWindowImageDefault);
|
||||||
|
CFRelease(screenshot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)openAutomationPreferences {
|
||||||
|
[NSWorkspace.sharedWorkspace openURL:[NSURL URLWithString:@"x-apple.systempreferences:com.apple.preference.security?Privacy_Automation"]];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)runChecksAndPresentResults {
|
||||||
|
if(!self.reportWindow) {
|
||||||
|
self.reportWindow = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
|
||||||
|
styleMask:NSWindowStyleMaskTitled|NSWindowStyleMaskClosable|NSWindowStyleMaskResizable
|
||||||
|
backing:NSBackingStoreBuffered
|
||||||
|
defer:NO];
|
||||||
|
self.reportWindow.releasedWhenClosed = NO;
|
||||||
|
self.reportWindow.title = NSLocalizedString(@"AUTOTYPE_DOCTOR_RESULTS_WINDOW_TITLE", @"Window title for the stand-alone password creator window");
|
||||||
|
self.reportWindow.delegate = self;
|
||||||
|
}
|
||||||
|
MPAutotypeDoctorReportViewController *vc = [[MPAutotypeDoctorReportViewController alloc] init];
|
||||||
|
self.reportWindow.contentViewController = vc;
|
||||||
|
|
||||||
|
[self.reportWindow center];
|
||||||
|
[self.reportWindow makeKeyAndOrderFront:vc];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)windowWillClose:(NSNotification *)notification {
|
||||||
|
if(notification.object == self.reportWindow) {
|
||||||
|
self.reportWindow = nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
29
MacPass/MPAutotypeDoctorReportViewController.h
Normal file
29
MacPass/MPAutotypeDoctorReportViewController.h
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
//
|
||||||
|
// MPAutotypeDoctorReportViewController.h
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Michael Starke on 05.07.19.
|
||||||
|
// Copyright © 2019 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_BEGIN
|
||||||
|
|
||||||
|
@interface MPAutotypeDoctorReportViewController : NSViewController
|
||||||
|
|
||||||
|
@property (strong) IBOutlet NSImageView *accessibiltyStatusImageView;
|
||||||
|
@property (strong) IBOutlet NSTextField *accessibiltyStatusTextField;
|
||||||
|
|
||||||
|
@property (strong) IBOutlet NSImageView *screenRecordingStatusImageView;
|
||||||
|
@property (strong) IBOutlet NSTextField *screenRecordingStatusTextField;
|
||||||
|
@property (strong) IBOutlet NSButton *requestScreenRecordingButton;
|
||||||
|
|
||||||
|
- (IBAction)openAccessibiltyPreferences:(id)sender;
|
||||||
|
- (IBAction)openScreenRecordingPreferences:(id)sender;
|
||||||
|
- (IBAction)requestScreenRecordingPermissions:(id)sender;
|
||||||
|
- (IBAction)openAutomationPreferences:(id)sender;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
NS_ASSUME_NONNULL_END
|
||||||
73
MacPass/MPAutotypeDoctorReportViewController.m
Normal file
73
MacPass/MPAutotypeDoctorReportViewController.m
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
//
|
||||||
|
// MPAutotypeDoctorReportViewController.m
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Michael Starke on 05.07.19.
|
||||||
|
// Copyright © 2019 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "MPAutotypeDoctorReportViewController.h"
|
||||||
|
#import "MPAutotypeDoctor.h"
|
||||||
|
|
||||||
|
@implementation MPAutotypeDoctorReportViewController
|
||||||
|
|
||||||
|
- (NSNibName)nibName {
|
||||||
|
return @"AutotypeDoctorReportViewController";
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)viewDidLoad {
|
||||||
|
[super viewDidLoad];
|
||||||
|
[self _updateView];
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)openAccessibiltyPreferences:(id)sender {
|
||||||
|
[MPAutotypeDoctor.defaultDoctor openAccessibiltyPreferences];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)openScreenRecordingPreferences:(id)sender {
|
||||||
|
[MPAutotypeDoctor.defaultDoctor openScreenRecordingPreferences];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (IBAction)requestScreenRecordingPermissions:(id)sender {
|
||||||
|
[MPAutotypeDoctor.defaultDoctor requestScreenRecordingPermission];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)openAutomationPreferences:(id)sender {
|
||||||
|
[MPAutotypeDoctor.defaultDoctor openAutomationPreferences];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (void)_updateView {
|
||||||
|
NSError *error;
|
||||||
|
if([MPAutotypeDoctor.defaultDoctor hasAccessibiltyPermissions:&error]) {
|
||||||
|
self.accessibiltyStatusImageView.image = [NSImage imageNamed:NSImageNameStatusAvailable];
|
||||||
|
self.accessibiltyStatusTextField.stringValue = NSLocalizedString(@"AUTOTYPE_STATUS_ACCESSIBILTY_PERMISSIONS_OK", "Status label when no issue were found in accessibilty");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
self.accessibiltyStatusImageView.image = [NSImage imageNamed:NSImageNameStatusUnavailable];
|
||||||
|
if(error && error.localizedDescription) {
|
||||||
|
self.accessibiltyStatusTextField.stringValue = error.localizedDescription;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
self.accessibiltyStatusTextField.stringValue = NSLocalizedString(@"AUTOTYPE_STATUS_NO_ACCESSIBILTY_PERMISSIONS", "Status MacPass has no accessibilty permissions");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if([MPAutotypeDoctor.defaultDoctor hasScreenRecordingPermissions:&error]) {
|
||||||
|
self.requestScreenRecordingButton.enabled = NO;
|
||||||
|
self.screenRecordingStatusImageView.image = [NSImage imageNamed:NSImageNameStatusAvailable];
|
||||||
|
self.screenRecordingStatusTextField.stringValue = NSLocalizedString(@"AUTOTYPE_STATUS_SCREEN_RECORDING_PERMISSIONS_OK", "Status label when no issue were found in screen recording permissions");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
self.requestScreenRecordingButton.enabled = YES;
|
||||||
|
self.screenRecordingStatusImageView.image = [NSImage imageNamed:NSImageNameStatusUnavailable];
|
||||||
|
if(error && error.localizedDescription) {
|
||||||
|
self.screenRecordingStatusTextField.stringValue = error.localizedDescription;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
self.screenRecordingStatusTextField.stringValue = NSLocalizedString(@"AUTOTYPE_STATUS_NO_SCREEN_RECORDING_PERMISSIONS", "Status MacPass has no screen recording permissions");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -281,7 +281,7 @@ static CGKeyCode kMPNumpadKeyCodes[] = {
|
|||||||
static NSRegularExpression *delayRegExp;
|
static NSRegularExpression *delayRegExp;
|
||||||
static dispatch_once_t onceToken;
|
static dispatch_once_t onceToken;
|
||||||
dispatch_once(&onceToken, ^{
|
dispatch_once(&onceToken, ^{
|
||||||
NSString *delayPattern = [[NSString alloc] initWithFormat:@"\\{(%@|%@)[ |=]+([0-9]+)\\}",
|
NSString *delayPattern = [[NSString alloc] initWithFormat:@"\\{(%@|%@)([ |=])+([0-9]+)\\}",
|
||||||
kKPKAutotypeDelay,
|
kKPKAutotypeDelay,
|
||||||
kKPKAutotypeVirtualKey/*,
|
kKPKAutotypeVirtualKey/*,
|
||||||
kKPKAutotypeVirtualExtendedKey,
|
kKPKAutotypeVirtualExtendedKey,
|
||||||
@@ -327,9 +327,10 @@ static CGKeyCode kMPNumpadKeyCodes[] = {
|
|||||||
// TODO: add {APPLICATION <appname>}
|
// TODO: add {APPLICATION <appname>}
|
||||||
/* Delay */
|
/* Delay */
|
||||||
NSTextCheckingResult *result = [delayRegExp firstMatchInString:commandString options:0 range:NSMakeRange(0, commandString.length)];
|
NSTextCheckingResult *result = [delayRegExp firstMatchInString:commandString options:0 range:NSMakeRange(0, commandString.length)];
|
||||||
if(result && (result.numberOfRanges == 3)) {
|
if(result && (result.numberOfRanges == 4)) {
|
||||||
NSString *uppercaseCommand = [[commandString substringWithRange:[result rangeAtIndex:1]] uppercaseString];
|
NSString *uppercaseCommand = [[commandString substringWithRange:[result rangeAtIndex:1]] uppercaseString];
|
||||||
NSString *valueString = [commandString substringWithRange:[result rangeAtIndex:2]];
|
NSString *assignOrNot = [commandString substringWithRange:[result rangeAtIndex:2]];
|
||||||
|
NSString *valueString = [commandString substringWithRange:[result rangeAtIndex:3]];
|
||||||
NSScanner *numberScanner = [[NSScanner alloc] initWithString:valueString];
|
NSScanner *numberScanner = [[NSScanner alloc] initWithString:valueString];
|
||||||
NSInteger value;
|
NSInteger value;
|
||||||
if([numberScanner scanInteger:&value]) {
|
if([numberScanner scanInteger:&value]) {
|
||||||
@@ -337,7 +338,12 @@ static CGKeyCode kMPNumpadKeyCodes[] = {
|
|||||||
if(MAX(0, value) <= 0) {
|
if(MAX(0, value) <= 0) {
|
||||||
return; // Value too low, just skipp
|
return; // Value too low, just skipp
|
||||||
}
|
}
|
||||||
|
if([assignOrNot isEqualToString:@"="]) {
|
||||||
|
[self.mutableCommands addObject:[[MPAutotypeDelay alloc] initWithGlobalDelay:value]];
|
||||||
|
}
|
||||||
|
else {
|
||||||
[self.mutableCommands addObject:[[MPAutotypeDelay alloc] initWithDelay:value]];
|
[self.mutableCommands addObject:[[MPAutotypeDelay alloc] initWithDelay:value]];
|
||||||
|
}
|
||||||
return; // Done
|
return; // Done
|
||||||
}
|
}
|
||||||
else if([kKPKAutotypeVirtualKey isEqualToString:uppercaseCommand]) {
|
else if([kKPKAutotypeVirtualKey isEqualToString:uppercaseCommand]) {
|
||||||
|
|||||||
@@ -30,7 +30,8 @@ typedef NS_OPTIONS(NSUInteger, MPContextMenuItemsFlags) {
|
|||||||
MPContextMenuDuplicate = 1 << 4,
|
MPContextMenuDuplicate = 1 << 4,
|
||||||
MPContextMenuAutotype = 1 << 5,
|
MPContextMenuAutotype = 1 << 5,
|
||||||
MPContextMenuHistory = 1 << 6,
|
MPContextMenuHistory = 1 << 6,
|
||||||
MPContextMenuMinimal = MPContextMenuCreate | MPContextMenuDelete,
|
MPContextMenuShowGroupInOutline = 1 << 7,
|
||||||
|
MPContextMenuMinimal = MPContextMenuCreate | MPContextMenuDelete | MPContextMenuDuplicate,
|
||||||
MPContextMenuFull = MPContextMenuMinimal | MPContextMenuCopy | MPContextMenuDuplicate | MPContextMenuAutotype | MPContextMenuHistory,
|
MPContextMenuFull = MPContextMenuMinimal | MPContextMenuCopy | MPContextMenuDuplicate | MPContextMenuAutotype | MPContextMenuHistory,
|
||||||
MPContextMenuExtended = MPContextMenuFull | MPContextMenuTrash
|
MPContextMenuExtended = MPContextMenuFull | MPContextMenuTrash
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ static void MPContextmenuHelperBeginSection(NSMutableArray *items) {
|
|||||||
BOOL const insertDuplicate = MPIsFlagSetInOptions(MPContextMenuDuplicate, flags);
|
BOOL const insertDuplicate = MPIsFlagSetInOptions(MPContextMenuDuplicate, flags);
|
||||||
BOOL const insertAutotype = MPIsFlagSetInOptions(MPContextMenuAutotype, flags);
|
BOOL const insertAutotype = MPIsFlagSetInOptions(MPContextMenuAutotype, flags);
|
||||||
BOOL const insertHistory = MPIsFlagSetInOptions(MPContextMenuHistory, flags);
|
BOOL const insertHistory = MPIsFlagSetInOptions(MPContextMenuHistory, flags);
|
||||||
|
BOOL const insertShowGroupInOutline = MPIsFlagSetInOptions(MPContextMenuShowGroupInOutline, flags);
|
||||||
|
|
||||||
NSMutableArray *items = [NSMutableArray arrayWithCapacity:10];
|
NSMutableArray *items = [NSMutableArray arrayWithCapacity:10];
|
||||||
if(insertCreate) {
|
if(insertCreate) {
|
||||||
@@ -63,8 +64,11 @@ static void MPContextmenuHelperBeginSection(NSMutableArray *items) {
|
|||||||
NSMenuItem *duplicateEntyWithOptions = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"DUPLICATE_ENTRY_WITH_OPTIONS", @"Menu item to duplicate an entry with options how to duplicate. Will present a dialog.")
|
NSMenuItem *duplicateEntyWithOptions = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"DUPLICATE_ENTRY_WITH_OPTIONS", @"Menu item to duplicate an entry with options how to duplicate. Will present a dialog.")
|
||||||
action:[MPActionHelper actionOfType:MPActionDuplicateEntryWithOptions]
|
action:[MPActionHelper actionOfType:MPActionDuplicateEntryWithOptions]
|
||||||
keyEquivalent:@""];
|
keyEquivalent:@""];
|
||||||
|
NSMenuItem *duplicateGroup = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"DUPLICATE_GROUP", @"Menu item to directly diplicate a group")
|
||||||
|
action:[MPActionHelper actionOfType:MPActionDuplicateGroup]
|
||||||
|
keyEquivalent:@""];
|
||||||
|
|
||||||
[items addObjectsFromArray:@[ duplicateEntry, duplicateEntyWithOptions ]];
|
[items addObjectsFromArray:@[ duplicateEntry, duplicateEntyWithOptions, duplicateGroup ]];
|
||||||
|
|
||||||
}
|
}
|
||||||
if(insertDelete || insertTrash) {
|
if(insertDelete || insertTrash) {
|
||||||
@@ -113,7 +117,7 @@ static void MPContextmenuHelperBeginSection(NSMutableArray *items) {
|
|||||||
|
|
||||||
[items addObjectsFromArray:@[ copyUsername, copyPassword, urlItem]];
|
[items addObjectsFromArray:@[ copyUsername, copyPassword, urlItem]];
|
||||||
}
|
}
|
||||||
if(insertAutotype || insertHistory) {
|
if(insertAutotype || insertHistory || insertShowGroupInOutline) {
|
||||||
MPContextmenuHelperBeginSection(items);
|
MPContextmenuHelperBeginSection(items);
|
||||||
if(insertAutotype) {
|
if(insertAutotype) {
|
||||||
NSMenuItem *performAutotype = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"PERFORM_AUTOTYPE_FOR_ENTRY", @"Menu item to perform autotype with the selected entry")
|
NSMenuItem *performAutotype = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"PERFORM_AUTOTYPE_FOR_ENTRY", @"Menu item to perform autotype with the selected entry")
|
||||||
@@ -128,6 +132,12 @@ static void MPContextmenuHelperBeginSection(NSMutableArray *items) {
|
|||||||
showHistory.keyEquivalentModifierMask = (showHistory.keyEquivalentModifierMask | NSCommandKeyMask | NSControlKeyMask);
|
showHistory.keyEquivalentModifierMask = (showHistory.keyEquivalentModifierMask | NSCommandKeyMask | NSControlKeyMask);
|
||||||
[items addObject:showHistory];
|
[items addObject:showHistory];
|
||||||
}
|
}
|
||||||
|
if(insertShowGroupInOutline) {
|
||||||
|
NSMenuItem *showGroupInOutline = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SHOW_GROUP_IN_OUTLINE", @"Menu item to show the entries group in the outline view")
|
||||||
|
action:[MPActionHelper actionOfType:MPActionShowGroupInOutline]
|
||||||
|
keyEquivalent:@""];
|
||||||
|
[items addObject:showGroupInOutline];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return items;
|
return items;
|
||||||
|
|||||||
@@ -165,7 +165,6 @@ FOUNDATION_EXPORT NSString *const MPDocumentGroupKey;
|
|||||||
- (void)deleteNode:(KPKNode *)node;
|
- (void)deleteNode:(KPKNode *)node;
|
||||||
- (void)duplicateEntryWithOptions:(KPKCopyOptions)options;
|
- (void)duplicateEntryWithOptions:(KPKCopyOptions)options;
|
||||||
|
|
||||||
|
|
||||||
#pragma mark Actions
|
#pragma mark Actions
|
||||||
/**
|
/**
|
||||||
* Empties the Trash group. Removing all Groups and Entries inside. This action is not undo-able
|
* Empties the Trash group. Removing all Groups and Entries inside. This action is not undo-able
|
||||||
@@ -179,6 +178,7 @@ FOUNDATION_EXPORT NSString *const MPDocumentGroupKey;
|
|||||||
*/
|
*/
|
||||||
- (IBAction)createEntryFromTemplate:(id)sender;
|
- (IBAction)createEntryFromTemplate:(id)sender;
|
||||||
- (IBAction)duplicateEntry:(id)sender;
|
- (IBAction)duplicateEntry:(id)sender;
|
||||||
|
- (IBAction)duplicateGroup:(id)sender;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|||||||
@@ -168,11 +168,20 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
|
|||||||
NSRecoveryAttempterErrorKey : recovery
|
NSRecoveryAttempterErrorKey : recovery
|
||||||
};
|
};
|
||||||
if(outError != NULL) {
|
if(outError != NULL) {
|
||||||
*outError = [NSError errorWithDomain:MPErrorDomain code:MPErrorNoPasswordOrKeyFile userInfo:userInfo];
|
*outError = [NSError errorWithDomain:MPDefaultErrorDomain code:MPErrorNoPasswordOrKeyFile userInfo:userInfo];
|
||||||
}
|
}
|
||||||
return NO;
|
return NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSString *)fileNameExtensionForType:(NSString *)typeName saveOperation:(NSSaveOperationType)saveOperation {
|
||||||
|
NSString *proposedExtension = [super fileNameExtensionForType:typeName saveOperation:saveOperation];
|
||||||
|
if(!self.fileURL) {
|
||||||
|
return proposedExtension;
|
||||||
|
}
|
||||||
|
NSString *actualExtension = self.fileURL.pathExtension;
|
||||||
|
return actualExtension;
|
||||||
|
}
|
||||||
|
|
||||||
- (NSData *)dataOfType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError {
|
- (NSData *)dataOfType:(NSString *)typeName error:(NSError * _Nullable __autoreleasing *)outError {
|
||||||
if(self.encrypted) {
|
if(self.encrypted) {
|
||||||
NSLog(@"%@ should not be called on locked databases!", NSStringFromSelector(_cmd));
|
NSLog(@"%@ should not be called on locked databases!", NSStringFromSelector(_cmd));
|
||||||
@@ -181,7 +190,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
|
|||||||
if(!self.compositeKey.hasPasswordOrKeyFile) {
|
if(!self.compositeKey.hasPasswordOrKeyFile) {
|
||||||
if(outError != NULL) {
|
if(outError != NULL) {
|
||||||
NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: NSLocalizedString(@"WARNING_ON_SAVE_NO_PASSWORD_OR_KEY_SET", "") };
|
NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: NSLocalizedString(@"WARNING_ON_SAVE_NO_PASSWORD_OR_KEY_SET", "") };
|
||||||
*outError = [NSError errorWithDomain:MPErrorDomain code:0 userInfo:userInfo];
|
*outError = [NSError errorWithDomain:MPDefaultErrorDomain code:0 userInfo:userInfo];
|
||||||
}
|
}
|
||||||
return nil; // Saving without a password/key is not possible
|
return nil; // Saving without a password/key is not possible
|
||||||
}
|
}
|
||||||
@@ -190,7 +199,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
|
|||||||
if(format == KPKDatabaseFormatUnknown) {
|
if(format == KPKDatabaseFormatUnknown) {
|
||||||
if(outError != NULL) {
|
if(outError != NULL) {
|
||||||
NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: NSLocalizedString(@"UNKNOWN_FILE_VERSION", "") };
|
NSDictionary *userInfo = @{ NSLocalizedDescriptionKey: NSLocalizedString(@"UNKNOWN_FILE_VERSION", "") };
|
||||||
*outError = [NSError errorWithDomain:MPErrorDomain code:0 userInfo:userInfo];
|
*outError = [NSError errorWithDomain:MPDefaultErrorDomain code:0 userInfo:userInfo];
|
||||||
}
|
}
|
||||||
return nil; // We do not know what version to save!
|
return nil; // We do not know what version to save!
|
||||||
}
|
}
|
||||||
@@ -828,7 +837,16 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
|
|||||||
KPKEntry *duplicate = [entry copyWithTitle:nil options:options];
|
KPKEntry *duplicate = [entry copyWithTitle:nil options:options];
|
||||||
[duplicate addToGroup:entry.parent];
|
[duplicate addToGroup:entry.parent];
|
||||||
}
|
}
|
||||||
[self.undoManager setActionName:[NSString stringWithFormat:NSLocalizedString(@"DUPLICATE_ENTRIES_%ld", @"Action name for duplicating entries"), self.selectedEntries.count]];
|
[self.undoManager setActionName:[NSString stringWithFormat:NSLocalizedString(@"DUPLICATE_ENTRIES_ACTION_NAME", @"Action name for duplicating entries"), self.selectedEntries.count]];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)duplicateGroup:(id)sender {
|
||||||
|
for(KPKGroup *group in self.selectedGroups) {
|
||||||
|
KPKGroup *duplicate = [group copyWithTitle:nil options:kKPKCopyOptionNone];
|
||||||
|
/* if group is root group, add the duplicate below */
|
||||||
|
[duplicate addToGroup:(group.parent ? group.parent : group)];
|
||||||
|
}
|
||||||
|
[self.undoManager setActionName:[NSString stringWithFormat:NSLocalizedString(@"DUPLICATE_GROUPS_ACTION_NAME", @"Action name for duplicating groups"), self.selectedGroups.count]];
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark Validation
|
#pragma mark Validation
|
||||||
@@ -886,6 +904,9 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
|
|||||||
valid &= targetEntries.count > 0;
|
valid &= targetEntries.count > 0;
|
||||||
valid &= !self.historyEntry;
|
valid &= !self.historyEntry;
|
||||||
break;
|
break;
|
||||||
|
case MPActionDuplicateGroup:
|
||||||
|
valid &= targetGroups.count > 0;
|
||||||
|
break;
|
||||||
case MPActionEmptyTrash:
|
case MPActionEmptyTrash:
|
||||||
valid &= (self.trash.groups.count + self.trash.entries.count) > 0;
|
valid &= (self.trash.groups.count + self.trash.entries.count) > 0;
|
||||||
break;
|
break;
|
||||||
@@ -915,6 +936,10 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
|
|||||||
case MPActionCopyAsReference:
|
case MPActionCopyAsReference:
|
||||||
valid &= (nil != targetEntry);
|
valid &= (nil != targetEntry);
|
||||||
break;
|
break;
|
||||||
|
case MPActionShowGroupInOutline:
|
||||||
|
valid &= (nil != targetEntry);
|
||||||
|
valid &= self.hasSearch;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
@class MPOutlineViewController;
|
@class MPOutlineViewController;
|
||||||
@class MPToolbarDelegate;
|
@class MPToolbarDelegate;
|
||||||
|
|
||||||
@interface MPDocumentWindowController : NSWindowController
|
@interface MPDocumentWindowController : NSWindowController <NSTouchBarDelegate>
|
||||||
|
|
||||||
@property (readonly, strong) MPPasswordInputController *passwordInputController;
|
@property (readonly, strong) MPPasswordInputController *passwordInputController;
|
||||||
@property (readonly, strong) MPEntryViewController *entryViewController;
|
@property (readonly, strong) MPEntryViewController *entryViewController;
|
||||||
@@ -39,8 +39,7 @@
|
|||||||
@property (readonly, strong) MPInspectorViewController *inspectorViewController;
|
@property (readonly, strong) MPInspectorViewController *inspectorViewController;
|
||||||
@property (readonly, strong) MPToolbarDelegate *toolbarDelegate;
|
@property (readonly, strong) MPToolbarDelegate *toolbarDelegate;
|
||||||
|
|
||||||
#pragma mark Search
|
@property (readonly, nonatomic, strong) NSSearchField *searchField;
|
||||||
- (NSSearchField *)searchField;
|
|
||||||
|
|
||||||
- (void)showEntries;
|
- (void)showEntries;
|
||||||
- (void)showPasswordInput;
|
- (void)showPasswordInput;
|
||||||
@@ -67,11 +66,11 @@
|
|||||||
- (IBAction)delete:(id)sender;
|
- (IBAction)delete:(id)sender;
|
||||||
|
|
||||||
- (IBAction)duplicateEntryWithOptions:(id)sender;
|
- (IBAction)duplicateEntryWithOptions:(id)sender;
|
||||||
|
|
||||||
- (IBAction)pickExpiryDate:(id)sender;
|
- (IBAction)pickExpiryDate:(id)sender;
|
||||||
|
|
||||||
- (IBAction)performAutotypeForEntry:(id)sender;
|
- (IBAction)performAutotypeForEntry:(id)sender;
|
||||||
|
|
||||||
|
- (IBAction)showGroupInOutline:(id)sender;
|
||||||
|
|
||||||
/* actions relayed to MPEntryViewController */
|
/* actions relayed to MPEntryViewController */
|
||||||
- (IBAction)copyUsername:(id)sender;
|
- (IBAction)copyUsername:(id)sender;
|
||||||
- (IBAction)copyPassword:(id)sender;
|
- (IBAction)copyPassword:(id)sender;
|
||||||
|
|||||||
@@ -39,6 +39,8 @@
|
|||||||
#import "MPSettingsHelper.h"
|
#import "MPSettingsHelper.h"
|
||||||
#import "MPToolbarDelegate.h"
|
#import "MPToolbarDelegate.h"
|
||||||
#import "MPTitlebarColorAccessoryViewController.h"
|
#import "MPTitlebarColorAccessoryViewController.h"
|
||||||
|
#import "MPTouchBarButtonCreator.h"
|
||||||
|
#import "MPIconHelper.h"
|
||||||
|
|
||||||
#import "MPPluginHost.h"
|
#import "MPPluginHost.h"
|
||||||
#import "MPPlugin.h"
|
#import "MPPlugin.h"
|
||||||
@@ -543,6 +545,14 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
|
|||||||
[contentView layoutSubtreeIfNeeded];
|
[contentView layoutSubtreeIfNeeded];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)showGroupInOutline:(id)sender {
|
||||||
|
NSArray<KPKEntry *> *targetEntries = self.entryViewController.currentTargetEntries;
|
||||||
|
if(targetEntries.count != 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
[self.outlineViewController selectGroup:targetEntries.lastObject.parent];
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark -
|
#pragma mark -
|
||||||
#pragma mark Actions forwarded to MPEntryViewController
|
#pragma mark Actions forwarded to MPEntryViewController
|
||||||
- (void)copyUsername:(id)sender {
|
- (void)copyUsername:(id)sender {
|
||||||
@@ -652,4 +662,97 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
|
|||||||
return (nil != inspectorView.superview);
|
return (nil != inspectorView.superview);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSTouchBar *)makeTouchBar {
|
||||||
|
NSTouchBar *touchBar = [[NSTouchBar alloc] init];
|
||||||
|
touchBar.delegate = self;
|
||||||
|
touchBar.customizationIdentifier = MPTouchBarCustomizationIdentifierDocument;
|
||||||
|
NSArray<NSTouchBarItemIdentifier> *defaultItemIdentifiers = @[MPTouchBarItemIdentifierSearch, MPTouchBarItemIdentifierEditPopover, MPTouchBarItemIdentifierCopyUsername, MPTouchBarItemIdentifierCopyPassword, MPTouchBarItemIdentifierPerformAutotype, NSTouchBarItemIdentifierFlexibleSpace, MPTouchBarItemIdentifierLock];
|
||||||
|
touchBar.defaultItemIdentifiers = defaultItemIdentifiers;
|
||||||
|
touchBar.customizationAllowedItemIdentifiers = defaultItemIdentifiers;
|
||||||
|
return touchBar;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier API_AVAILABLE(macos(10.12.2)) {
|
||||||
|
#pragma mark primary touchbar elements
|
||||||
|
if([identifier isEqualToString:MPTouchBarItemIdentifierSearch]) {
|
||||||
|
return [MPTouchBarButtonCreator touchBarButtonWithImage:[NSImage imageNamed:NSImageNameTouchBarSearchTemplate]
|
||||||
|
identifier:MPTouchBarItemIdentifierSearch
|
||||||
|
target:self
|
||||||
|
selector:@selector(focusSearchField)
|
||||||
|
customizationLabel:NSLocalizedString(@"TOUCHBAR_SEARCH","Touchbar button label for searching the database")];
|
||||||
|
}
|
||||||
|
|
||||||
|
if([identifier isEqualToString:MPTouchBarItemIdentifierEditPopover]) {
|
||||||
|
NSTouchBar *secondaryTouchBar = [[NSTouchBar alloc] init];
|
||||||
|
secondaryTouchBar.delegate = self;
|
||||||
|
secondaryTouchBar.defaultItemIdentifiers = @[MPTouchBarItemIdentifierNewEntry, MPTouchBarItemIdentifierNewGroup, MPTouchBarItemIdentifierDelete];
|
||||||
|
return [MPTouchBarButtonCreator popoverTouchBarButton:NSLocalizedString(@"TOUCHBAR_EDIT","Touchbar button label for opening the popover to edit")
|
||||||
|
identifier:MPTouchBarItemIdentifierEditPopover
|
||||||
|
popoverTouchBar:secondaryTouchBar
|
||||||
|
customizationLabel:NSLocalizedString(@"TOUCHBAR_EDIT","Touchbar button label for opening the popover to edit")];
|
||||||
|
}
|
||||||
|
|
||||||
|
if([identifier isEqualToString:MPTouchBarItemIdentifierCopyUsername]) {
|
||||||
|
return [MPTouchBarButtonCreator touchBarButtonWithTitle:NSLocalizedString(@"TOUCHBAR_COPY_USERNAME","Touchbar button label for copying the username")
|
||||||
|
identifier:MPTouchBarItemIdentifierCopyUsername
|
||||||
|
target:self
|
||||||
|
selector:@selector(copyUsername:)
|
||||||
|
customizationLabel:NSLocalizedString(@"TOUCHBAR_COPY_USERNAME","Touchbar button label for copying the username")];
|
||||||
|
}
|
||||||
|
|
||||||
|
if([identifier isEqualToString:MPTouchBarItemIdentifierCopyPassword]) {
|
||||||
|
return [MPTouchBarButtonCreator touchBarButtonWithTitle:NSLocalizedString(@"TOUCHBAR_COPY_PASSWORD","Touchbar button label for copying the password")
|
||||||
|
identifier:MPTouchBarItemIdentifierCopyPassword
|
||||||
|
target:self
|
||||||
|
selector:@selector(copyPassword:)
|
||||||
|
customizationLabel:NSLocalizedString(@"TOUCHBAR_COPY_PASSWORD","Touchbar button label for copying the password")];
|
||||||
|
}
|
||||||
|
|
||||||
|
if([identifier isEqualToString:MPTouchBarItemIdentifierPerformAutotype]) {
|
||||||
|
return [MPTouchBarButtonCreator touchBarButtonWithTitle:NSLocalizedString(@"TOUCHBAR_PERFORM_AUTOTYPE","Touchbar button label for performing autotype")
|
||||||
|
identifier:MPTouchBarItemIdentifierPerformAutotype
|
||||||
|
target:self
|
||||||
|
selector:@selector(performAutotypeForEntry:)
|
||||||
|
customizationLabel:NSLocalizedString(@"TOUCHBAR_PERFORM_AUTOTYPE","Touchbar button label for performing autotype")];
|
||||||
|
}
|
||||||
|
if([identifier isEqualToString:MPTouchBarItemIdentifierLock]) {
|
||||||
|
return [MPTouchBarButtonCreator touchBarButtonWithImage:[NSImage imageNamed:NSImageNameLockLockedTemplate]
|
||||||
|
identifier:MPTouchBarItemIdentifierLock
|
||||||
|
target:self
|
||||||
|
selector:@selector(lock:)
|
||||||
|
customizationLabel:NSLocalizedString(@"TOUCHBAR_LOCK_DATABASE","Touchbar button label for locking the database")];
|
||||||
|
}
|
||||||
|
#pragma mark secondary/popover touchbar elements
|
||||||
|
if([identifier isEqualToString:MPTouchBarItemIdentifierNewEntry]) {
|
||||||
|
return [MPTouchBarButtonCreator touchBarButtonWithTitleAndImage:NSLocalizedString(@"TOUCHBAR_NEW_ENTRY","Touchbar button label for creating a new item")
|
||||||
|
identifier:MPTouchBarItemIdentifierNewEntry
|
||||||
|
image:[MPIconHelper icon:MPIconAddEntry]
|
||||||
|
target:self
|
||||||
|
selector:@selector(createEntry:)
|
||||||
|
customizationLabel:NSLocalizedString(@"TOUCHBAR_NEW_ENTRY","Touchbar button label for creating a new item")];
|
||||||
|
}
|
||||||
|
if([identifier isEqualToString:MPTouchBarItemIdentifierNewGroup]) {
|
||||||
|
return [MPTouchBarButtonCreator touchBarButtonWithTitleAndImage:NSLocalizedString(@"TOUCHBAR_NEW_GROUP","Touchbar button label for creating a new group")
|
||||||
|
identifier:MPTouchBarItemIdentifierNewGroup
|
||||||
|
image:[MPIconHelper icon:MPIconAddFolder]
|
||||||
|
target:self
|
||||||
|
selector:@selector(createGroup:)
|
||||||
|
customizationLabel:NSLocalizedString(@"TOUCHBAR_NEW_GROUP","Touchbar button label for creating a new group")];
|
||||||
|
}
|
||||||
|
if([identifier isEqualToString:MPTouchBarItemIdentifierDelete]) {
|
||||||
|
return [MPTouchBarButtonCreator touchBarButtonWithTitleAndImageAndColor:NSLocalizedString(@"TOUCHBAR_DELETE","Touchbar button label for deleting elements")
|
||||||
|
identifier:MPTouchBarItemIdentifierDelete
|
||||||
|
image:[MPIconHelper icon:MPIconTrash]
|
||||||
|
color:NSColor.systemRedColor
|
||||||
|
target:self
|
||||||
|
selector:@selector(delete:)
|
||||||
|
customizationLabel:NSLocalizedString(@"TOUCHBAR_DELETE","Touchbar button label for deleting elements")];
|
||||||
|
}
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)focusSearchField {
|
||||||
|
[self.window makeFirstResponder:self.searchField];
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Delegate is used for context menus that are show in the entries table
|
Delegate is used for context menus that are show in the entries table as well as the items menu in the main menu
|
||||||
*/
|
*/
|
||||||
@interface MPEntryContextMenuDelegate : NSObject <NSMenuDelegate>
|
@interface MPEntryContextMenuDelegate : NSObject <NSMenuDelegate>
|
||||||
|
|
||||||
|
|||||||
@@ -602,7 +602,7 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
|
|||||||
- (void)_setupEntryMenu {
|
- (void)_setupEntryMenu {
|
||||||
|
|
||||||
NSMenu *menu = [[NSMenu alloc] init];
|
NSMenu *menu = [[NSMenu alloc] init];
|
||||||
NSArray *items = [MPContextMenuHelper contextMenuItemsWithItems:MPContextMenuFull];
|
NSArray *items = [MPContextMenuHelper contextMenuItemsWithItems:MPContextMenuFull|MPContextMenuShowGroupInOutline];
|
||||||
for(NSMenuItem *item in items) {
|
for(NSMenuItem *item in items) {
|
||||||
[menu addItem:item];
|
[menu addItem:item];
|
||||||
}
|
}
|
||||||
@@ -749,14 +749,14 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)_columnDoubleClick:(id)sender {
|
- (void)_columnDoubleClick:(id)sender {
|
||||||
if(0 == [[self.entryArrayController arrangedObjects] count]) {
|
if(0 == [self.entryArrayController.arrangedObjects count]) {
|
||||||
return; // No data available
|
return; // No data available
|
||||||
}
|
}
|
||||||
NSInteger columnIndex = [self.entryTable clickedColumn];
|
NSInteger columnIndex = self.entryTable.clickedColumn;
|
||||||
if(columnIndex < 0 || columnIndex >= self.entryTable.tableColumns.count) {
|
if(columnIndex < 0 || columnIndex >= self.entryTable.tableColumns.count) {
|
||||||
return; // No Column to use
|
return; // No Column to use
|
||||||
}
|
}
|
||||||
NSTableColumn *column = self.entryTable.tableColumns[self.entryTable.clickedColumn];
|
NSTableColumn *column = self.entryTable.tableColumns[columnIndex];
|
||||||
NSString *identifier = column.identifier;
|
NSString *identifier = column.identifier;
|
||||||
if([identifier isEqualToString:MPEntryTableTitleColumnIdentifier]) {
|
if([identifier isEqualToString:MPEntryTableTitleColumnIdentifier]) {
|
||||||
[self _executeTitleColumnDoubleClick];
|
[self _executeTitleColumnDoubleClick];
|
||||||
@@ -770,9 +770,17 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
|
|||||||
else if([identifier isEqualToString:MPEntryTableURLColumnIdentifier]) {
|
else if([identifier isEqualToString:MPEntryTableURLColumnIdentifier]) {
|
||||||
[self _executeURLColumnDoubleClick];
|
[self _executeURLColumnDoubleClick];
|
||||||
}
|
}
|
||||||
|
else if([identifier isEqualToString:MPEntryTableParentColumnIdentifier]) {
|
||||||
|
[self _executeGroupColumnDoubleClick];
|
||||||
|
}
|
||||||
// TODO: Add more actions for new columns
|
// TODO: Add more actions for new columns
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)_executeGroupColumnDoubleClick {
|
||||||
|
id target = [NSApp targetForAction:@selector(showGroupInOutline:)];
|
||||||
|
[target showGroupInOutline:self];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)_executeTitleColumnDoubleClick {
|
- (void)_executeTitleColumnDoubleClick {
|
||||||
MPDoubleClickTitleAction action = [NSUserDefaults.standardUserDefaults integerForKey:kMPSettingsKeyDoubleClickTitleAction];
|
MPDoubleClickTitleAction action = [NSUserDefaults.standardUserDefaults integerForKey:kMPSettingsKeyDoubleClickTitleAction];
|
||||||
switch(action) {
|
switch(action) {
|
||||||
@@ -800,4 +808,5 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
#import "MPViewController.h"
|
#import "MPViewController.h"
|
||||||
#import "MPPreferencesTab.h"
|
#import "MPPreferencesTab.h"
|
||||||
|
|
||||||
@interface MPGeneralSettingsController : MPViewController <MPPreferencesTab>
|
@interface MPGeneralPreferencesController : MPViewController <MPPreferencesTab>
|
||||||
|
|
||||||
@property (strong) IBOutlet NSButton *clearPasteboardOnQuitCheckButton;
|
@property (strong) IBOutlet NSButton *clearPasteboardOnQuitCheckButton;
|
||||||
@property (strong) IBOutlet NSPopUpButton *clearPasteboardTimeoutPopup;
|
@property (strong) IBOutlet NSPopUpButton *clearPasteboardTimeoutPopup;
|
||||||
@@ -20,20 +20,18 @@
|
|||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
|
|
||||||
#import "MPGeneralSettingsController.h"
|
#import "MPGeneralPreferencesController.h"
|
||||||
#import "MPSettingsHelper.h"
|
#import "MPSettingsHelper.h"
|
||||||
#import "MPIconHelper.h"
|
#import "MPIconHelper.h"
|
||||||
|
|
||||||
NSString *const MPGeneralSetingsIdentifier = @"GeneralSettingsTab";
|
@implementation MPGeneralPreferencesController
|
||||||
|
|
||||||
@implementation MPGeneralSettingsController
|
|
||||||
|
|
||||||
- (NSString *)nibName {
|
- (NSString *)nibName {
|
||||||
return @"GeneralSettings";
|
return @"GeneralPreferences";
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSString *)identifier {
|
- (NSString *)identifier {
|
||||||
return MPGeneralSetingsIdentifier;
|
return @"GeneralPreferences";
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSImage *)image {
|
- (NSImage *)image {
|
||||||
@@ -41,7 +39,7 @@ NSString *const MPGeneralSetingsIdentifier = @"GeneralSettingsTab";
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (NSString *)label {
|
- (NSString *)label {
|
||||||
return NSLocalizedString(@"GENERAL_SETTINGS", @"General Settings Label");
|
return NSLocalizedString(@"GENERAL_PREFERENCES", @"General Settings Label");
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)viewDidLoad {
|
- (void)viewDidLoad {
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
@class DDHotKeyTextField;
|
@class DDHotKeyTextField;
|
||||||
|
|
||||||
@interface MPIntegrationSettingsController : MPViewController <MPPreferencesTab, NSTextFieldDelegate>
|
@interface MPIntegrationPreferencesController : MPViewController <MPPreferencesTab, NSTextFieldDelegate>
|
||||||
/* Autotype */
|
/* Autotype */
|
||||||
@property (strong) IBOutlet NSButton *enableGlobalAutotypeCheckBox;
|
@property (strong) IBOutlet NSButton *enableGlobalAutotypeCheckBox;
|
||||||
@property (strong) IBOutlet DDHotKeyTextField *hotKeyTextField;
|
@property (strong) IBOutlet DDHotKeyTextField *hotKeyTextField;
|
||||||
@@ -44,6 +44,6 @@
|
|||||||
/* Preview */
|
/* Preview */
|
||||||
@property (strong) IBOutlet NSButton *enableQuicklookCheckBox;
|
@property (strong) IBOutlet NSButton *enableQuicklookCheckBox;
|
||||||
|
|
||||||
- (IBAction)openAccessibiltyPreferences:(id)sender;
|
- (IBAction)runAutotypeDoctor:(id)sender;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
@@ -20,25 +20,25 @@
|
|||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
|
|
||||||
#import "MPIntegrationSettingsController.h"
|
#import "MPIntegrationPreferencesController.h"
|
||||||
#import "MPSettingsHelper.h"
|
#import "MPSettingsHelper.h"
|
||||||
#import "MPIconHelper.h"
|
#import "MPIconHelper.h"
|
||||||
#import "MPAutotypeDaemon.h"
|
#import "MPAutotypeDoctor.h"
|
||||||
|
|
||||||
#import "DDHotKeyCenter.h"
|
#import "DDHotKeyCenter.h"
|
||||||
#import "DDHotKey+MacPassAdditions.h"
|
#import "DDHotKey+MacPassAdditions.h"
|
||||||
#import "DDHotKeyTextField.h"
|
#import "DDHotKeyTextField.h"
|
||||||
|
|
||||||
@interface MPIntegrationSettingsController ()
|
@interface MPIntegrationPreferencesController ()
|
||||||
|
|
||||||
@property (nonatomic, strong) DDHotKey *hotKey;
|
@property (nonatomic, strong) DDHotKey *hotKey;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation MPIntegrationSettingsController
|
@implementation MPIntegrationPreferencesController
|
||||||
|
|
||||||
- (NSString *)nibName {
|
- (NSString *)nibName {
|
||||||
return @"IntegrationSettings";
|
return @"IntegrationPreferences";
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSString *)identifier {
|
- (NSString *)identifier {
|
||||||
@@ -105,7 +105,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)_updateAccessabilityWarning {
|
- (void)_updateAccessabilityWarning {
|
||||||
BOOL hasAutotypeSupport = MPAutotypeDaemon.defaultDaemon.autotypeSupported;
|
|
||||||
|
BOOL hasAutotypeSupport = MPAutotypeDoctor.defaultDoctor.hasNecessaryAutotypePermissions;
|
||||||
|
|
||||||
if(hasAutotypeSupport) {
|
if(hasAutotypeSupport) {
|
||||||
[self.autotypeStackView setVisibilityPriority:NSStackViewVisibilityPriorityNotVisible forView:self.autotypeWarningTextField];
|
[self.autotypeStackView setVisibilityPriority:NSStackViewVisibilityPriorityNotVisible forView:self.autotypeWarningTextField];
|
||||||
@@ -117,7 +118,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)openAccessibiltyPreferences:(id)sender {
|
- (void)runAutotypeDoctor:(id)sender {
|
||||||
[MPAutotypeDaemon.defaultDaemon openAccessibiltyPreferences];
|
[MPAutotypeDoctor.defaultDoctor runChecksAndPresentResults];
|
||||||
}
|
}
|
||||||
@end
|
@end
|
||||||
@@ -57,7 +57,7 @@ NSString *const _MPOutlineMenuTemplate = @"Template";
|
|||||||
|
|
||||||
if( [item isKindOfClass:KPKGroup.class]) {
|
if( [item isKindOfClass:KPKGroup.class]) {
|
||||||
KPKGroup *group = (KPKGroup *)item;
|
KPKGroup *group = (KPKGroup *)item;
|
||||||
MPDocument *document = [NSDocumentController sharedDocumentController].currentDocument;
|
MPDocument *document = NSDocumentController.sharedDocumentController.currentDocument;
|
||||||
if(group && document.root == group ) {
|
if(group && document.root == group ) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,12 +26,14 @@
|
|||||||
APPKIT_EXTERN NSString *const MPOutlineViewDidChangeGroupSelection;
|
APPKIT_EXTERN NSString *const MPOutlineViewDidChangeGroupSelection;
|
||||||
|
|
||||||
@class MPDocument;
|
@class MPDocument;
|
||||||
|
@class KPKGroup;
|
||||||
|
|
||||||
@interface MPOutlineViewController : MPViewController <MPTargetNodeResolving, NSOutlineViewDelegate, NSMenuDelegate>
|
@interface MPOutlineViewController : MPViewController <MPTargetNodeResolving, NSOutlineViewDelegate, NSMenuDelegate>
|
||||||
|
|
||||||
- (void)clearSelection;
|
- (void)clearSelection;
|
||||||
- (void)showOutline;
|
- (void)showOutline;
|
||||||
- (void)registerNotificationsForDocument:(MPDocument *)document;
|
- (void)registerNotificationsForDocument:(MPDocument *)document;
|
||||||
|
- (void)selectGroup:(KPKGroup *)group;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves the current item for the current mouse location
|
* Retrieves the current item for the current mouse location
|
||||||
|
|||||||
@@ -143,6 +143,23 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)selectGroup:(KPKGroup *)group {
|
||||||
|
NSMutableArray *parents = [[NSMutableArray alloc] init];
|
||||||
|
NSUUID *groupUUID = group.uuid;
|
||||||
|
while(group.parent) {
|
||||||
|
[parents insertObject:group.parent atIndex:0];
|
||||||
|
group = group.parent;
|
||||||
|
}
|
||||||
|
NSTreeNode *node = [self.outlineView itemAtRow:0];
|
||||||
|
for(KPKGroup *group in parents) {
|
||||||
|
NSUInteger row = [self _rowForUUID:group.uuid node:node];
|
||||||
|
[self.outlineView expandItem:[self.outlineView itemAtRow:row]];
|
||||||
|
}
|
||||||
|
NSUInteger rowToSelect = [self _rowForUUID:groupUUID node:node];
|
||||||
|
[self.outlineView selectRowIndexes:[NSIndexSet indexSetWithIndex:rowToSelect] byExtendingSelection:NO];
|
||||||
|
[self.outlineView scrollRowToVisible:rowToSelect];
|
||||||
|
}
|
||||||
|
|
||||||
- (void)_expandItems:(NSTreeNode *)node {
|
- (void)_expandItems:(NSTreeNode *)node {
|
||||||
id nodeItem = node.representedObject;
|
id nodeItem = node.representedObject;
|
||||||
if([nodeItem isKindOfClass:KPKTree.class]) {
|
if([nodeItem isKindOfClass:KPKTree.class]) {
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
@class KPKCompositeKey;
|
@class KPKCompositeKey;
|
||||||
|
|
||||||
@interface MPPasswordInputController : MPViewController
|
@interface MPPasswordInputController : MPViewController <NSTouchBarDelegate>
|
||||||
|
|
||||||
typedef BOOL (^passwordInputCompletionBlock)(NSString *password, NSURL *keyURL, BOOL didCancel, NSError *__autoreleasing*error);
|
typedef BOOL (^passwordInputCompletionBlock)(NSString *password, NSURL *keyURL, BOOL didCancel, NSError *__autoreleasing*error);
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@
|
|||||||
#import "MPDocument.h"
|
#import "MPDocument.h"
|
||||||
#import "MPSettingsHelper.h"
|
#import "MPSettingsHelper.h"
|
||||||
#import "MPPathControl.h"
|
#import "MPPathControl.h"
|
||||||
|
#import "MPTouchBarButtonCreator.h"
|
||||||
|
|
||||||
#import "HNHUi/HNHUi.h"
|
#import "HNHUi/HNHUi.h"
|
||||||
|
|
||||||
@@ -33,6 +34,7 @@
|
|||||||
|
|
||||||
@interface MPPasswordInputController ()
|
@interface MPPasswordInputController ()
|
||||||
|
|
||||||
|
@property (strong) NSButton *showPasswordButton;
|
||||||
@property (weak) IBOutlet HNHUISecureTextField *passwordTextField;
|
@property (weak) IBOutlet HNHUISecureTextField *passwordTextField;
|
||||||
@property (weak) IBOutlet MPPathControl *keyPathControl;
|
@property (weak) IBOutlet MPPathControl *keyPathControl;
|
||||||
@property (weak) IBOutlet NSImageView *messageImageView;
|
@property (weak) IBOutlet NSImageView *messageImageView;
|
||||||
@@ -177,4 +179,36 @@
|
|||||||
self.messageInfoTextField.hidden = NO;
|
self.messageInfoTextField.hidden = NO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (NSTouchBar *)makeTouchBar {
|
||||||
|
NSTouchBar *touchBar = [[NSTouchBar alloc] init];
|
||||||
|
touchBar.delegate = self;
|
||||||
|
touchBar.customizationIdentifier = MPTouchBarCustomizationIdentifierPasswordInput;
|
||||||
|
NSArray<NSTouchBarItemIdentifier> *defaultItemIdentifiers = @[MPTouchBarItemIdentifierShowPassword, MPTouchBarItemIdentifierChooseKeyfile, NSTouchBarItemIdentifierFlexibleSpace,MPTouchBarItemIdentifierUnlock];
|
||||||
|
touchBar.defaultItemIdentifiers = defaultItemIdentifiers;
|
||||||
|
touchBar.customizationAllowedItemIdentifiers = defaultItemIdentifiers;
|
||||||
|
return touchBar;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier API_AVAILABLE(macos(10.12.2)) {
|
||||||
|
if (identifier == MPTouchBarItemIdentifierChooseKeyfile) {
|
||||||
|
return [MPTouchBarButtonCreator touchBarButtonWithTitleAndImage:NSLocalizedString(@"TOUCHBAR_CHOOSE_KEYFILE","Touchbar button label for choosing the keyfile") identifier:MPTouchBarItemIdentifierChooseKeyfile image:[NSImage imageNamed:NSImageNameTouchBarFolderTemplate] target:self.keyPathControl selector:@selector(showOpenPanel:) customizationLabel:NSLocalizedString(@"TOUCHBAR_CHOOSE_KEYFILE","Touchbar button label for choosing the keyfile")];
|
||||||
|
} else if (identifier == MPTouchBarItemIdentifierShowPassword) {
|
||||||
|
NSTouchBarItem *item = [MPTouchBarButtonCreator touchBarButtonWithTitleAndImage:NSLocalizedString(@"TOUCHBAR_SHOW_PASSWORD","Touchbar button label for showing the password") identifier:MPTouchBarItemIdentifierShowPassword image:[NSImage imageNamed:NSImageNameTouchBarQuickLookTemplate] target:self selector:@selector(toggleShowPassword) customizationLabel:NSLocalizedString(@"TOUCHBAR_SHOW_PASSWORD","Touchbar button label for showing the password")];
|
||||||
|
_showPasswordButton = (NSButton *) item.view;
|
||||||
|
return item;
|
||||||
|
} else if (identifier == MPTouchBarItemIdentifierUnlock) {
|
||||||
|
return [MPTouchBarButtonCreator touchBarButtonWithImage:[NSImage imageNamed:NSImageNameLockUnlockedTemplate] identifier:MPTouchBarItemIdentifierUnlock target:self selector:@selector(_submit:) customizationLabel:NSLocalizedString(@"TOUCHBAR_UNLOCK_DATABASE","Touchbar button label for unlocking the database")];
|
||||||
|
} else {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)toggleShowPassword {
|
||||||
|
self.showPassword = !self.showPassword;
|
||||||
|
if (@available(macOS 10.12.2, *)) {
|
||||||
|
_showPasswordButton.bezelColor = self.showPassword ? [NSColor selectedControlColor] : [NSColor controlColor];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -58,6 +58,18 @@ FOUNDATION_EXPORT NSString *const MPPasteBoardControllerDidClearClipboard;
|
|||||||
- (void)copyObjects:(NSArray<id<NSPasteboardWriting>> *)objects;
|
- (void)copyObjects:(NSArray<id<NSPasteboardWriting>> *)objects;
|
||||||
- (void)copyObjectsWithoutTimeout:(NSArray<id<NSPasteboardWriting>> *)objects;
|
- (void)copyObjectsWithoutTimeout:(NSArray<id<NSPasteboardWriting>> *)objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
The pastboard controller will copy the object to the clipboard, display an appropriate overlay image
|
||||||
|
and text and will set the clear time out if any is set. Additinally it will hide the application if
|
||||||
|
the user has set this option. This call should always be used when a user is directly copying anything
|
||||||
|
to the clipboard. If the clipboard is used internally (e.g. for autotype) you should call copyObjects:
|
||||||
|
or even copyObjectsWithoutTimeout:
|
||||||
|
|
||||||
|
@param objects object so be copied
|
||||||
|
@param overlayInfoType infotype discribing what is copied
|
||||||
|
@param name a custom name
|
||||||
|
@param view the view that initiated the copy action
|
||||||
|
*/
|
||||||
- (void)copyObjects:(NSArray<id<NSPasteboardWriting>> *)objects overlayInfo:(MPPasteboardOverlayInfoType)overlayInfoType name:(NSString *)name atView:(NSView *)view;
|
- (void)copyObjects:(NSArray<id<NSPasteboardWriting>> *)objects overlayInfo:(MPPasteboardOverlayInfoType)overlayInfoType name:(NSString *)name atView:(NSView *)view;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -151,6 +151,13 @@ NSString *const MPPasteBoardControllerDidClearClipboard = @"com.hicknhack.macpas
|
|||||||
|
|
||||||
}
|
}
|
||||||
[MPOverlayWindowController.sharedController displayOverlayImage:infoImage label:infoText atView:view];
|
[MPOverlayWindowController.sharedController displayOverlayImage:infoImage label:infoText atView:view];
|
||||||
|
|
||||||
|
BOOL hide = [NSUserDefaults.standardUserDefaults boolForKey:kMPSettingsKeyHideAfterCopyToClipboard];
|
||||||
|
if(hide) {
|
||||||
|
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(400 * NSEC_PER_MSEC)), dispatch_get_main_queue(), ^{
|
||||||
|
[NSApplication.sharedApplication hide:nil];
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)_clearPasteboardContents {
|
- (void)_clearPasteboardContents {
|
||||||
|
|||||||
@@ -10,14 +10,17 @@
|
|||||||
|
|
||||||
@implementation MPPathControl
|
@implementation MPPathControl
|
||||||
|
|
||||||
/*- (BOOL)canBecomeKeyView {
|
- (BOOL)canBecomeKeyView {
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)acceptsFirstResponder {
|
- (BOOL)acceptsFirstResponder {
|
||||||
return YES;
|
/*
|
||||||
|
documentation state YES is required when canBecomeKeyView is YES but setting to YES
|
||||||
|
causes NSWindow to use this as first responder when closing the password generator popover
|
||||||
|
*/
|
||||||
|
return NO;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
- (instancetype)initWithFrame:(NSRect)frameRect {
|
- (instancetype)initWithFrame:(NSRect)frameRect {
|
||||||
self = [super initWithFrame:frameRect];
|
self = [super initWithFrame:frameRect];
|
||||||
@@ -44,11 +47,10 @@
|
|||||||
if([self.delegate respondsToSelector:@selector(pathControl:willDisplayOpenPanel:)]) {
|
if([self.delegate respondsToSelector:@selector(pathControl:willDisplayOpenPanel:)]) {
|
||||||
[self.delegate pathControl:self willDisplayOpenPanel:panel];
|
[self.delegate pathControl:self willDisplayOpenPanel:panel];
|
||||||
}
|
}
|
||||||
[panel beginWithCompletionHandler:^(NSModalResponse result) {
|
NSModalResponse result = [panel runModal];
|
||||||
if(result == NSModalResponseOK) {
|
if(result == NSModalResponseOK) {
|
||||||
self.URL = panel.URLs.firstObject;
|
self.URL = panel.URLs.firstObject;
|
||||||
}
|
}
|
||||||
}];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)pathControl:(NSPathControl *)pathControl willPopUpMenu:(NSMenu *)menu {
|
- (void)pathControl:(NSPathControl *)pathControl willPopUpMenu:(NSMenu *)menu {
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
@class KPKTree;
|
@class KPKTree;
|
||||||
|
|
||||||
FOUNDATION_EXPORT NSString *const MPPluginUnkownVersion;
|
FOUNDATION_EXPORT NSString *const MPPluginUnkownVersion;
|
||||||
|
FOUNDATION_EXPORT NSString *const MPPluginDescriptionInfoDictionaryKey;
|
||||||
|
|
||||||
@interface MPPlugin : NSObject
|
@interface MPPlugin : NSObject
|
||||||
|
|
||||||
@@ -37,8 +38,10 @@ FOUNDATION_EXPORT NSString *const MPPluginUnkownVersion;
|
|||||||
@property (copy, readonly) NSString *name;
|
@property (copy, readonly) NSString *name;
|
||||||
@property (nonatomic, copy, readonly, nullable) NSString *shortVersionString;
|
@property (nonatomic, copy, readonly, nullable) NSString *shortVersionString;
|
||||||
@property (nonatomic, copy, readonly) NSString *versionString;
|
@property (nonatomic, copy, readonly) NSString *versionString;
|
||||||
|
@property (nonatomic, copy, readonly) NSString *localizedDescription;
|
||||||
@property (nonatomic, strong, readonly) NSBundle *bundle;
|
@property (nonatomic, strong, readonly) NSBundle *bundle;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
If your plugin needs initalization override this method but you have to call [super initWithPluginHost:]
|
If your plugin needs initalization override this method but you have to call [super initWithPluginHost:]
|
||||||
Otherwise your plugin might not get registered correctly
|
Otherwise your plugin might not get registered correctly
|
||||||
@@ -53,6 +56,13 @@ FOUNDATION_EXPORT NSString *const MPPluginUnkownVersion;
|
|||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
#pragma mark Supported Plugin Protocolls
|
||||||
|
|
||||||
|
/*
|
||||||
|
Adopting this protocolls allows for custom settings in the Plugin settings pane.
|
||||||
|
MacPass will load your view controller and place it inside the settings window
|
||||||
|
when a user has selected your plugin in the list
|
||||||
|
*/
|
||||||
@protocol MPPluginSettings <NSObject>
|
@protocol MPPluginSettings <NSObject>
|
||||||
|
|
||||||
@required
|
@required
|
||||||
@@ -60,6 +70,20 @@ FOUNDATION_EXPORT NSString *const MPPluginUnkownVersion;
|
|||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
/*
|
||||||
|
Adopt this protocoll if you plugin can extract window title information for a set of applications
|
||||||
|
This way, MacPass might yield better results for autotype. Beware that his might break interoparbility
|
||||||
|
*/
|
||||||
|
@protocol MPAutotypeWindowTitleResolverPlugin <NSObject>
|
||||||
|
@required
|
||||||
|
|
||||||
|
- (BOOL)acceptsRunningApplication:(NSRunningApplication *)runningApplication;
|
||||||
|
- (NSString *)windowTitleForRunningApplication:(NSRunningApplication *)runningApplication;
|
||||||
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
#pragma mark Proposed Plugin Protocolls
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Adopt this protocoll if your plugin supports actions on entries.
|
Adopt this protocoll if your plugin supports actions on entries.
|
||||||
Actions will get listed in various places in menues.
|
Actions will get listed in various places in menues.
|
||||||
@@ -111,13 +135,18 @@ FOUNDATION_EXPORT NSString *const MPPluginUnkownVersion;
|
|||||||
This will get called when the open panel is closed by the user.
|
This will get called when the open panel is closed by the user.
|
||||||
You should retrieve any results from the panel and act accordingly.
|
You should retrieve any results from the panel and act accordingly.
|
||||||
|
|
||||||
|
If you need custom UI in the process, you can show them here.
|
||||||
|
For example, if a CVS import might need user input on how to handle the parsed files this is the place to show it.
|
||||||
|
|
||||||
@param panel The open panel used for selecting what file(s) to import
|
@param panel The open panel used for selecting what file(s) to import
|
||||||
@param response The response for of the user for running the panel
|
@param response The response for of the user for running the panel
|
||||||
@return The tree constructed from the selected input file(s)
|
@return The KPKTree constructed from the selected input file(s)
|
||||||
*/
|
*/
|
||||||
- (KPKTree *)treeForRunningOpenPanel:(NSOpenPanel *)panel withResponse:(NSModalResponse)response;
|
- (KPKTree *)treeForRunningOpenPanel:(NSOpenPanel *)panel withResponse:(NSModalResponse)response;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
#pragma mark Deprecated
|
||||||
|
|
||||||
@interface MPPlugin (Deprecated)
|
@interface MPPlugin (Deprecated)
|
||||||
|
|
||||||
- (instancetype)initWithPluginManager:(id)manager;
|
- (instancetype)initWithPluginManager:(id)manager;
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
#import "MPPluginVersionComparator.h"
|
#import "MPPluginVersionComparator.h"
|
||||||
|
|
||||||
NSString *const MPPluginUnkownVersion = @"unkown.plugin.version";
|
NSString *const MPPluginUnkownVersion = @"unkown.plugin.version";
|
||||||
|
NSString *const MPPluginDescriptionInfoDictionaryKey = @"MPPluginDescription";
|
||||||
|
|
||||||
@implementation MPPlugin
|
@implementation MPPlugin
|
||||||
|
|
||||||
@@ -90,6 +91,16 @@ NSString *const MPPluginUnkownVersion = @"unkown.plugin.version";
|
|||||||
return MPPluginUnkownVersion;
|
return MPPluginUnkownVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSString *)localizedDescription {
|
||||||
|
if([self.bundle.localizedInfoDictionary objectForKey:MPPluginDescriptionInfoDictionaryKey]) {
|
||||||
|
return self.bundle.localizedInfoDictionary[MPPluginDescriptionInfoDictionaryKey];
|
||||||
|
}
|
||||||
|
if([self.bundle.infoDictionary objectForKey:MPPluginDescriptionInfoDictionaryKey]) {
|
||||||
|
return self.bundle.infoDictionary[MPPluginDescriptionInfoDictionaryKey];
|
||||||
|
}
|
||||||
|
return @"";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
- (void)didLoadPlugin {
|
- (void)didLoadPlugin {
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ FOUNDATION_EXPORT NSString *const MPPluginHostPluginBundleIdentifiyerKey;
|
|||||||
@class MPPlugin;
|
@class MPPlugin;
|
||||||
@class KPKEntry;
|
@class KPKEntry;
|
||||||
@protocol MPImportPlugin;
|
@protocol MPImportPlugin;
|
||||||
|
@protocol MPAutotypeWindowTitleResolverPlugin;
|
||||||
|
|
||||||
@interface MPPluginHost : NSObject
|
@interface MPPluginHost : NSObject
|
||||||
|
|
||||||
@@ -57,3 +58,9 @@ FOUNDATION_EXPORT NSString *const MPPluginHostPluginBundleIdentifiyerKey;
|
|||||||
@property (readonly, copy) NSArray <MPPlugin<MPImportPlugin> __kindof*> *importPlugins;
|
@property (readonly, copy) NSArray <MPPlugin<MPImportPlugin> __kindof*> *importPlugins;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@interface MPPluginHost (MPWindowTitleResolverSupport)
|
||||||
|
|
||||||
|
- (NSArray<MPPlugin<MPAutotypeWindowTitleResolverPlugin> __kindof*> *)windowTitleResolverForRunningApplication:(NSRunningApplication *)runningApplication;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|||||||
@@ -282,7 +282,7 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(incompatiblePlugins.count > 0) {
|
if(incompatiblePlugins.count > 0) {
|
||||||
BOOL hideAlert = NO;
|
BOOL hideAlert = NSApplication.sharedApplication.isRunningTests ? YES : NO;
|
||||||
if(nil != [NSUserDefaults.standardUserDefaults objectForKey:kMPSettingsKeyHideIncopatiblePluginsWarning]) {
|
if(nil != [NSUserDefaults.standardUserDefaults objectForKey:kMPSettingsKeyHideIncopatiblePluginsWarning]) {
|
||||||
hideAlert = [NSUserDefaults.standardUserDefaults boolForKey:kMPSettingsKeyHideIncopatiblePluginsWarning];
|
hideAlert = [NSUserDefaults.standardUserDefaults boolForKey:kMPSettingsKeyHideIncopatiblePluginsWarning];
|
||||||
}
|
}
|
||||||
@@ -447,6 +447,13 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
|
|||||||
[context.plugin performActionForMenuItem:item withEntries:context.entries];
|
[context.plugin performActionForMenuItem:item withEntries:context.entries];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSArray *)_pluginsConformingToProtocoll:(Protocol *)protocol {
|
||||||
|
NSPredicate *filterPredicate = [NSPredicate predicateWithBlock:^BOOL(id _Nullable evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {
|
||||||
|
return ([evaluatedObject conformsToProtocol:protocol]);
|
||||||
|
}];
|
||||||
|
return [self.mutablePlugins filteredArrayUsingPredicate:filterPredicate];
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
NSString *const MPPluginBundleIdentifierKey = @"MPPluginBundleIdentifierKey";
|
NSString *const MPPluginBundleIdentifierKey = @"MPPluginBundleIdentifierKey";
|
||||||
@@ -455,10 +462,23 @@ NSString *const MPImportPluginUTIKey = @"MPImportPluginUTIKey";
|
|||||||
@implementation MPPluginHost (MPImportPluginSupport)
|
@implementation MPPluginHost (MPImportPluginSupport)
|
||||||
|
|
||||||
- (NSArray<MPPlugin *> *)importPlugins {
|
- (NSArray<MPPlugin *> *)importPlugins {
|
||||||
NSPredicate *filterPredicate = [NSPredicate predicateWithBlock:^BOOL(id _Nullable evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {
|
return [self _pluginsConformingToProtocoll:@protocol(MPImportPlugin)];
|
||||||
return ([evaluatedObject conformsToProtocol:@protocol(MPImportPlugin)]);
|
|
||||||
}];
|
|
||||||
return [self.mutablePlugins filteredArrayUsingPredicate:filterPredicate];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@implementation MPPluginHost (MPWindowTitleResolverSupport)
|
||||||
|
|
||||||
|
- (NSArray<MPPlugin *> *)windowTitleResolverForRunningApplication:(NSRunningApplication *)runningApplication {
|
||||||
|
NSArray<MPPlugin<MPAutotypeWindowTitleResolverPlugin> *> *plugins = [self _pluginsConformingToProtocoll:@protocol(MPAutotypeWindowTitleResolverPlugin)];
|
||||||
|
NSMutableArray *resolver = [[NSMutableArray alloc] init];
|
||||||
|
for(MPPlugin<MPAutotypeWindowTitleResolverPlugin> *plugin in plugins) {
|
||||||
|
if([plugin acceptsRunningApplication:runningApplication]) {
|
||||||
|
[resolver addObject:plugin];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return [resolver copy];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@end
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ typedef NS_ENUM(NSUInteger, MPPluginSegmentType) {
|
|||||||
|
|
||||||
@interface MPPluginPreferencesController () <NSTableViewDataSource, NSTableViewDelegate>
|
@interface MPPluginPreferencesController () <NSTableViewDataSource, NSTableViewDelegate>
|
||||||
|
|
||||||
|
@property (strong) IBOutlet NSButton *allowRemoteConnectionCheckButton;
|
||||||
@property (strong) IBOutlet NSTableView *pluginTableView;
|
@property (strong) IBOutlet NSTableView *pluginTableView;
|
||||||
@property (strong) IBOutlet NSView *settingsView;
|
@property (strong) IBOutlet NSView *settingsView;
|
||||||
@property (strong) IBOutlet NSView *fallbackSettingsView;
|
@property (strong) IBOutlet NSView *fallbackSettingsView;
|
||||||
@@ -83,6 +84,10 @@ typedef NS_ENUM(NSUInteger, MPPluginSegmentType) {
|
|||||||
toObject:NSUserDefaultsController.sharedUserDefaultsController
|
toObject:NSUserDefaultsController.sharedUserDefaultsController
|
||||||
withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyLoadIncompatiblePlugins]
|
withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyLoadIncompatiblePlugins]
|
||||||
options:nil];
|
options:nil];
|
||||||
|
[self.allowRemoteConnectionCheckButton bind:NSValueBinding
|
||||||
|
toObject:NSUserDefaultsController.sharedUserDefaultsController
|
||||||
|
withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyAllowRemoteFetchOfPluginRepository]
|
||||||
|
options:nil];
|
||||||
[self.pluginTableView registerForDraggedTypes:@[(NSString *)kUTTypeFileURL]];
|
[self.pluginTableView registerForDraggedTypes:@[(NSString *)kUTTypeFileURL]];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,20 +124,27 @@ typedef NS_ENUM(NSUInteger, MPPluginSegmentType) {
|
|||||||
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:dict]];
|
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:dict]];
|
||||||
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:nil views:dict]];
|
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:nil views:dict]];
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
[self _showInfoMessageForPlugin:plugin.localizedDescription];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(nil != plugin) {
|
else if(nil != plugin) {
|
||||||
|
if(plugin.errorMessage.length > 0) {
|
||||||
|
[self _showInfoMessageForPlugin:plugin.errorMessage];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
[self _showInfoMessageForPlugin:NSLocalizedString(@"PLUGIN_SETTINGS_GENERIC_ERROR_MESSAGE", "Generic message displayed if no details are know why a plugin was not loaded.")];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)_showInfoMessageForPlugin:(NSString *)message {
|
||||||
[self.settingsView addSubview:self.fallbackSettingsView];
|
[self.settingsView addSubview:self.fallbackSettingsView];
|
||||||
NSDictionary *dict = @{ @"view" : self.fallbackSettingsView,
|
NSDictionary *dict = @{ @"view" : self.fallbackSettingsView,
|
||||||
@"table" : self.pluginTableView.enclosingScrollView };
|
@"table" : self.pluginTableView.enclosingScrollView };
|
||||||
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:dict]];
|
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:dict]];
|
||||||
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:nil views:dict]];
|
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:nil views:dict]];
|
||||||
if(plugin.errorMessage.length > 0) {
|
self.fallbackDescriptionTextField.stringValue = message.length > 0 ? message : @"";
|
||||||
self.fallbackDescriptionTextField.stringValue = plugin.errorMessage;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
self.fallbackDescriptionTextField.stringValue = NSLocalizedString(@"PLUGIN_SETTINGS_GENERIC_ERROR_MESSAGE", "Generic message displayed if no details are know why a plugin was not loaded.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (MPPlugin *)pluginForRow:(NSInteger)row {
|
- (MPPlugin *)pluginForRow:(NSInteger)row {
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
#import "MPPluginRepository.h"
|
#import "MPPluginRepository.h"
|
||||||
#import "MPConstants.h"
|
#import "MPConstants.h"
|
||||||
#import "MPPluginRepositoryItem.h"
|
#import "MPPluginRepositoryItem.h"
|
||||||
|
#import "MPSettingsHelper.h"
|
||||||
|
|
||||||
NSString *const MPPluginRepositoryDidUpdateAvailablePluginsNotification = @"com.hicknhack.macpass.MPPluginRepositoryDidInitializeAvailablePluginsNotification";
|
NSString *const MPPluginRepositoryDidUpdateAvailablePluginsNotification = @"com.hicknhack.macpass.MPPluginRepositoryDidInitializeAvailablePluginsNotification";
|
||||||
|
|
||||||
@@ -56,7 +57,7 @@ NSString *const MPPluginRepositoryDidUpdateAvailablePluginsNotification = @"com.
|
|||||||
if(self) {
|
if(self) {
|
||||||
_isInitialized = NO;
|
_isInitialized = NO;
|
||||||
_lastDataFetchTime = NSDate.distantPast.timeIntervalSinceReferenceDate;
|
_lastDataFetchTime = NSDate.distantPast.timeIntervalSinceReferenceDate;
|
||||||
[self fetchRepositoryDataCompletionHandler:^(NSArray<MPPluginRepositoryItem *> * _Nonnull availablePlugins) {
|
[self _fetchAppropriateRepositoryDataCompletionHandler:^(NSArray<MPPluginRepositoryItem *> * _Nonnull availablePlugins) {
|
||||||
self.availablePlugins = availablePlugins;
|
self.availablePlugins = availablePlugins;
|
||||||
self.isInitialized = YES;
|
self.isInitialized = YES;
|
||||||
}];
|
}];
|
||||||
@@ -65,10 +66,12 @@ NSString *const MPPluginRepositoryDidUpdateAvailablePluginsNotification = @"com.
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (NSArray<MPPluginRepositoryItem *> *)availablePlugins {
|
- (NSArray<MPPluginRepositoryItem *> *)availablePlugins {
|
||||||
/* update cache on every read if it's older than 5 minutes */
|
/* FIXME: Invalidate fetch when settings have changed!
|
||||||
|
update cache on every read if it's older than 5 minutes
|
||||||
|
*/
|
||||||
if((NSDate.timeIntervalSinceReferenceDate - self.lastDataFetchTime) > 60*5 ) {
|
if((NSDate.timeIntervalSinceReferenceDate - self.lastDataFetchTime) > 60*5 ) {
|
||||||
NSLog(@"%@: updating available plugins cache.", self.className);
|
NSLog(@"%@: updating available plugins cache.", self.className);
|
||||||
[self fetchRepositoryDataCompletionHandler:^(NSArray<MPPluginRepositoryItem *> * _Nonnull availablePlugins) {
|
[self _fetchAppropriateRepositoryDataCompletionHandler:^(NSArray<MPPluginRepositoryItem *> * _Nonnull availablePlugins) {
|
||||||
self.availablePlugins = availablePlugins;
|
self.availablePlugins = availablePlugins;
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
@@ -87,42 +90,70 @@ NSString *const MPPluginRepositoryDidUpdateAvailablePluginsNotification = @"com.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)fetchRepositoryDataCompletionHandler:(void (^)(NSArray<MPPluginRepositoryItem *> * _Nonnull))completionHandler {
|
- (void)_fetchAppropriateRepositoryDataCompletionHandler:(void (^)(NSArray<MPPluginRepositoryItem *> * _Nonnull))completionHandler {
|
||||||
|
/* dispatch the call to allow for direct return and handle result later on */
|
||||||
|
dispatch_async(dispatch_get_main_queue(), ^{
|
||||||
|
BOOL allowRemoteConnection = [self _askForPluginRepositoryPermission];
|
||||||
|
if(!allowRemoteConnection) {
|
||||||
|
[self _fetchLocalFallbackRepositoryData:completionHandler];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
[self _fetchRepositoryDataCompletionHandler:completionHandler];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)_fetchRepositoryDataCompletionHandler:(void (^)(NSArray<MPPluginRepositoryItem *> * _Nonnull))completionHandler {
|
||||||
NSString *urlString = NSBundle.mainBundle.infoDictionary[MPBundlePluginRepositoryURLKey];
|
NSString *urlString = NSBundle.mainBundle.infoDictionary[MPBundlePluginRepositoryURLKey];
|
||||||
if(!urlString) {
|
if(!urlString) {
|
||||||
if(completionHandler) {
|
[self _fetchLocalFallbackRepositoryData:completionHandler];
|
||||||
completionHandler(@[]);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
NSURL *jsonURL = [NSURL URLWithString:urlString];
|
NSURL *jsonURL = [NSURL URLWithString:urlString];
|
||||||
if(!jsonURL) {
|
if(!jsonURL) {
|
||||||
if(completionHandler) {
|
[self _fetchLocalFallbackRepositoryData:completionHandler];
|
||||||
completionHandler(@[]);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSURLSessionTask *downloadTask = [NSURLSession.sharedSession dataTaskWithURL:jsonURL completionHandler:^(NSData * _Nullable jsonData, NSURLResponse * _Nullable response, NSError * _Nullable error) {
|
NSURLSessionTask *downloadTask = [NSURLSession.sharedSession dataTaskWithURL:jsonURL completionHandler:^(NSData * _Nullable jsonData, NSURLResponse * _Nullable response, NSError * _Nullable error) {
|
||||||
if(![response isKindOfClass:NSHTTPURLResponse.class]) {
|
if(![response isKindOfClass:NSHTTPURLResponse.class]) {
|
||||||
if(completionHandler) {
|
[self _fetchLocalFallbackRepositoryData:completionHandler];
|
||||||
completionHandler(@[]);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
|
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
|
||||||
if(httpResponse.statusCode != 200 || jsonData.length == 0) {
|
if(httpResponse.statusCode != 200 || jsonData.length == 0) {
|
||||||
|
[self _fetchLocalFallbackRepositoryData:completionHandler];
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
NSArray *items = [self _parseJSONData:jsonData];
|
||||||
|
|
||||||
|
if(completionHandler) {
|
||||||
|
completionHandler([items copy]);
|
||||||
|
}
|
||||||
|
}];
|
||||||
|
[downloadTask resume];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)_fetchLocalFallbackRepositoryData:(void (^)(NSArray<MPPluginRepositoryItem *> * _Nonnull))completionHandler {
|
||||||
|
NSURL *jsonURL = [NSBundle.mainBundle URLForResource:@"plugins" withExtension:@"json"];
|
||||||
|
NSData *localJsonData = [NSData dataWithContentsOfURL:jsonURL];
|
||||||
|
if(!localJsonData) {
|
||||||
if(completionHandler) {
|
if(completionHandler) {
|
||||||
completionHandler(@[]);
|
completionHandler(@[]);
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
NSArray<MPPluginRepositoryItem *> *items = [self _parseJSONData:localJsonData];
|
||||||
|
if(completionHandler) {
|
||||||
|
completionHandler(items);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSArray<MPPluginRepositoryItem *> *)_parseJSONData:(NSData *)jsonData {
|
||||||
|
NSError *error;
|
||||||
id jsonRoot = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
|
id jsonRoot = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
|
||||||
if(!jsonRoot || ![jsonRoot isKindOfClass:NSArray.class]) {
|
if(!jsonRoot || ![jsonRoot isKindOfClass:NSArray.class]) {
|
||||||
if(completionHandler) {
|
return @[];
|
||||||
completionHandler(@[]);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
NSMutableArray *items = [[NSMutableArray alloc] init];
|
NSMutableArray *items = [[NSMutableArray alloc] init];
|
||||||
for(id item in jsonRoot) {
|
for(id item in jsonRoot) {
|
||||||
@@ -134,12 +165,24 @@ NSString *const MPPluginRepositoryDidUpdateAvailablePluginsNotification = @"com.
|
|||||||
[items addObject:pluginItem];
|
[items addObject:pluginItem];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(completionHandler) {
|
return [items copy];
|
||||||
completionHandler([items copy]);
|
}
|
||||||
}
|
|
||||||
}];
|
|
||||||
|
|
||||||
[downloadTask resume];
|
- (BOOL)_askForPluginRepositoryPermission {
|
||||||
|
if(![NSUserDefaults.standardUserDefaults objectForKey:kMPSettingsKeyAllowRemoteFetchOfPluginRepository]) {
|
||||||
|
NSAlert *alert = [[NSAlert alloc] init];
|
||||||
|
alert.alertStyle = NSAlertStyleWarning;
|
||||||
|
alert.informativeText = NSLocalizedString(@"ALERT_ASK_FOR_PLUGIN_REPOSITORY_CONNECTION_PERMISSION_INFORMATIVE_TEXT", @"Informative text displayed on the alert that shows up when MacPass asks for permssion to download the plugin repository JSON file");
|
||||||
|
alert.messageText = NSLocalizedString(@"ALERT_ASK_FOR_PLUGIN_REPOSITORY_CONNECTION_PERMISSION_MESSAGE", @"Message displayed on the alert that asks for permission to download the plugin repository JSON file");
|
||||||
|
alert.showsSuppressionButton = YES;
|
||||||
|
[alert addButtonWithTitle:NSLocalizedString(@"ALERT_ASK_FOR_PLUGIN_REPOSITORY_ALLOW_DOWNLOAD", @"Allow the download of the plugin repository file")];
|
||||||
|
[alert addButtonWithTitle:NSLocalizedString(@"ALERT_ASK_FOR_PLUGIN_REPOSITORY_DISALLOW_DOWNLOAD", @"Disallow the download of the plugin repository file")];
|
||||||
|
NSModalResponse repsonse = [alert runModal];
|
||||||
|
BOOL allow = (repsonse == NSAlertFirstButtonReturn);
|
||||||
|
[NSUserDefaults.standardUserDefaults setBool:allow forKey:kMPSettingsKeyAllowRemoteFetchOfPluginRepository];
|
||||||
|
return allow;
|
||||||
|
}
|
||||||
|
return [NSUserDefaults.standardUserDefaults boolForKey:kMPSettingsKeyAllowRemoteFetchOfPluginRepository];
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -24,10 +24,10 @@
|
|||||||
|
|
||||||
#import "MPPreferencesTab.h"
|
#import "MPPreferencesTab.h"
|
||||||
|
|
||||||
#import "MPGeneralSettingsController.h"
|
#import "MPGeneralPreferencesController.h"
|
||||||
#import "MPIntegrationSettingsController.h"
|
#import "MPIntegrationPreferencesController.h"
|
||||||
#import "MPWorkflowSettingsController.h"
|
#import "MPWorkflowPreferencesController.h"
|
||||||
#import "MPUpdateSettingsController.h"
|
#import "MPUpdatePreferencesController.h"
|
||||||
#import "MPPluginPreferencesController.h"
|
#import "MPPluginPreferencesController.h"
|
||||||
|
|
||||||
@interface MPPreferencesWindowController () {
|
@interface MPPreferencesWindowController () {
|
||||||
@@ -121,14 +121,14 @@
|
|||||||
tabClass = MPPluginPreferencesController.class;
|
tabClass = MPPluginPreferencesController.class;
|
||||||
break;
|
break;
|
||||||
case MPPreferencesTabUpdate:
|
case MPPreferencesTabUpdate:
|
||||||
tabClass = MPUpdateSettingsController.class;
|
tabClass = MPUpdatePreferencesController.class;
|
||||||
break;
|
break;
|
||||||
case MPPreferencesTabWorkflow:
|
case MPPreferencesTabWorkflow:
|
||||||
tabClass = MPWorkflowSettingsController.class;
|
tabClass = MPWorkflowPreferencesController.class;
|
||||||
break;
|
break;
|
||||||
case MPPreferencesTabGeneral:
|
case MPPreferencesTabGeneral:
|
||||||
default:
|
default:
|
||||||
tabClass = MPGeneralSettingsController.class;
|
tabClass = MPGeneralPreferencesController.class;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
NSString *identifier;
|
NSString *identifier;
|
||||||
@@ -164,10 +164,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)_setupDefaultPreferencesTabs {
|
- (void)_setupDefaultPreferencesTabs {
|
||||||
NSArray *controllers = @[ [[MPGeneralSettingsController alloc] init],
|
NSArray *controllers = @[ [[MPGeneralPreferencesController alloc] init],
|
||||||
[[MPIntegrationSettingsController alloc] init],
|
[[MPIntegrationPreferencesController alloc] init],
|
||||||
[[MPWorkflowSettingsController alloc] init],
|
[[MPWorkflowPreferencesController alloc] init],
|
||||||
[[MPUpdateSettingsController alloc] init],
|
[[MPUpdatePreferencesController alloc] init],
|
||||||
[[MPPluginPreferencesController alloc] init] ];
|
[[MPPluginPreferencesController alloc] init] ];
|
||||||
NSMutableArray *identifier = [[NSMutableArray alloc] initWithCapacity:controllers.count];
|
NSMutableArray *identifier = [[NSMutableArray alloc] initWithCapacity:controllers.count];
|
||||||
for(id<MPPreferencesTab> controller in controllers) {
|
for(id<MPPreferencesTab> controller in controllers) {
|
||||||
|
|||||||
@@ -37,8 +37,8 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (void)viewDidLoad {
|
- (void)viewDidLoad {
|
||||||
self.searchKeyPopUpButton.menu = [self _allocateAttributeItemMenu:YES withTitle:NSLocalizedString(@"SEARCH_VALUE", "")];
|
self.searchKeyPopUpButton.menu = [self _allocateAttributeItemMenu:YES withTitle:NSLocalizedString(@"SEARCH_VALUE", "Search field for references lookup")];
|
||||||
self.valuePopUpButton.menu = [self _allocateAttributeItemMenu:NO withTitle:NSLocalizedString(@"OUTPUT_VALUE", "")];
|
self.valuePopUpButton.menu = [self _allocateAttributeItemMenu:NO withTitle:NSLocalizedString(@"OUTPUT_VALUE", "Value field for reference lookup")];
|
||||||
[self.searchStringTextField bind:NSValueBinding toObject:self withKeyPath:NSStringFromSelector(@selector(searchString)) options:nil];
|
[self.searchStringTextField bind:NSValueBinding toObject:self withKeyPath:NSStringFromSelector(@selector(searchString)) options:nil];
|
||||||
[self _updateReferenceString];
|
[self _updateReferenceString];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ APPKIT_EXTERN NSString *const kMPSettingsKeyAutotypeMatchTitle; //
|
|||||||
APPKIT_EXTERN NSString *const kMPSettingsKeyAutotypeMatchURL; // Autotype lookup includes entry URL
|
APPKIT_EXTERN NSString *const kMPSettingsKeyAutotypeMatchURL; // Autotype lookup includes entry URL
|
||||||
APPKIT_EXTERN NSString *const kMPSettingsKeyAutotypeMatchHost; // Autotype lookup includes host part of entry URL
|
APPKIT_EXTERN NSString *const kMPSettingsKeyAutotypeMatchHost; // Autotype lookup includes host part of entry URL
|
||||||
APPKIT_EXTERN NSString *const kMPSettingsKeyAutotypeMatchTags; // Autotype lookup includes tags for entries
|
APPKIT_EXTERN NSString *const kMPSettingsKeyAutotypeMatchTags; // Autotype lookup includes tags for entries
|
||||||
APPKIT_EXTERN NSString *const kMPSettingsKeyAutotypeHideAccessibiltyWarning; // Do not show an alert, when MacPass has no support for Autotype
|
APPKIT_EXTERN NSString *const kMPSettingsKeyAutotpyeHideMissingPermissionsWarning;
|
||||||
|
|
||||||
/* Search */
|
/* Search */
|
||||||
APPKIT_EXTERN NSString *const kMPSettingsKeyEntrySearchFilterContext;
|
APPKIT_EXTERN NSString *const kMPSettingsKeyEntrySearchFilterContext;
|
||||||
@@ -80,12 +80,15 @@ APPKIT_EXTERN NSString *const kMPSettingsKeyEnableQuicklookPreview;
|
|||||||
APPKIT_EXTERN NSString *const kMPSettingsKeyDoubleClickURLAction;
|
APPKIT_EXTERN NSString *const kMPSettingsKeyDoubleClickURLAction;
|
||||||
APPKIT_EXTERN NSString *const kMPSettingsKeyDoubleClickTitleAction;
|
APPKIT_EXTERN NSString *const kMPSettingsKeyDoubleClickTitleAction;
|
||||||
APPKIT_EXTERN NSString *const kMPSettingsKeyUpdatePasswordOnTemplateEntries;
|
APPKIT_EXTERN NSString *const kMPSettingsKeyUpdatePasswordOnTemplateEntries;
|
||||||
|
APPKIT_EXTERN NSString *const kMPSettingsKeyHideAfterCopyToClipboard;
|
||||||
|
|
||||||
/* Plugins */
|
/* Plugins */
|
||||||
APPKIT_EXTERN NSString *const kMPSettingsKeyLoadUnsecurePlugins; // If set to YES this will load all plugins regardless of their codesignature status
|
APPKIT_EXTERN NSString *const kMPSettingsKeyLoadUnsecurePlugins; // If set to YES this will load all plugins regardless of their codesignature status
|
||||||
APPKIT_EXTERN NSString *const kMPSettingsKeyDisabledPlugins; // NSArray of bundle identifiers of disabled plugins
|
APPKIT_EXTERN NSString *const kMPSettingsKeyDisabledPlugins; // NSArray of bundle identifiers of disabled plugins
|
||||||
APPKIT_EXTERN NSString *const kMPSettingsKeyLoadIncompatiblePlugins; // If set to YES incompatible plugins (no version info, marked as incompatible, etc) will be loaded regardless
|
APPKIT_EXTERN NSString *const kMPSettingsKeyLoadIncompatiblePlugins; // If set to YES incompatible plugins (no version info, marked as incompatible, etc) will be loaded regardless
|
||||||
APPKIT_EXTERN NSString *const kMPSettingsKeyHideIncopatiblePluginsWarning; // Do not show an alert, when MacPass encounteres incompatible plugins
|
APPKIT_EXTERN NSString *const kMPSettingsKeyHideIncopatiblePluginsWarning; // Do not show an alert, when MacPass encounteres incompatible plugins
|
||||||
|
APPKIT_EXTERN NSString *const kMPSettingsKeyAllowRemoteFetchOfPluginRepository; // Allow the download of the plugin repository file
|
||||||
|
APPKIT_EXTERN NSString *const kMPSettingsKeyPluginHideAksForRemoveConnectionPermission;
|
||||||
|
|
||||||
typedef NS_ENUM(NSUInteger, MPFileChangeStrategy) {
|
typedef NS_ENUM(NSUInteger, MPFileChangeStrategy) {
|
||||||
MPFileChangeStrategyAsk,
|
MPFileChangeStrategyAsk,
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ NSString *const kMPSettingsKeyAutotypeMatchTitle = @"Autoty
|
|||||||
NSString *const kMPSettingsKeyAutotypeMatchURL = @"AutotypeMatchURL";
|
NSString *const kMPSettingsKeyAutotypeMatchURL = @"AutotypeMatchURL";
|
||||||
NSString *const kMPSettingsKeyAutotypeMatchHost = @"AutotypeMatchHost";
|
NSString *const kMPSettingsKeyAutotypeMatchHost = @"AutotypeMatchHost";
|
||||||
NSString *const kMPSettingsKeyAutotypeMatchTags = @"AutotypeMatchTags";
|
NSString *const kMPSettingsKeyAutotypeMatchTags = @"AutotypeMatchTags";
|
||||||
NSString *const kMPSettingsKeyAutotypeHideAccessibiltyWarning = @"AutotypeHideAccessibiltyWarning";
|
NSString *const kMPSettingsKeyAutotpyeHideMissingPermissionsWarning = @"AutotpyeHideMissingPermissionsWarning";
|
||||||
|
|
||||||
NSString *const kMPSettingsKeyEntrySearchFilterContext = @"EntrySearchFilterContext";
|
NSString *const kMPSettingsKeyEntrySearchFilterContext = @"EntrySearchFilterContext";
|
||||||
|
|
||||||
@@ -78,11 +78,13 @@ NSString *const kMPSettingsKeyPasswordDefaultsForEntry = @"Passwo
|
|||||||
NSString *const kMPSettingsKeyDoubleClickURLAction = @"DoubleClickURLAction";
|
NSString *const kMPSettingsKeyDoubleClickURLAction = @"DoubleClickURLAction";
|
||||||
NSString *const kMPSettingsKeyDoubleClickTitleAction = @"DoubleClickTitleAction";
|
NSString *const kMPSettingsKeyDoubleClickTitleAction = @"DoubleClickTitleAction";
|
||||||
NSString *const kMPSettingsKeyUpdatePasswordOnTemplateEntries = @"UpdatePasswordOnTemplateEntries";
|
NSString *const kMPSettingsKeyUpdatePasswordOnTemplateEntries = @"UpdatePasswordOnTemplateEntries";
|
||||||
|
NSString *const kMPSettingsKeyHideAfterCopyToClipboard = @"HideAfterCopyToClipboard";
|
||||||
|
|
||||||
NSString *const kMPSettingsKeyLoadUnsecurePlugins = @"LoadUnsecurePlugins";
|
NSString *const kMPSettingsKeyLoadUnsecurePlugins = @"LoadUnsecurePlugins";
|
||||||
NSString *const kMPSettingsKeyLoadIncompatiblePlugins = @"LoadIncompatiblePlugins";
|
NSString *const kMPSettingsKeyLoadIncompatiblePlugins = @"LoadIncompatiblePlugins";
|
||||||
NSString *const kMPSettingsKeyDisabledPlugins = @"DisabledPlugins";
|
NSString *const kMPSettingsKeyDisabledPlugins = @"DisabledPlugins";
|
||||||
NSString *const kMPSettingsKeyHideIncopatiblePluginsWarning = @"HideIncopatiblePluginsWarning";
|
NSString *const kMPSettingsKeyHideIncopatiblePluginsWarning = @"HideIncopatiblePluginsWarning";
|
||||||
|
NSString *const kMPSettingsKeyAllowRemoteFetchOfPluginRepository = @"AllowRemoteFetchOfPluginRepository";
|
||||||
|
|
||||||
/* Deprecated */
|
/* Deprecated */
|
||||||
NSString *const kMPDeprecatedSettingsKeyRememberKeyFilesForDatabases = @"kMPSettingsKeyRememberKeyFilesForDatabases";
|
NSString *const kMPDeprecatedSettingsKeyRememberKeyFilesForDatabases = @"kMPSettingsKeyRememberKeyFilesForDatabases";
|
||||||
@@ -95,7 +97,7 @@ NSString *const kMPDeprecatedSettingsKeyEnableHttpServer = @"En
|
|||||||
NSString *const kMPDeprecatedSettingsKeyShowMenuItem = @"ShowMenuItem";
|
NSString *const kMPDeprecatedSettingsKeyShowMenuItem = @"ShowMenuItem";
|
||||||
NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"KeyDefaultPasswordRounds";
|
NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"KeyDefaultPasswordRounds";
|
||||||
NSString *const kMPDepricatedSettingsKeyLoadUnsecurePlugins = @"MPLoadUnsecurePlugins";
|
NSString *const kMPDepricatedSettingsKeyLoadUnsecurePlugins = @"MPLoadUnsecurePlugins";
|
||||||
|
NSString *const kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning = @"AutotypeHideAccessibiltyWarning";
|
||||||
|
|
||||||
@implementation MPSettingsHelper
|
@implementation MPSettingsHelper
|
||||||
|
|
||||||
@@ -159,7 +161,8 @@ NSString *const kMPDepricatedSettingsKeyLoadUnsecurePlugins = @"MP
|
|||||||
kMPSettingsKeyDisabledPlugins: @[],
|
kMPSettingsKeyDisabledPlugins: @[],
|
||||||
kMPSettingsKeyLoadIncompatiblePlugins: @NO,
|
kMPSettingsKeyLoadIncompatiblePlugins: @NO,
|
||||||
kMPSettingsKeyQuitOnLastWindowClose: @NO,
|
kMPSettingsKeyQuitOnLastWindowClose: @NO,
|
||||||
kMPSettingsKeyEnableAutosave: @YES
|
kMPSettingsKeyEnableAutosave: @YES,
|
||||||
|
kMPSettingsKeyHideAfterCopyToClipboard: @NO
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
return standardDefaults;
|
return standardDefaults;
|
||||||
@@ -179,7 +182,8 @@ NSString *const kMPDepricatedSettingsKeyLoadUnsecurePlugins = @"MP
|
|||||||
kMPDeprecatedSettingsKeyHttpPort,
|
kMPDeprecatedSettingsKeyHttpPort,
|
||||||
kMPDeprecatedSettingsKeyEnableHttpServer,
|
kMPDeprecatedSettingsKeyEnableHttpServer,
|
||||||
kMPDeprecatedSettingsKeyShowMenuItem,
|
kMPDeprecatedSettingsKeyShowMenuItem,
|
||||||
kMPDepricatedSettingsKeyLoadUnsecurePlugins
|
kMPDepricatedSettingsKeyLoadUnsecurePlugins,
|
||||||
|
kMPDepricatedSettingsKeyAutotypeHideAccessibiltyWarning
|
||||||
];
|
];
|
||||||
});
|
});
|
||||||
return deprecatedSettings;
|
return deprecatedSettings;
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
if(self) {
|
if(self) {
|
||||||
self.focusRingType = NSFocusRingTypeNone;
|
self.focusRingType = NSFocusRingTypeNone;
|
||||||
self.bezelStyle = NSTexturedRoundedBezelStyle;
|
self.bezelStyle = NSTexturedRoundedBezelStyle;
|
||||||
[self.cell setImageScaling:NSImageScaleProportionallyDown];
|
((NSButtonCell *)(self.cell)).imageScaling = NSImageScaleProportionallyDown;
|
||||||
[self setButtonType:NSMomentaryPushInButton];
|
[self setButtonType:NSMomentaryPushInButton];
|
||||||
self.imagePosition = NSImageOnly;
|
self.imagePosition = NSImageOnly;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -111,6 +111,7 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
|
|||||||
item = [[MPToolbarItem alloc] initWithItemIdentifier:itemIdentifier];
|
item = [[MPToolbarItem alloc] initWithItemIdentifier:itemIdentifier];
|
||||||
NSString *itemLabel = [self _localizedLabelForToolbarItemIdentifier:itemIdentifier];
|
NSString *itemLabel = [self _localizedLabelForToolbarItemIdentifier:itemIdentifier];
|
||||||
item.label = itemLabel;
|
item.label = itemLabel;
|
||||||
|
item.paletteLabel = itemLabel;
|
||||||
|
|
||||||
if([itemIdentifier isEqualToString:MPToolbarItemAction]) {
|
if([itemIdentifier isEqualToString:MPToolbarItemAction]) {
|
||||||
NSPopUpButton *popupButton = [[NSPopUpButton alloc] initWithFrame:NSMakeRect(0, 0, 50, 32) pullsDown:YES];
|
NSPopUpButton *popupButton = [[NSPopUpButton alloc] initWithFrame:NSMakeRect(0, 0, 50, 32) pullsDown:YES];
|
||||||
@@ -127,7 +128,7 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
|
|||||||
NSMenuItem *actionImageItem = [[NSMenuItem alloc] initWithTitle:@"" action:NULL keyEquivalent:@""];
|
NSMenuItem *actionImageItem = [[NSMenuItem alloc] initWithTitle:@"" action:NULL keyEquivalent:@""];
|
||||||
actionImageItem.image = self.toolbarImages[MPToolbarItemAction];
|
actionImageItem.image = self.toolbarImages[MPToolbarItemAction];
|
||||||
[menu addItem:actionImageItem];
|
[menu addItem:actionImageItem];
|
||||||
NSArray *menuItems = [MPContextMenuHelper contextMenuItemsWithItems:MPContextMenuExtended];
|
NSArray *menuItems = [MPContextMenuHelper contextMenuItemsWithItems:MPContextMenuExtended|MPContextMenuShowGroupInOutline];
|
||||||
for(NSMenuItem *item in menuItems) {
|
for(NSMenuItem *item in menuItems) {
|
||||||
[menu addItem:item];
|
[menu addItem:item];
|
||||||
}
|
}
|
||||||
@@ -215,7 +216,7 @@ NSString *const MPToolbarItemAutotype = @"TOOLBAR_AUTOTYPE";
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (NSDictionary *)createToolbarImages {
|
- (NSDictionary *)createToolbarImages {
|
||||||
NSDictionary *imageDict = @{ MPToolbarItemLock: [NSImage imageNamed:NSImageNameLockUnlockedTemplate],
|
NSDictionary *imageDict = @{ MPToolbarItemLock: [NSImage imageNamed:NSImageNameLockLockedTemplate],
|
||||||
MPToolbarItemAddEntry: [MPIconHelper icon:MPIconAddEntry],
|
MPToolbarItemAddEntry: [MPIconHelper icon:MPIconAddEntry],
|
||||||
MPToolbarItemAddGroup: [MPIconHelper icon:MPIconAddFolder],
|
MPToolbarItemAddGroup: [MPIconHelper icon:MPIconAddFolder],
|
||||||
MPToolbarItemCopyUsername : [MPIconHelper icon:MPIconIdentity],
|
MPToolbarItemCopyUsername : [MPIconHelper icon:MPIconIdentity],
|
||||||
|
|||||||
40
MacPass/MPTouchBarButtonCreator.h
Normal file
40
MacPass/MPTouchBarButtonCreator.h
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
//
|
||||||
|
// MPTouchBarButtonCreator.h
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Veit-Hendrik Schlenker on 25.12.18.
|
||||||
|
// Copyright © 2018 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
#import "MPPasswordInputController.h"
|
||||||
|
|
||||||
|
@interface MPTouchBarButtonCreator: NSObject
|
||||||
|
|
||||||
|
APPKIT_EXTERN NSTouchBarCustomizationIdentifier MPTouchBarCustomizationIdentifierPasswordInput;
|
||||||
|
APPKIT_EXTERN NSTouchBarItemIdentifier MPTouchBarItemIdentifierChooseKeyfile;
|
||||||
|
APPKIT_EXTERN NSTouchBarItemIdentifier MPTouchBarItemIdentifierShowPassword;
|
||||||
|
APPKIT_EXTERN NSTouchBarItemIdentifier MPTouchBarItemIdentifierUnlock;
|
||||||
|
|
||||||
|
APPKIT_EXTERN NSTouchBarCustomizationIdentifier MPTouchBarCustomizationIdentifierDocument;
|
||||||
|
APPKIT_EXTERN NSTouchBarItemIdentifier MPTouchBarItemIdentifierSearch;
|
||||||
|
APPKIT_EXTERN NSTouchBarItemIdentifier MPTouchBarItemIdentifierEditPopover;
|
||||||
|
APPKIT_EXTERN NSTouchBarItemIdentifier MPTouchBarItemIdentifierCopyUsername;
|
||||||
|
APPKIT_EXTERN NSTouchBarItemIdentifier MPTouchBarItemIdentifierCopyPassword;
|
||||||
|
APPKIT_EXTERN NSTouchBarItemIdentifier MPTouchBarItemIdentifierPerformAutotype;
|
||||||
|
APPKIT_EXTERN NSTouchBarItemIdentifier MPTouchBarItemIdentifierLock;
|
||||||
|
|
||||||
|
APPKIT_EXTERN NSTouchBarItemIdentifier MPTouchBarItemIdentifierNewEntry;
|
||||||
|
APPKIT_EXTERN NSTouchBarItemIdentifier MPTouchBarItemIdentifierNewGroup;
|
||||||
|
APPKIT_EXTERN NSTouchBarItemIdentifier MPTouchBarItemIdentifierDelete;
|
||||||
|
|
||||||
|
|
||||||
|
+ (NSTouchBarItem *)touchBarButtonWithTitle:(NSString *)title identifier:(NSTouchBarItemIdentifier)identifier target:(id)target selector:(SEL)selector customizationLabel:(NSString *)customizationLabel API_AVAILABLE(macos(10.12.2));
|
||||||
|
|
||||||
|
+ (NSTouchBarItem *)touchBarButtonWithTitleAndImage:(NSString *)title identifier:(NSTouchBarItemIdentifier)identifier image:(NSImage *)image target:(id)target selector:(SEL)selector customizationLabel:(NSString *)customizationLabel API_AVAILABLE(macos(10.12.2));
|
||||||
|
|
||||||
|
+ (NSTouchBarItem *)touchBarButtonWithTitleAndImageAndColor:(NSString *)title identifier:(NSTouchBarItemIdentifier)identifier image:(NSImage *)image color:(NSColor *)color target:(id)target selector:(SEL)selector customizationLabel:(NSString *)customizationLabel API_AVAILABLE(macos(10.12.2));
|
||||||
|
|
||||||
|
+ (NSTouchBarItem *)touchBarButtonWithImage:(NSImage *)image identifier:(NSTouchBarItemIdentifier)identifier target:(id)target selector:(SEL)selector customizationLabel:(NSString *)customizationLabel API_AVAILABLE(macos(10.12.2));
|
||||||
|
|
||||||
|
+ (NSPopoverTouchBarItem *)popoverTouchBarButton:(NSString *)title identifier:(NSTouchBarItemIdentifier)identifier popoverTouchBar:(NSTouchBar *)popoverTouchBar customizationLabel:(NSString *)customizationLabel API_AVAILABLE(macos(10.12.2));
|
||||||
|
|
||||||
|
@end
|
||||||
68
MacPass/MPTouchBarButtonCreator.m
Normal file
68
MacPass/MPTouchBarButtonCreator.m
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
//
|
||||||
|
// MPTouchBarButtonCreator.m
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Veit-Hendrik Schlenker on 25.12.18.
|
||||||
|
// Copyright © 2018 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "MPTouchBarButtonCreator.h"
|
||||||
|
|
||||||
|
NSTouchBarCustomizationIdentifier MPTouchBarCustomizationIdentifierPasswordInput = @"com.hicknhacksoftware.MacPass.TouchBar.passwordInput";
|
||||||
|
NSTouchBarItemIdentifier MPTouchBarItemIdentifierChooseKeyfile = @"com.hicknhacksoftware.MacPass.TouchBar.passwordInput.chooseKeyfile";
|
||||||
|
NSTouchBarItemIdentifier MPTouchBarItemIdentifierShowPassword = @"com.hicknhacksoftware.MacPass.TouchBar.passwordInput.showPassword";
|
||||||
|
NSTouchBarItemIdentifier MPTouchBarItemIdentifierUnlock = @"com.hicknhacksoftware.MacPass.TouchBar.passwordInput.unlock";
|
||||||
|
|
||||||
|
NSTouchBarCustomizationIdentifier MPTouchBarCustomizationIdentifierDocument = @"com.hicknhacksoftware.MacPass.TouchBar.documentWindow";
|
||||||
|
NSTouchBarItemIdentifier MPTouchBarItemIdentifierSearch = @"com.hicknhacksoftware.MacPass.TouchBar.documentWindow.search";
|
||||||
|
NSTouchBarItemIdentifier MPTouchBarItemIdentifierEditPopover = @"com.hicknhacksoftware.MacPass.TouchBar.documentWindow.editPopover";
|
||||||
|
NSTouchBarItemIdentifier MPTouchBarItemIdentifierCopyUsername = @"com.hicknhacksoftware.MacPass.TouchBar.documentWindow.copyUsername";
|
||||||
|
NSTouchBarItemIdentifier MPTouchBarItemIdentifierCopyPassword = @"com.hicknhacksoftware.MacPass.TouchBar.documentWindow.copyPassword";
|
||||||
|
NSTouchBarItemIdentifier MPTouchBarItemIdentifierPerformAutotype = @"com.hicknhacksoftware.MacPass.TouchBar.documentWindow.performAutotype";
|
||||||
|
NSTouchBarItemIdentifier MPTouchBarItemIdentifierLock = @"com.hicknhacksoftware.MacPass.TouchBar.documentWindow.lock";
|
||||||
|
|
||||||
|
NSTouchBarItemIdentifier MPTouchBarItemIdentifierNewEntry = @"com.hicknhacksoftware.MacPass.TouchBar.documentWindow.newEntry";
|
||||||
|
NSTouchBarItemIdentifier MPTouchBarItemIdentifierNewGroup = @"com.hicknhacksoftware.MacPass.TouchBar.documentWindow.newGroup";
|
||||||
|
NSTouchBarItemIdentifier MPTouchBarItemIdentifierDelete = @"com.hicknhacksoftware.MacPass.TouchBar.documentWindow.delete";
|
||||||
|
|
||||||
|
|
||||||
|
@implementation MPTouchBarButtonCreator
|
||||||
|
|
||||||
|
+ (NSTouchBarItem *)touchBarButtonWithTitle:(NSString *)title identifier:(NSTouchBarItemIdentifier)identifier target:(id)target selector:(SEL)selector customizationLabel:(NSString *)customizationLabel API_AVAILABLE(macos(10.12.2)){
|
||||||
|
NSCustomTouchBarItem *item = [[NSCustomTouchBarItem alloc] initWithIdentifier:identifier];
|
||||||
|
NSButton *button = [NSButton buttonWithTitle:title target:target action:selector];
|
||||||
|
item.view = button;
|
||||||
|
item.customizationLabel = customizationLabel;
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSTouchBarItem *)touchBarButtonWithTitleAndImage:(NSString *)title identifier:(NSTouchBarItemIdentifier)identifier image:(NSImage *)image target:(id)target selector:(SEL)selector customizationLabel:(NSString *)customizationLabel API_AVAILABLE(macos(10.12.2)){
|
||||||
|
return [self touchBarButtonWithTitleAndImageAndColor:title identifier:identifier image:image color:nil target:target selector:selector customizationLabel:customizationLabel];
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSTouchBarItem *)touchBarButtonWithTitleAndImageAndColor:(NSString *)title identifier:(NSTouchBarItemIdentifier)identifier image:(NSImage *)image color:(NSColor *)color target:(id)target selector:(SEL)selector customizationLabel:(NSString *)customizationLabel API_AVAILABLE(macos(10.12.2)){
|
||||||
|
NSCustomTouchBarItem *item = [[NSCustomTouchBarItem alloc] initWithIdentifier:identifier];
|
||||||
|
NSButton *button = [NSButton buttonWithTitle:title image:image target:target action:selector];
|
||||||
|
button.bezelColor = color;
|
||||||
|
item.view = button;
|
||||||
|
item.customizationLabel = customizationLabel;
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSTouchBarItem *)touchBarButtonWithImage:(NSImage *)image identifier:(NSTouchBarItemIdentifier)identifier target:(id)target selector:(SEL)selector customizationLabel:(NSString *)customizationLabel API_AVAILABLE(macos(10.12.2)){
|
||||||
|
NSCustomTouchBarItem *item = [[NSCustomTouchBarItem alloc] initWithIdentifier:identifier];
|
||||||
|
NSButton *button = [NSButton buttonWithImage:image target:target action:selector];
|
||||||
|
item.view = button;
|
||||||
|
item.customizationLabel = customizationLabel;
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (NSPopoverTouchBarItem *)popoverTouchBarButton:(NSString *)title identifier:(NSTouchBarItemIdentifier)identifier popoverTouchBar:(NSTouchBar *)popoverTouchBar customizationLabel:(NSString *)customizationLabel API_AVAILABLE(macos(10.12.2)){
|
||||||
|
NSPopoverTouchBarItem *item = [[NSPopoverTouchBarItem alloc] initWithIdentifier:identifier];
|
||||||
|
item.collapsedRepresentationLabel = title;
|
||||||
|
item.popoverTouchBar = popoverTouchBar;
|
||||||
|
item.customizationLabel = customizationLabel;
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
@@ -99,10 +99,9 @@
|
|||||||
return (response == NSModalResponseOK) ? pickFieldViewController.pickedValue : @"";
|
return (response == NSModalResponseOK) ? pickFieldViewController.pickedValue : @"";
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSString *)tree:(KPKTree *)tree resolvePickCharsPlaceholderForEntry:(KPKEntry *)entry field:(NSString *)field options:(NSString *)options {
|
- (NSString *)tree:(KPKTree *)tree resolvePickCharsPlaceholderForValue:(NSString *)value options:(NSString *)options {
|
||||||
NSString *value = [[entry valueForAttributeWithKey:field] kpk_finalValueForEntry:entry];
|
|
||||||
if(value.length == 0) {
|
if(value.length == 0) {
|
||||||
return @""; // error while retrieving source value
|
return @"";
|
||||||
}
|
}
|
||||||
MPPickcharsParser *parser = [[MPPickcharsParser alloc] initWithOptions:options];
|
MPPickcharsParser *parser = [[MPPickcharsParser alloc] initWithOptions:options];
|
||||||
MPPickcharsViewController *pickCharViewController = [[MPPickcharsViewController alloc] init];
|
MPPickcharsViewController *pickCharViewController = [[MPPickcharsViewController alloc] init];
|
||||||
|
|||||||
@@ -23,6 +23,6 @@
|
|||||||
#import "MPViewController.h"
|
#import "MPViewController.h"
|
||||||
#import "MPPreferencesTab.h"
|
#import "MPPreferencesTab.h"
|
||||||
|
|
||||||
@interface MPUpdateSettingsController : MPViewController <MPPreferencesTab>
|
@interface MPUpdatePreferencesController : MPViewController <MPPreferencesTab>
|
||||||
|
|
||||||
@end
|
@end
|
||||||
@@ -20,23 +20,23 @@
|
|||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
|
|
||||||
#import "MPUpdateSettingsController.h"
|
#import "MPUpdatePreferencesController.h"
|
||||||
#import <Sparkle/Sparkle.h>
|
#import <Sparkle/Sparkle.h>
|
||||||
|
|
||||||
@interface MPUpdateSettingsController ()
|
@interface MPUpdatePreferencesController ()
|
||||||
@property (weak) IBOutlet NSButton *automaticallyCheckForUpdatesCheckButton;
|
@property (weak) IBOutlet NSButton *automaticallyCheckForUpdatesCheckButton;
|
||||||
@property (weak) IBOutlet NSPopUpButton *checkIntervallPopupButton;
|
@property (weak) IBOutlet NSPopUpButton *checkIntervallPopupButton;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation MPUpdateSettingsController
|
@implementation MPUpdatePreferencesController
|
||||||
|
|
||||||
- (NSString *)nibName {
|
- (NSString *)nibName {
|
||||||
return @"UpdateSettings";
|
return @"UpdatePreferences";
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSString *)identifier {
|
- (NSString *)identifier {
|
||||||
return @"UpdateSettings";
|
return @"UpdatePreferences";
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSImage *)image {
|
- (NSImage *)image {
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (NSString *)label {
|
- (NSString *)label {
|
||||||
return NSLocalizedString(@"UPDATE_SETTINGS", @"Update Settings Label");
|
return NSLocalizedString(@"UPDATE_PREFERENCES", @"Update Settings Label");
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)awakeFromNib {
|
- (void)awakeFromNib {
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
FOUNDATION_EXTERN NSString *const MPUserNotificationTypeKey;
|
FOUNDATION_EXTERN NSString *const MPUserNotificationTypeKey;
|
||||||
FOUNDATION_EXTERN NSString *const MPUserNotificationTypeAutotypeFeedback;
|
FOUNDATION_EXTERN NSString *const MPUserNotificationTypeAutotypeFeedback;
|
||||||
FOUNDATION_EXTERN NSString *const MPUserNotificationTypeAutotypeOpenDocumentRequest;
|
FOUNDATION_EXTERN NSString *const MPUserNotificationTypeAutotypeOpenDocumentRequest;
|
||||||
FOUNDATION_EXTERN NSString *const MPUserNotificationTypeShowAccessibiltyPreferences;
|
FOUNDATION_EXTERN NSString *const MPUserNotificationTypeRunAutotypeDoctor;
|
||||||
|
|
||||||
@interface MPUserNotificationCenterDelegate : NSObject <NSUserNotificationCenterDelegate>
|
@interface MPUserNotificationCenterDelegate : NSObject <NSUserNotificationCenterDelegate>
|
||||||
|
|
||||||
|
|||||||
@@ -22,12 +22,12 @@
|
|||||||
|
|
||||||
#import "MPUserNotificationCenterDelegate.h"
|
#import "MPUserNotificationCenterDelegate.h"
|
||||||
#import "MPDocumentController.h"
|
#import "MPDocumentController.h"
|
||||||
#import "MPAutotypeDaemon.h"
|
#import "MPAutotypeDoctor.h"
|
||||||
|
|
||||||
NSString *const MPUserNotificationTypeKey = @"MPUserNotificationTypeKey";
|
NSString *const MPUserNotificationTypeKey = @"MPUserNotificationTypeKey";
|
||||||
NSString *const MPUserNotificationTypeAutotypeFeedback = @"MPUserNotificationTypeAutotypeFeedback";
|
NSString *const MPUserNotificationTypeAutotypeFeedback = @"MPUserNotificationTypeAutotypeFeedback";
|
||||||
NSString *const MPUserNotificationTypeAutotypeOpenDocumentRequest = @"MPUserNotificationTypeAutotypeOpenDocumentRequest";
|
NSString *const MPUserNotificationTypeAutotypeOpenDocumentRequest = @"MPUserNotificationTypeAutotypeOpenDocumentRequest";
|
||||||
NSString *const MPUserNotificationTypeShowAccessibiltyPreferences = @"MPUserNotificationTypeShowAccessibiltyPreferences";
|
NSString *const MPUserNotificationTypeRunAutotypeDoctor = @"MPUserNotificationTypeRunAutotypeDoctor";
|
||||||
|
|
||||||
@implementation MPUserNotificationCenterDelegate
|
@implementation MPUserNotificationCenterDelegate
|
||||||
|
|
||||||
@@ -45,8 +45,8 @@ NSString *const MPUserNotificationTypeShowAccessibiltyPreferences = @"MPUserNoti
|
|||||||
if([notificationType isEqualToString:MPUserNotificationTypeAutotypeOpenDocumentRequest]) {
|
if([notificationType isEqualToString:MPUserNotificationTypeAutotypeOpenDocumentRequest]) {
|
||||||
[((MPDocumentController*)NSDocumentController.sharedDocumentController) reopenLastDocument];
|
[((MPDocumentController*)NSDocumentController.sharedDocumentController) reopenLastDocument];
|
||||||
}
|
}
|
||||||
else if([notificationType isEqualToString:MPUserNotificationTypeShowAccessibiltyPreferences]) {
|
else if([notificationType isEqualToString:MPUserNotificationTypeRunAutotypeDoctor]) {
|
||||||
[MPAutotypeDaemon.defaultDaemon openAccessibiltyPreferences];
|
[MPAutotypeDoctor.defaultDoctor runChecksAndPresentResults];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,7 +55,7 @@ NSString *const MPUserNotificationTypeShowAccessibiltyPreferences = @"MPUserNoti
|
|||||||
if([notificationType isEqualToString:MPUserNotificationTypeAutotypeFeedback]) {
|
if([notificationType isEqualToString:MPUserNotificationTypeAutotypeFeedback]) {
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
if([notificationType isEqualToString:MPUserNotificationTypeShowAccessibiltyPreferences]) {
|
if([notificationType isEqualToString:MPUserNotificationTypeRunAutotypeDoctor]) {
|
||||||
return YES;
|
return YES;
|
||||||
}
|
}
|
||||||
return NO;
|
return NO;
|
||||||
|
|||||||
@@ -23,12 +23,13 @@
|
|||||||
#import "MPViewController.h"
|
#import "MPViewController.h"
|
||||||
#import "MPPreferencesTab.h"
|
#import "MPPreferencesTab.h"
|
||||||
|
|
||||||
@interface MPWorkflowSettingsController : MPViewController <MPPreferencesTab>
|
@interface MPWorkflowPreferencesController : MPViewController <MPPreferencesTab>
|
||||||
|
|
||||||
@property (weak) IBOutlet NSPopUpButton *browserPopup;
|
@property (strong) IBOutlet NSPopUpButton *browserPopup;
|
||||||
@property (weak) IBOutlet NSPopUpButton *doubleClickURLPopup;
|
@property (strong) IBOutlet NSPopUpButton *doubleClickURLPopup;
|
||||||
@property (weak) IBOutlet NSPopUpButton *doubleClickTitlePopup;
|
@property (strong) IBOutlet NSPopUpButton *doubleClickTitlePopup;
|
||||||
@property (weak) IBOutlet NSButton *updatePasswordOnTemplateEntriesCheckButton;
|
@property (strong) IBOutlet NSButton *updatePasswordOnTemplateEntriesCheckButton;
|
||||||
|
@property (strong) IBOutlet NSButton *hideAfterCopyToClipboardCheckButton;
|
||||||
|
|
||||||
- (IBAction)_showCustomBrowserSelection:(id)sender;
|
- (IBAction)_showCustomBrowserSelection:(id)sender;
|
||||||
|
|
||||||
@@ -20,18 +20,18 @@
|
|||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
//
|
//
|
||||||
|
|
||||||
#import "MPWorkflowSettingsController.h"
|
#import "MPWorkflowPreferencesController.h"
|
||||||
|
|
||||||
#import "MPSettingsHelper.h"
|
#import "MPSettingsHelper.h"
|
||||||
|
|
||||||
@interface MPWorkflowSettingsController ()
|
@interface MPWorkflowPreferencesController ()
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation MPWorkflowSettingsController
|
@implementation MPWorkflowPreferencesController
|
||||||
|
|
||||||
- (NSString *)nibName {
|
- (NSString *)nibName {
|
||||||
return @"WorkflowSettings";
|
return @"WorkflowPreferences";
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)viewDidLoad {
|
- (void)viewDidLoad {
|
||||||
@@ -40,6 +40,7 @@
|
|||||||
[self.doubleClickURLPopup bind:NSSelectedIndexBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyDoubleClickURLAction] options:nil];
|
[self.doubleClickURLPopup bind:NSSelectedIndexBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyDoubleClickURLAction] options:nil];
|
||||||
[self.doubleClickTitlePopup bind:NSSelectedIndexBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyDoubleClickTitleAction] options:nil];
|
[self.doubleClickTitlePopup bind:NSSelectedIndexBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyDoubleClickTitleAction] options:nil];
|
||||||
[self.updatePasswordOnTemplateEntriesCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyUpdatePasswordOnTemplateEntries] options:nil];
|
[self.updatePasswordOnTemplateEntriesCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyUpdatePasswordOnTemplateEntries] options:nil];
|
||||||
|
[self.hideAfterCopyToClipboardCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyHideAfterCopyToClipboard] options:nil];
|
||||||
[self _updateBrowserSelection];
|
[self _updateBrowserSelection];
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,6 +69,8 @@
|
|||||||
<string>https://github.com/MacPass/MacPass</string>
|
<string>https://github.com/MacPass/MacPass</string>
|
||||||
<key>MPPluginRepositoryURL</key>
|
<key>MPPluginRepositoryURL</key>
|
||||||
<string>https://macpassapp.org/data/plugins.json</string>
|
<string>https://macpassapp.org/data/plugins.json</string>
|
||||||
|
<key>NSAppleEventsUsageDescription</key>
|
||||||
|
<string>MacPass might use AppleEvents to perform Autotype functionality</string>
|
||||||
<key>NSHumanReadableCopyright</key>
|
<key>NSHumanReadableCopyright</key>
|
||||||
<string>Copyright © 2012-2019 HicknHack Software GmbH. All rights reserved.</string>
|
<string>Copyright © 2012-2019 HicknHack Software GmbH. All rights reserved.</string>
|
||||||
<key>NSMainNibFile</key>
|
<key>NSMainNibFile</key>
|
||||||
@@ -90,6 +92,8 @@
|
|||||||
</array>
|
</array>
|
||||||
<key>UTTypeDescription</key>
|
<key>UTTypeDescription</key>
|
||||||
<string>KDBX Database</string>
|
<string>KDBX Database</string>
|
||||||
|
<key>UTTypeIconFile</key>
|
||||||
|
<string>FileTypeIcon</string>
|
||||||
<key>UTTypeIdentifier</key>
|
<key>UTTypeIdentifier</key>
|
||||||
<string>com.hicknhack.macpass.kdbx</string>
|
<string>com.hicknhack.macpass.kdbx</string>
|
||||||
<key>UTTypeTagSpecification</key>
|
<key>UTTypeTagSpecification</key>
|
||||||
@@ -107,6 +111,8 @@
|
|||||||
</array>
|
</array>
|
||||||
<key>UTTypeDescription</key>
|
<key>UTTypeDescription</key>
|
||||||
<string>KDB Database</string>
|
<string>KDB Database</string>
|
||||||
|
<key>UTTypeIconFile</key>
|
||||||
|
<string>FileTypeIcon</string>
|
||||||
<key>UTTypeIdentifier</key>
|
<key>UTTypeIdentifier</key>
|
||||||
<string>com.hicknhack.macpass.kdb</string>
|
<string>com.hicknhack.macpass.kdb</string>
|
||||||
<key>UTTypeTagSpecification</key>
|
<key>UTTypeTagSpecification</key>
|
||||||
|
|||||||
10
MacPass/MacPass.entitlements
Normal file
10
MacPass/MacPass.entitlements
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>com.apple.security.automation.apple-events</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.security.cs.disable-library-validation</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@@ -31,6 +31,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
@property (copy, readonly) NSString *applicationName;
|
@property (copy, readonly) NSString *applicationName;
|
||||||
@property (copy, readonly, nullable) NSURL *applicationSupportDirectoryURL;
|
@property (copy, readonly, nullable) NSURL *applicationSupportDirectoryURL;
|
||||||
@property (nullable, readonly, weak) MPAppDelegate *mp_delegate;
|
@property (nullable, readonly, weak) MPAppDelegate *mp_delegate;
|
||||||
|
@property (readonly, nonatomic) BOOL isRunningTests;
|
||||||
|
|
||||||
- (NSURL *_Nullable)applicationSupportDirectoryURL:(BOOL)create;
|
- (NSURL *_Nullable)applicationSupportDirectoryURL:(BOOL)create;
|
||||||
- (void)relaunchAfterDelay:(CGFloat)seconds;
|
- (void)relaunchAfterDelay:(CGFloat)seconds;
|
||||||
|
|||||||
@@ -66,4 +66,13 @@
|
|||||||
return (MPAppDelegate *)self.delegate;
|
return (MPAppDelegate *)self.delegate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (BOOL)isRunningTests {
|
||||||
|
NSProcessInfo *processInfo = [NSProcessInfo processInfo];
|
||||||
|
NSString *testEnv = processInfo.environment[@"MPIsRunningTests"];
|
||||||
|
if(testEnv) {
|
||||||
|
return [testEnv isEqualToString:@"YES"];
|
||||||
|
}
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -22,16 +22,20 @@
|
|||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
FOUNDATION_EXPORT NSString *const MPErrorDomain;
|
FOUNDATION_EXPORT NSString *const MPDefaultErrorDomain;
|
||||||
|
FOUNDATION_EXPORT NSString *const MPAutotypeErrorDomain;
|
||||||
|
|
||||||
typedef NS_ENUM(NSInteger, MPErrorCodes) {
|
typedef NS_ENUM(NSInteger, MPErrorCodes) {
|
||||||
MPErrorNoPasswordOrKeyFile = 10000,
|
MPErrorNoPasswordOrKeyFile = 10000,
|
||||||
MPErrorInvalidPlugin
|
MPErrorInvalidPlugin,
|
||||||
|
MPErrorAutotypeIsMissingAccessibiltyPermissions,
|
||||||
|
MPErrorAutotypeIsMissingScreenRecordingPermissions
|
||||||
};
|
};
|
||||||
|
|
||||||
@interface NSError (Messages)
|
@interface NSError (Messages)
|
||||||
|
|
||||||
+ (NSError *)errorWithCode:(NSInteger)code description:(NSString *)description;
|
+ (NSError *)errorWithCode:(NSInteger)code description:(NSString *)description;
|
||||||
|
+ (NSError *)errorInDomain:(NSString *)domain withCode:(NSInteger)code description:(NSString *)description;
|
||||||
|
|
||||||
@property (nonatomic, readonly, copy) NSString *descriptionForErrorCode;
|
@property (nonatomic, readonly, copy) NSString *descriptionForErrorCode;
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,8 @@
|
|||||||
|
|
||||||
#import "NSError+Messages.h"
|
#import "NSError+Messages.h"
|
||||||
|
|
||||||
NSString *const MPErrorDomain = @"com.hicknhack.macpass.error";
|
NSString *const MPDefaultErrorDomain = @"com.hicknhack.macpass.error";
|
||||||
|
NSString *const MPAutotypeErrorDomain = @"com.hicknhack.macpass.error.autotype";
|
||||||
|
|
||||||
@implementation NSError (Messages)
|
@implementation NSError (Messages)
|
||||||
|
|
||||||
@@ -30,7 +31,12 @@ NSString *const MPErrorDomain = @"com.hicknhack.macpass.error";
|
|||||||
return [NSString stringWithFormat:@"%@ (%ld)", self.localizedDescription, self.code ];
|
return [NSString stringWithFormat:@"%@ (%ld)", self.localizedDescription, self.code ];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
+ (NSError *)errorInDomain:(NSString *)domain withCode:(NSInteger)code description:(NSString *)description {
|
||||||
|
return [[NSError alloc] initWithDomain:domain code:code userInfo:@{ NSLocalizedDescriptionKey: description }];
|
||||||
|
}
|
||||||
|
|
||||||
+ (NSError *)errorWithCode:(NSInteger)code description:(NSString *)description {
|
+ (NSError *)errorWithCode:(NSInteger)code description:(NSString *)description {
|
||||||
return [[NSError alloc] initWithDomain:MPErrorDomain code:code userInfo:@{ NSLocalizedDescriptionKey: description }];
|
return [NSError errorInDomain:MPDefaultErrorDomain withCode:code description:description];
|
||||||
|
|
||||||
}
|
}
|
||||||
@end
|
@end
|
||||||
|
|||||||
13
MacPass/NSTextView+MPTouchBarExtension.h
Normal file
13
MacPass/NSTextView+MPTouchBarExtension.h
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
//
|
||||||
|
// NSTextView+MPNSTextView_TouchBarExtension_h.h
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Veit-Hendrik Schlenker on 23.12.18.
|
||||||
|
// Copyright © 2018 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
|
@interface NSTextView (TouchBarExtension)
|
||||||
|
|
||||||
|
@end
|
||||||
17
MacPass/NSTextView+MPTouchBarExtension.m
Normal file
17
MacPass/NSTextView+MPTouchBarExtension.m
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
//
|
||||||
|
// MP.m
|
||||||
|
// MacPass
|
||||||
|
//
|
||||||
|
// Created by Veit-Hendrik Schlenker on 23.12.18.
|
||||||
|
// Copyright © 2018 HicknHack Software GmbH. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "NSTextView+MPTouchBarExtension.h"
|
||||||
|
|
||||||
|
@implementation NSTextView (TouchBarExtension)
|
||||||
|
|
||||||
|
- (NSTouchBar *) makeTouchBar {
|
||||||
|
return [self.window makeTouchBar];
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user