385 Commits

Author SHA1 Message Date
Michael Starke
9851a7b4e2 Use switch case. Localise user facing texts 2021-07-22 17:43:17 +02:00
Julius Zint
d1690d76d1 Extracted the logic for storing the encrypted compositekey into a
seperate class
2021-03-14 15:54:42 +01:00
Julius Zint
3c54cd9d7a Code refactoring to implement suggestions from the code review.
Binding the touchIdEnabled Buttons state directly to the userdefaults
value.

Fixed bug that disabled the TouchIdEnabled button on an unsucessfull
TouchId unlock
2021-02-21 12:48:04 +01:00
Julius Zint
4aa812740f Code refactoring to implement suggestions from the code review.
Renamed touchIdEnabled outlet to touchIdEnabledButton in preparation
to bind a variable to the state value.

Used SecKeyCreateRandomKey instead of SecKeyGeneratePair as suggested
by the headers.
2021-02-21 12:04:49 +01:00
Julius Zint
197a4145e8 Code refactoring to implement suggestions from the code review.
The fileURL for the current document does no longer have to be passed
in as a parameter but instead is retreived by accessing the windowControllers
document that hosts the MPPasswordInputController.

_touchIdHandleUnlockAttempt got renamed to _touchIdUpdateKeyForCurrentDocument
to better state its actual purpose and should no longer be called
on unsuccessfull unlock attempts. It also now removes stored keys if the
state of the TouchIdEnabled button has changed.

The key, that is derived from the document, is now the same whether it is
used to store it in the transient dictionary or the userdefaults
2021-02-21 11:27:41 +01:00
Julius Zint
88a5af995e Small layout changes. This prevents the error message overlapping
the TouchID enabled button.
2021-02-14 17:58:06 +01:00
Julius Zint
7b79c0b814 Added tooltip to TouchID enabled button. This is a first attempt
to make it better to understand what the mixed state is all about.
2021-02-14 17:56:29 +01:00
Julius Zint
c5e30a0fa0 The TouchID keypair can no be removed from the macOS keychain
This is a good feature for security and stability. It gives users
the option to prevent TouchID unlock for any previously unlocked
database and it is also helpful in cases where only one part of the
keypair is in the macOS keychain.
2021-02-14 17:40:11 +01:00
Julius Zint
9d058f9d15 Explicitly setting the keychain-access-groups. In these groups Keychain
items can be shared. If left empty, Xcode inserts the AppID prefix with
a wildcard.
2021-02-14 10:00:15 +01:00
Julius Zint
33907e07d6 Removed script buildstep that is no longer needed 2021-02-14 10:00:15 +01:00
Julius Zint
02b3fc2945 Fixed errors while rebasing to latest master 2021-02-14 10:00:15 +01:00
Julius Zint
484b5e4acd Added a flag to support unlocking the database with the apple watch as well as TouchID 2021-02-14 10:00:15 +01:00
Julius Zint
82558936da Fixed typo 2021-02-14 10:00:15 +01:00
Julius Zint
92a120c405 Support for persistent TouchID unlock.
While originally not intended, this changeset enables MacPass to
unlock a database with TouchID even after the process is completly
wiped.

It does this by introducing multiple modes of operation.

First:  TouchId can be completly disabled. The TouchID checkbox is off
        and MacPass works like the TouchID feature had never been added.

Second: The TouchID checkbox gets put into the mixed state. MacPass will now
        remember the database key in memory as long as the process remains
	alive and the database can be unlocked with TouchID until the
	applications terminates.

Third: The TouchID checkbox is checked and MacPass will store the encrypted
       database key on a successfull unlock attempt in the standard
       userdefaults. TouchID unlock works now even after MacPass is completly
       terminated and restarted.
2021-02-14 10:00:15 +01:00
Julius Zint
3fc73a7fd9 Switched Encryption algorithm to support larger message texts.
kSecKeyAlgorithmRSAEncryptionOAEPSHA256AESGCM is now used. Apples CryptoKit makes
it very easy to use asymmetric cryptography to encrypt a symmetric key and with it
encrypt a message. So now the Database key material is no longer directly encrypted
with the asymmetric key but with a randomly generated symmetric one.
2021-02-14 10:00:15 +01:00
Julius Zint
431b636057 Switched to archiving the complete composite key for TouchID unlock 2021-02-14 10:00:15 +01:00
Julius Zint
51bdf12198 MPPasswordInputController completion callback refactoring
Changed the completion callback definition to take a KPKCompositeKey pointer
instead of a password string and keyfile URL. This is a intermedate step to
support key files with TouchID unlock. The next step is to make
KPKCompositeKey conform to the NSCoding protocol. The serialized data can
then be stored instead of the password.
2021-02-14 10:00:15 +01:00
Julius Zint
700dd43282 TouchID unlock is now optional
Added a CheckBox to the PasswordInput view, so the user can see and
manipulate, whether the TouchID feature is enabled or disabled. The
choice is remembered in the standard user defaults.
2021-02-14 10:00:15 +01:00
Julius Zint
5157ec823f Enables TouchID unlock for multiple Database files.
This changeset adds the optional fileURL parameter to the
requestPasswordWithMessage function in MPPasswordInputController.
The controller uses this URL as a key to store the encrypted
masterpassword in a dictionary.

In my opinion edge cases like when a file is moved or replaced
do not have to get special handling since the worst case scenario
is that TouchID unlock does not work and users have still the
option to unlock with the masterpassword.

Also this changeset removes the unused
requestPasswordWithCompletionHandler function
2021-02-14 10:00:15 +01:00
Julius Zint
94956a673b fixed typos 2021-02-14 10:00:15 +01:00
Julius Zint
4e56740577 Added necessary entitlement and additional buildstep
Enabled the "Keychain Sharing" Entitlement that is required for
the Keychain APIs to work properly.

The additional buildstep signs the KissXML.framework nested inside
the KeePassKit.framework before this Framework itself is signed and
embedded. This is necessary because, to my knowledge, Xcode does not
support signing nested frameworks.
2021-02-14 10:00:15 +01:00
Julius Zint
a7b8be1886 TouchID unlock Feature for MacPass.
To use it a user must first enter the correct password for the database.
If the unlock succeeds, the supplied password is encrypted with the public
part of a RSA keypair. On subsequent unlocks a TouchID button appears. If
clicked, MacPass queries the Keychain for the private key part and uses it to
decrypt the previously supplied password and tries to unlock the database
with it.
2021-02-14 10:00:15 +01:00
Michael Starke
4addd907d4 Directly set cell class for HNUISecureTextField 2021-02-10 20:21:20 +01:00
Michael Starke
7ef88b7e88 Fixed duplicated entry not being selected in in entry table view. 2021-02-10 15:47:13 +01:00
Michael Starke
b19a79095a Added settings to disable password generation for newly created entries. Fixes #1050 2021-02-10 15:45:41 +01:00
Michael Starke
cc982f2395 Added column to display creation date. Fixed #1150 2021-02-10 14:39:48 +01:00
Michael Starke
fa1094632e Using SFSymbols where possible instead of custom icons 2021-02-03 20:29:57 +01:00
Michael Starke
d0f8c3eafb Added second image store to retrieve SF symbols on supported systems 2021-02-03 19:18:53 +01:00
Michael Starke
51f3d6627f Code style. Removed unused info icon, switched to framework template for sidebar icon 2021-02-03 19:16:17 +01:00
Michael Starke
c50598b8a0 Changed to run only once at 23:00 2021-02-01 20:27:14 +01:00
Michael Starke
e7a5eab982 Created nightly action to migrate from TravisCI 2021-02-01 20:23:31 +01:00
Michael Starke
5e10d3712e Fixed content resizing issues 2021-01-28 20:41:20 +01:00
Michael Starke
04b8e221cb Minor UI change 2021-01-28 13:55:25 +01:00
Michael Starke
059c794b9b Fixed minor autolayout issues on change password window 2021-01-27 18:02:51 +01:00
Michael Starke
0078fae707 Updated german localizations 2021-01-27 17:42:24 +01:00
Michael Starke
76906972f2 Updated to current Xcode. 2021-01-27 17:27:59 +01:00
Michael Starke
98bb204a2f Added missing localizations 2021-01-27 17:27:52 +01:00
Michael Starke
fa08e22cf3 Finished error display in password change sheet 2021-01-27 17:27:45 +01:00
Michael Starke
5457d4dde0 Converted password change window to use NSGridView.
Errors are displayed if a KeePass database is selected as key file.
Password and key errors are now displayed separatly
2021-01-26 21:20:52 +01:00
Dominik Roszkowski
e4fadce3d0 Update Polish translation (#1141) 2021-01-20 13:43:28 +01:00
olieydt
ea9f41bfef Small typo in Localizable.strings (#1134) 2021-01-15 22:30:36 +01:00
Michael Starke
e27526b399 Fix crash when load Argon2id Databases. 2021-01-15 12:58:45 +01:00
Michael Starke
b58d5179a2 Fixed typo in notification varibale 2021-01-13 15:15:23 +01:00
Michael Starke
399cf44d45 Clarified things to do to get async saving to work 2021-01-13 15:12:54 +01:00
Michael Starke
797733130f Fixed regression introduced with e3352efe49 resulting in no password display after reverting a document 2021-01-12 17:36:50 +01:00
Michael Starke
bb3df31d4f Updated localisations. Enabled time slice stepper 2021-01-11 18:18:00 +01:00
Michael Starke
e3b3014084 Updated copyright to 2021 2021-01-11 15:51:40 +01:00
Michael Starke
8496ae20cf Updated sponsors and copyright year 2021-01-11 15:51:24 +01:00
Michael Starke
58399d66be WIP on setup view update 2021-01-11 15:36:43 +01:00
Michael Starke
95da40de44 Explicitly call for isMemberOf to prevent subclasses form being a false-positive 2021-01-11 15:35:54 +01:00
Michael Starke
df7b68b019 Added another update source 2021-01-08 11:57:37 +01:00
Michael Starke
21b0e4c0f2 Minor updates to view update. 2021-01-08 09:08:02 +01:00
Michael Starke
57601798bd Codestyle 2021-01-08 09:07:39 +01:00
Michael Starke
de0319abae Added API to create QR Code images. 2021-01-08 09:07:30 +01:00
Michael Starke
fd88b2c506 Fixed code style. Removed unused code. 2021-01-08 09:06:59 +01:00
Michael Starke
b6df969bf4 TOTPSetup tries to fill itself with values provided by the current entry 2021-01-05 21:32:22 +01:00
Michael Starke
62032cd7d0 Updated to current KeePassKit. Fixed nil assertion when using invalid OTP parameters 2021-01-05 18:12:28 +01:00
Michael Starke
8c017e65c2 Fixed issue resulting in confirmation dialog being displayed if not matches where found. 2021-01-05 15:41:58 +01:00
Michael Starke
15dce5f0b6 Removed fill size window content to fix a lot of toolbar issues 2021-01-05 15:05:22 +01:00
Michael Starke
d22750fefc Intoduced disclosure on QR Code input 2021-01-05 14:35:44 +01:00
Michael Starke
f25db6b418 Fixed regression of newly created entry not being properly selected 2021-01-04 20:49:48 +01:00
Michael Starke
f010ec057d Minor layout changes 2021-01-04 20:49:34 +01:00
Michael Starke
57c3d558f3 Better run-time checks for QRCode scanning 2021-01-04 19:40:08 +01:00
Michael Starke
90093850f9 Use expanded toolbar to accomodate for more room in the title bar. 2021-01-04 16:03:47 +01:00
Michael Starke
6bd6c65dfa Minor improvements for the TOTP setup layout 2020-12-31 21:47:09 +01:00
Michael Starke
ac20664b7a Updated project settings 2020-12-31 21:46:51 +01:00
Michael Starke
7a4d80fd47 OTP setup view controller gets show and parses url strings 2020-12-31 20:23:45 +01:00
Michael Starke
06413b26df Reverted changes for context bar view since the layout was broken 2020-12-30 22:27:13 +01:00
Michael Starke
53ae6dca84 Revert "Added height for context bar"
This reverts commit 4fabee0213.
2020-12-30 22:24:43 +01:00
Michael Starke
4fabee0213 Added height for context bar 2020-12-27 13:40:37 +01:00
Michael Starke
90a0aef2cc Wired up TOTPSetup pop over 2020-12-23 01:33:53 +01:00
Michael Starke
9fe9c6a41d Localized Autotype confirmation. Enhanced layout for window
When confirming, the table view only shows one row, when choosing, at most 5 rows are visible.
2020-12-22 23:42:50 +01:00
Michael Starke
68ccb8e1ad First UI for TOPT setup view 2020-12-21 22:49:27 +01:00
Michael Starke
acd2e1bc0f Fixed missing password colorization 2020-12-21 22:48:57 +01:00
Michael Starke
18e2115119 Updated sponsors 2020-12-20 14:03:22 +01:00
Michael Starke
d466c6d026 Updated localizations. Added edit button to TOTP view 2020-12-18 13:43:14 +01:00
a2y4
a58766146f Add Japanese translation files. (#1100)
* Add Japanese translation files.

* Update translations
2020-12-17 13:09:59 +01:00
Anton Glezman
dc31a81d48 Updated russian localization (#1114) 2020-12-17 13:07:35 +01:00
Andreas Kromke
48491c0712 German localisation improved, one typo in US localisation corrected (#1119)
* Update AutotypeCandidateSelectionView.strings

typos, missing localisation

* Update AutotypeDoctorReportViewController.strings

localisation improved

* Update DatabaseSettingsWindow.strings

localisation improved

* Update EntryInspectorView.strings

localisation improved

* Update GeneralPreferences.strings

localisation improved

* Update GroupInspectorView.strings

unclear if Autotype or Auto-Type, but at least should be consistent

* Update IconSelection.strings

localisation improved

* Update InfoPlist.strings

localisation improved

* Update IntegrationPreferences.strings

localisation improved

* Update Localizable.strings

localisation improved

* Update Localizable.strings

typo

* Update MainMenu.strings

localisation improved

* Update OpenPanelAccessoryView.strings

localised

* Update ReferenceBuilderView.strings

localisation improved

* Update PasswordCreatorView.strings

localisation improved

* Update PluginDataView.strings

localisation improved

* Update MainMenu.strings

localisation improved

* Update Localizable.strings

translations should be consistent

* Update Localizable.strings

consistency

* Update Localizable.strings

consistency

* Update Localizable.strings

consistency

* Update IntegrationPreferences.strings

consistency

* Update GroupInspectorView.strings

consistency

* Update EntryInspectorView.strings

consistency
2020-12-17 13:07:21 +01:00
Michael Starke
b98b5635d5 Use simple counter display instead of progress bar. 2020-12-17 01:52:52 +01:00
Michael Starke
fa85da3f82 Removed custom OTP entry category since KeePassKit now has all we need 2020-12-12 14:00:33 +01:00
Michael Starke
bb73628484 Enabled Time OTP display. 2020-12-11 17:51:09 +01:00
Michael Starke
baaf10d6f3 Added QR code scanner tooling for use in OTP auth URLs 2020-12-10 21:02:22 +01:00
Michael Starke
4caea9080e Correctly scale down image if they are portrait not only landscape 2020-12-02 23:45:59 +01:00
Michael Starke
1e43e608ed Use newest Xcode version on travis 2020-12-02 17:42:36 +01:00
Michael Starke
b04c252a69 Display screenshot of target window in autotype confirmation/selection dialog. 2020-12-02 17:34:17 +01:00
Michael Starke
03c1d5ecee Add setting to always show confirmation before autotype execution 2020-12-02 17:33:40 +01:00
Michael Starke
0f7604ac88 Removed unused key 2020-12-02 17:33:12 +01:00
Michael Starke
784afaee97 Add windowID to info dictionary 2020-12-02 17:33:01 +01:00
Michael Starke
e99f2e2619 Updated to current KeePassKit 2020-12-02 17:32:47 +01:00
Michael Starke
1c76e50192 Adopted KeePassKit attribute keys and stripped our custom ones 2020-12-01 13:38:34 +01:00
Michael Starke
9716bfc8e8 Deleted unused header file 2020-11-30 15:44:36 +01:00
Michael Starke
e08b116aa0 WIP on adding TOTP ui to entry view 2020-11-28 23:10:45 +01:00
Michael Starke
7c9460d027 Converted to class properties and modern obj-c syntax 2020-11-26 12:08:32 +01:00
Michael Starke
3807b0a0b7 Added tooling for OTP handling to KPKEntry 2020-11-26 12:08:17 +01:00
Michael Starke
65626e3b11 Fixed wrong selector in Test 2020-11-25 15:32:42 +01:00
Michael Starke
e2b35c6552 Moved to non-deprecated archiving 2020-11-25 15:32:33 +01:00
Michael Starke
501501fce1 Enable full size content for better big sur experience 2020-11-24 13:37:03 +01:00
Michael Starke
381d4b1cac Updated to current KeePassKit to enable correct builds on Apple Silicon 2020-11-23 13:52:29 +01:00
Michael Starke
c4d7025163 Updated deprecated values 2020-11-12 11:03:23 +01:00
Michael Starke
301ab03266 Moved to NSFilePromiseProvider API for attachment table view 2020-11-09 19:23:28 +01:00
Michael Starke
8407186a38 Removed unused colours. Adjusted blue and orange to be more readable 2020-11-09 18:26:45 +01:00
Michael Starke
c0a64a1bc3 Enabled always verify autotype match settings. UI is missing for this setting 2020-11-04 18:25:32 +01:00
Michael Starke
8e3bca062b Fixed regression in Preferences preventing willShowTab and didShowTab from being called. 2020-11-03 17:08:09 +01:00
Michael Starke
927a4bf86e Updated to Xcode 12.1 2020-11-03 11:38:11 +01:00
Michael Starke
e82e2fe4a2 Revert "Adjusted checks for auto-type permissions"
This reverts commit 7095d55670.

# Conflicts:
#	MacPass/MPAutotypeEnvironment.h
#	MacPass/MPAutotypeEnvironment.m
2020-11-03 11:15:50 +01:00
Michael Starke
499b7fdd6b Updated to public KeePassKit version 2020-10-19 00:02:00 +02:00
Michael Starke
0f2300a981 Added target application icon to candidate selection window 2020-10-12 16:07:45 +02:00
Michael Starke
9d153a4397 Updated to Xcode 12 2020-10-08 23:29:13 +02:00
Michael Starke
2ad4bd2abc correctly set global autotype on initailizer 2020-10-08 23:28:54 +02:00
Michael Starke
bda0a25fe0 Updated to current KeePassKit.
This requires to link and copy KissXML since KeePassKit does not contain it anymore to fix nesting issues with Carthage
2020-09-24 16:59:48 +02:00
Michael Starke
7095d55670 Adjusted checks for auto-type permissions
We do not need to check for screen recording permissions, if auto-type is executed. Only global auto-type requires screen recording permissions and should check for them.
2020-09-21 17:44:15 +02:00
Michael Starke
e4946bd91b Temporary switch to local development branch 2020-09-09 10:44:03 +02:00
Michael Starke
0913aba1cf Updated Xcode checks 2020-09-09 10:44:03 +02:00
Michael Starke
6b10539a3f Use properties. 2020-09-09 10:44:03 +02:00
Michael Starke
c4d9c10cb8 Enabled display of prettified passwords ind password generator and entry inspector 2020-09-09 10:44:03 +02:00
Michael Starke
badd22793d Use automatic row height to allow for multi-line custom fields 2020-09-09 10:44:03 +02:00
Michael Starke
e03660b184 Fixed issue with first entry being displayed in inspector when a group is clicked. 2020-09-09 10:44:03 +02:00
Michael Starke
768f49ab0b Removed unused code 2020-09-09 10:44:03 +02:00
Michael Starke
18c7930dba Use property instead of method 2020-09-09 10:44:03 +02:00
Michael Starke
f626266fa7 Updated to current KeePassKit 2020-09-09 10:44:03 +02:00
Vyacheslav Pukhanov
171d6e4bdc adjusted welcome view layout (#1101) 2020-09-09 10:43:34 +02:00
Hugo Stijns
af65d4029b Update organization in GitHub URL (#1105) 2020-09-09 10:39:16 +02:00
Michael Starke
4e8e9279d3 ordered files by name 2020-07-13 15:46:46 +02:00
Michael Starke
077d5412a4 Fixed typo in comment 2020-07-10 23:48:32 +02:00
Michael Starke
6f1fcad0ca Added override sequence to autotype environment 2020-07-10 16:24:44 +02:00
Michael Starke
c759aeddd9 Changed API for pasteboard to only use a single object. Arrays aren't required. Added concealed/transient type marker to copied items to enhance compatibility with clipboard managers 2020-07-10 15:37:25 +02:00
Michael Starke
641ba2a3fd Updated constraints on preferences views to allow for better transitions between tabs 2020-07-10 12:24:24 +02:00
Michael Starke
be2b5072bf Removed special code for 10.12 and blow since we now target 10.13 and above 2020-07-08 22:11:34 +02:00
Michael Starke
c5694293a5 Removed custom toolbar sizing code since we seem not to need it anymore 2020-07-08 15:38:02 +02:00
Michael Starke
1404f9e336 Removed unneded code for control size settings 2020-07-08 15:22:04 +02:00
Michael Starke
f19fd2e3ac Added sponsor to credits 2020-07-08 15:20:32 +02:00
Thomas
01f7f2baa0 Initial zh-Hant translation (#1065)
* Create AutotypeBuilderView.strings

* Create AutotypeCandidateSelectionView.strings

* Create AutotypeDoctorReportViewController.strings

* Create ContextBar.strings

* Create DatabaseSettingsWindow.strings

* Create DatePickingView.strings

* Create DuplicateEntryOptionsWindow.strings

* Create EntryInspectorView.strings

* Create GeneralPreferences.strings

* Create GroupInspectorView.strings

* Create IconSelection.strings

* Create InfoPlist.strings

* Create InspectorView.strings

* Create IntegrationPreferences.strings

* Create Localizable.strings

* Create Localizable.stringsdict

* Create MainMenu.strings

* Create PasswordCreatorView.strings

* Create PasswordEditWindow.strings

* Create PasswordInputView.strings

* Create PluginDataView.strings

* Create PluginPreferences.strings

* Create PluginRepositoryBrowserView.strings

* Create ReferenceBuilderView.strings

* Create SavePanelAccessoryView.strings

* Create UpdatePreferences.strings

* Create WelcomeView.strings

* Create WorkflowPreferences.strings
2020-07-06 11:35:44 +02:00
Michael Starke
6aef0b198d Removed wrong added attribute since it will interfere with the added custom-values table view 2020-07-01 17:29:18 +02:00
Michael Starke
d00048a7d7 Removed unnecessary constraints from labels and buttons 2020-07-01 15:50:20 +02:00
Michael Starke
4ba40b1d77 Added lost constraint 2020-07-01 15:38:50 +02:00
Michael Starke
58cc929ad9 Using stack view in preparation of hiding empty elements in entry view 2020-07-01 14:34:59 +02:00
Michael Starke
431f9ce22c Fixed broken API contract of returned nil value for non-nil behaviour. Now returning empty dictionary instead 2020-07-01 14:34:29 +02:00
Michael Starke
8f4f3f7053 Use assert to silence compiler warning and remove noise diagnotics pragma 2020-07-01 14:33:27 +02:00
Michael Starke
fe7c647bcf Added custom MPTabViewController to resize window to tab sizes on change 2020-06-30 23:49:06 +02:00
Michael Starke
208c3e6c31 Moved to using NSTabViewController for preferences instead of rolling our own implementation 2020-06-30 13:59:54 +02:00
Modo Ltunzher
da795b52de Ukrainian translations (#1076)
* Ukrainian translations

* Typo fixes. Kudos to @troyane

* Fix typo in DEFAULT_GROUP_NAME

* Fix typos

Applied fixes in Localizable.strings, MainMenu.strings, PasswordCreatorView.strings, PluginPreferences.strings.

Co-authored-by: Nazar Gerasymchuk <troyan3@gmail.com>
2020-05-20 13:40:38 +02:00
Alex Rakov
c4fe593e8f Use DuckDuckGo favicon service (#1073)
* Use DuckDuckGo favicon service

There are multiple ways of how favicon of a website can be published:
- Have a `favicon.ico` file under the website root
- Set through `<link rel="shortcut icon" href="..." />` tag
- Set through `<link rel="icon" href="..." />` tag, or
- Set through platform-specific tags like `<link rel="apple-touch-icon" href="..." />`

Current implementation only supports first option, which does not work in many cases.

Instead of implementing favicon fetching logic from scratch, favicon fetching services can be used.
There are multiple of them, e.g.:
- https://icons.duckduckgo.com/ip3/www.google.com.ico
- https://www.google.com/s2/favicons?domain=www.google.com

This change switched from fetching favicon from the original host to DuckDuckGo.

* Create UX for favicon download method preferences

* Add preferences for favicon download method

* Adjust preferences window location

Also, sort localized resources

Co-authored-by: Alex Rakov <alexander-rakov@users.noreply.github.com>
2020-05-15 19:37:52 +02:00
Michael Starke
67eee29fdf Fixed regression that resulted in firstResponders not getting correctly updated on view changes 2020-05-12 14:13:04 +02:00
Michael Starke
0617b0e601 Update to newer file version 2020-05-12 14:13:04 +02:00
Michael Starke
85ba893724 Clarified commented code 2020-05-12 14:13:04 +02:00
Gilles Debunne
96f6b157c7 Fix typo (#1071) 2020-05-12 13:59:36 +02:00
Michael Starke
2d7a01df10 Merge branch 'release/0.7.12' 2020-03-25 21:48:07 +01:00
Michael Starke
99ea0d7a14 Versioning now respects builds from release branches 2020-03-25 21:12:33 +01:00
Michael Starke
d7f6bcc6c3 Tags are now search case insensitive (fixes #1048)
The issue was that the tags string array was not correctly searched case insensitive via the predicate CONTAINS
2020-03-25 21:03:28 +01:00
Michael Starke
0df8eba2b6 Tags are now search case insensitive (fixes #1048)
The issue was that the tags string array was not correctly searched case insensitive via the predicate CONTAINS
2020-03-20 17:24:33 +01:00
Michael Starke
16ca18623e Removed double function calls 2020-03-20 17:05:37 +01:00
Michael Starke
417540d272 Added Focus Proxy as skippable window title 2020-03-20 17:05:37 +01:00
Michael Starke
7b2b17e42a Filter window titles and skip wellknown false positives 2020-03-20 17:05:37 +01:00
Michael Starke
e63ea8c110 Fixed low contrast in Autotype candidate selection window (fixes #1054) 2020-03-20 00:08:12 +01:00
Michael Starke
afc0e637f1 Merge branch 'hotfix/fix-missing-key-selection-in-change-password-dialog'
# Conflicts:
#	MacPass.xcodeproj/project.pbxproj
2020-03-20 00:07:10 +01:00
Chester Liu
ee7d1df3c3 Update zh-Hans localization (#1058) 2020-03-19 12:44:52 +01:00
Michael Starke
3731e92339 Bumped version 2020-03-17 11:51:12 +01:00
Benjamin Blonde
f609ba9795 Update french localizations (#1047)
- Add 121 missing translations
- Tweak few old translations

Co-authored-by: Michael Starke <michael.starke@hicknhack-software.com>
2020-03-17 11:50:00 +01:00
Bartłomiej Jakub Kwiatek
64ad7d9c08 Updated polish localization (#1042)
Co-authored-by: Bartlomiej.Kwiatek <bartlomiej.kwiatek@vml.com>
2020-03-17 11:50:00 +01:00
Michael Starke
8b3cc34ab5 Fixe missing custom cell in MPPathControl 2020-03-17 11:48:06 +01:00
Michael Starke
0662a729a0 Merge branch 'feature/nssplitview_to_nssplitviewcontroller' 2020-03-11 07:24:39 +01:00
Benjamin Blonde
c5d5b6c787 Update french localizations (#1047)
- Add 121 missing translations
- Tweak few old translations

Co-authored-by: Michael Starke <michael.starke@hicknhack-software.com>
2020-03-11 07:15:13 +01:00
Bartłomiej Jakub Kwiatek
406cb0f6c0 Updated polish localization (#1042)
Co-authored-by: Bartlomiej.Kwiatek <bartlomiej.kwiatek@vml.com>
2020-03-11 07:13:41 +01:00
Michael Starke
e6cb17caf6 Removed unnecessary identifier 2020-02-05 11:47:11 +01:00
Michael Starke
c277d3f001 Fixed NSSplitView not restoring its state by moving to viewWillLayout 2020-02-05 11:44:52 +01:00
Michael Starke
d6c8674d7b retain window size when content view does change 2020-02-04 23:15:57 +01:00
Michael Starke
d946e80e65 Fixed deprecation warnings 2020-02-03 18:07:38 +01:00
Michael Starke
55fca262ef Fixed more deprecations 2020-02-03 18:06:21 +01:00
Michael Starke
2f42e1498c Updated submodule to fix deprecation warnings 2020-02-03 17:53:21 +01:00
Michael Starke
0e5caab72a Fixed deprecation warnings 2020-02-03 17:51:59 +01:00
Michael Starke
e3352efe49 Using NSSplitViewController for main split view. 2020-01-31 16:30:13 +01:00
Michael Starke
b028ef51f9 Updated localization 2020-01-28 10:44:31 +01:00
Michael Starke
ae9278c4b5 Added privacy usage descriptions for all folders to enhance macOS 10.15 Catalina experience 2020-01-28 10:39:15 +01:00
Michael Starke
86d4defc78 Removed ad-hoc signing 2020-01-28 10:28:49 +01:00
Michael Starke
c85a9cdce1 Fixed autotype regression preventing self-autotyping. Added re-hiding for special placeholders 2020-01-28 10:28:42 +01:00
Michael Starke
9409887942 Introduced direct signing of all parts since --deep did not sign Autoupdate and fileop in Sparkle.framework 2020-01-28 09:41:07 +01:00
Michael Starke
40c62954e4 Removed special code signing id for macOs which caused Xcode to choke on the project 2020-01-28 09:40:18 +01:00
Michael Starke
c6f93ef59a Updated copyright to 2020 2020-01-27 12:25:13 +01:00
Michael Starke
5eef186ab2 Updated contributors 2020-01-27 10:30:36 +01:00
Michael Starke
6c60d72ef9 Update CONTRIBUTE.md 2020-01-27 10:24:25 +01:00
Michael Starke
217b311783 Update CONTRIBUTE.md 2020-01-27 10:24:17 +01:00
Michael Starke
8cd5273082 Added download option for XLIFF files 2020-01-27 10:23:44 +01:00
Michael Starke
3e8a320598 Updated german localization 2020-01-24 12:10:58 +01:00
Michael Starke
0197bdc5bc Added missing english localization 2020-01-24 11:43:36 +01:00
Michael Starke
a425acea4d Updated english localization 2020-01-24 11:41:45 +01:00
Michael Starke
c4222a3159 Fixed regression resulting in auto-type never timing out. 2020-01-24 11:39:42 +01:00
Michael Starke
bd0fe6baf8 Updated localizations 2020-01-24 09:37:06 +01:00
Michael Starke
b2999ca8a8 Merge branch 'feature/refactor_autotype' 2020-01-22 15:11:41 +01:00
Michael Starke
77d96976ec Refactored Autotype to use environment for better encapsulation of parameters 2020-01-22 15:11:28 +01:00
Michael Starke
a4b9b0be8b Formatting 2020-01-22 10:13:33 +01:00
Michael Starke
8e52da7069 Better placeholder for search field to clarify location of the search. Also made the search field larger. 2020-01-21 15:27:38 +01:00
Michael Starke
228170c717 Center search in 10.14 and above, keep it "centerish" in older systems 2020-01-21 15:12:25 +01:00
Michael Starke
2216a14729 Broken WIP commit 2020-01-21 14:38:52 +01:00
Michael Starke
77f3f23cfe Use class property 2020-01-15 13:00:14 +01:00
Michael Starke
07ae4675d4 Fixed typos in localization 2020-01-15 13:00:06 +01:00
Michael Starke
f2279863db removed unnecessary method 2020-01-15 12:59:39 +01:00
Michael Starke
df68d0140f Updated localizations 2020-01-15 12:59:29 +01:00
Michael Starke
1b6efbfd0c Added sanity checks to key file selection in unlock screen (fixes #1008) 2020-01-14 14:54:15 +01:00
Michael Starke
626bb35f80 Re-hide MacPass if it was shown only for autotype candidate selection (fixes #964) 2020-01-13 13:46:24 +01:00
Michael Starke
e6bb9ad191 use class propeties 2020-01-13 12:07:43 +01:00
Michael Starke
4cfe54b65c Updated documentation on export plugin 2020-01-10 15:01:53 +01:00
Michael Starke
2b2e5ddbea Merge branch 'feature/import_plugins' 2020-01-10 10:47:59 +01:00
Michael Starke
334451471e Removed delayed write of preview files to fix missing preview in macOs 10.15 Catalina (fix #1016) 2020-01-10 10:47:11 +01:00
Michael Starke
4069052c86 Using class properties 2020-01-10 10:43:13 +01:00
Michael Starke
7be5190ada Updated comments 2020-01-10 10:42:58 +01:00
Michael Starke
7a1510b77b Using Carthage setup for TransformerKit 2020-01-08 15:23:36 +01:00
Michael Starke
f16c767cbd Use textual date picker instead of graphical one. Fixes #923 2019-12-18 15:45:00 +01:00
Michael Starke
3f76188bf5 Modern objective C 2019-12-18 15:44:26 +01:00
Michael Starke
1215b7317b Merge branch 'master' into feature/import_plugins
# Conflicts:
#	MacPass.xcodeproj/project.pbxproj
2019-12-17 16:27:43 +01:00
Michael Starke
e5ba73589b Cleaned up merge of LockOnScreenSleep feature. Updated fonts 2019-12-17 14:18:24 +01:00
georgesnow
9ba902471c Add Lock database on Screen Sleep (#998)
* added lock databse on Screen sleep

* remove unneeded change

* fix unregister screen sleep method

* fixed constraints and checkbox label
2019-12-17 13:59:01 +01:00
Michael Starke
b1568c5eef Using documented way to create temporary folders for storing preview content (#1016) 2019-12-17 13:47:15 +01:00
Michael Starke
8535579de2 Updated to Xcode 11 2019-12-13 11:18:34 +01:00
Michael Starke
6ec89e146c Merge branch 'refs/heads/master' into feature/import_plugins 2019-11-27 23:05:46 +01:00
Michael Starke
09a7a15141 Altered screen recording check to Craig Hockenberry's solution 2019-11-27 12:02:45 +01:00
Michael Starke
9b77790ddc Use blog based api instead of block one to track down macOS 10.15 bug 2019-11-22 16:30:21 +01:00
Anton Glezman
16cdd4dd4f Fixed overlay window image color (#999)
* Fixed overlay window image color

* Fixed color property
2019-11-07 20:43:23 +01:00
Michael Starke
0a7fcc415c Disabled currently unused context button for add fields button (fixes #995) 2019-11-04 16:11:44 +01:00
Michael Starke
ff72632b3b Do show info when no recent documents are present in Welcome Window (fixes #996) 2019-11-04 16:08:24 +01:00
Michael Starke
b6a7240534 Bumped version. Ensure versioning is always done after Info.plist was copied. 2019-11-04 15:48:36 +01:00
Michael Starke
f10735f96f Changed screen recording detection to use "at least one window name should be present) 2019-11-04 15:47:54 +01:00
Michael Starke
ba538d05af note to use xmllint to check for notarization status 2019-11-04 15:45:34 +01:00
Michael Starke
3639913e6d Re-added english localization for Info.plist since it seems to break on macOS 10.15 2019-11-04 12:38:34 +01:00
Michael Starke
b87e20ca7e prepare release now works 2019-11-04 10:38:45 +01:00
Michael Starke
c7bdce46ff first stab at a automated release 2019-11-01 16:07:42 +01:00
Michael Starke
11bea5fa32 Removed magic numbers 2019-11-01 16:07:42 +01:00
Michael Starke
e8a6af086c Using cancelOperation: since this is called by pressing the Esc key. 2019-11-01 16:07:42 +01:00
Michael Starke
f1033c1006 Use properties 2019-11-01 16:07:42 +01:00
Anton Glezman
264866dff0 Fixed missed localizations (#990)
Thank you very much!
2019-11-01 14:43:39 +01:00
Oleksandr Yakubchyk
631741d30b Fixed #945 Cancel search mode while the search field is empty (#946) 2019-10-30 16:02:06 +01:00
Michael Starke
6897f9e51c Added Github sponsorship details 2019-10-30 14:50:46 +01:00
Michael Starke
21a5b5d6bb Using class properties 2019-10-30 10:29:23 +01:00
Michael Starke
3817bf503f Fixed re-setting of url copy or open after each application launch (fixes #989) 2019-10-30 10:14:37 +01:00
Michael Starke
2beb033572 Updated contributors 2019-10-28 17:03:04 +01:00
Michael Starke
d7b016e5ef Bumped to 0.7.10 2019-10-28 15:06:15 +01:00
Michael Starke
46b6ab3925 Added entitlements file for codesigning 2019-10-28 14:18:15 +01:00
Michael Starke
c5ed3c42e6 Updated Sparkle to 1.22.0 2019-10-09 17:31:56 +02:00
Michael Starke
00d69d5bad Update FUNDING.yml 2019-09-17 13:57:32 +02:00
Michael Starke
fa58c7e423 Create FUNDING.yml 2019-09-17 13:55:23 +02:00
Michael Starke
f134290c27 wired up button to actually do something 2019-09-17 13:08:29 +02:00
Michael Starke
3b244c3145 Added button to initiate screen recording permission request on macOS 10.15 Catalina 2019-09-10 14:47:56 +02:00
Michael Starke
541ef6e749 Added correct system preferences url to open screen capture privacy pane 2019-09-10 14:12:54 +02:00
Michael Starke
eb9d15ffa5 Use enter to accept a field in PICKFIELD view 2019-09-09 11:03:55 +02:00
Michael Starke
05cfb73734 Updated Icons for exported UTIs 2019-09-03 12:25:01 +02:00
Michael Starke
d9322d7544 split localisation export into singel language builds to make them more travis friendly 2019-08-30 11:04:20 +02:00
Michael Starke
7de8d0abd5 re-added missing exported languages 2019-08-30 10:46:41 +02:00
Michael Starke
3289ffb2e4 Fixed typo 2019-08-29 21:06:16 +02:00
Michael Starke
38d64c7cb9 Added export localisations step to continous deployment for easier workflow 2019-08-29 17:17:03 +02:00
Michael Starke
01b1372dda Merge branch 'master' into feature/import_plugins 2019-08-29 12:02:25 +02:00
Chester Liu
c76a8baa88 Update zh-Hans localization (#970)
* Update zh-Hans localization

* More zh-Hans localization
2019-08-29 11:22:36 +02:00
Michael Starke
d048ea47a6 Aligned localizations 2019-08-28 13:33:40 +02:00
Michael Starke
2a8766eccb Fixed typo 2019-08-28 13:32:32 +02:00
Michael Starke
a2078f721a Merge branch 'master' into feature/import_plugins
# Conflicts:
#	Cartfile.resolved
2019-08-28 13:13:49 +02:00
Michael Starke
7e402601f8 Updated KeePassKit to fix various Pickchars issues 2019-08-28 11:53:43 +02:00
Chester Liu
88d7d8792a Update zh-Hans localization (#969) 2019-08-28 08:33:15 +02:00
Michael Starke
68bdcb461f Using KeePassKit 2.4.5 to fix breadcrumb issue 2019-08-27 18:43:10 +02:00
Michael Starke
ec8ce8ec29 remove unnecessary assignment 2019-08-27 18:26:40 +02:00
Michael Starke
95275d9c8a Merge branch 'master' into feature/import_plugins 2019-08-27 15:01:54 +02:00
Michael Starke
7671a6e3f5 remove unnecessary logging 2019-08-27 14:59:38 +02:00
Michael Starke
c0c053d422 Retain custom file extension if present and do not change back to .kdbx (or .kdb) 2019-08-27 14:54:00 +02:00
Chester Liu
4cda972d14 Update zh-Hans translation (#968) 2019-08-27 11:33:31 +02:00
Michael Starke
09eb1dcf41 Updated at now displays a special text if remote updates are disabled 2019-08-27 11:30:08 +02:00
Michael Starke
224ca6c65b Updated plugin definition 2019-08-27 11:29:39 +02:00
Michael Starke
10dd3e352d Merge branch 'master' into feature/import_plugins 2019-08-27 10:15:42 +02:00
Michael Starke
48aa21faa8 Current plugins.json 2019-08-27 10:15:19 +02:00
Michael Starke
c295f5df6f Updated plugin retrieval to overwrite exiting file 2019-08-27 10:15:11 +02:00
Michael Starke
2103eb8875 Added rudimentary export plugin support 2019-08-26 17:25:25 +02:00
Michael Starke
3b7bf0d77b Removed unneeded parameters in import API 2019-08-26 12:03:14 +02:00
Michael Starke
9298feea2d Removed english localisation that is not necessary 2019-08-23 16:30:56 +02:00
Michael Starke
7f79dde83a Fixed malformed .strings file 2019-08-23 13:15:30 +02:00
Michael Starke
ed4e4b0f72 Found a better german translation 2019-08-23 12:31:08 +02:00
Michael Starke
62670a605e Updated KeePassKit to fix KDBX4 date offset bug (-2days) 2019-08-23 12:27:59 +02:00
Alessandro Vinciguerra
9e5d9f3bf5 Update Italian Localization (#965)
* Added missing Italian translations

Added translations directly to strings files
Update translation for "inspector"

* Updated Italian translations and added missing strings files

Added fixes for German, French, and English
2019-08-23 12:27:38 +02:00
Michael Starke
bc47fb592c Merge branch 'master' into feature/import_plugins 2019-08-23 10:17:49 +02:00
Michael Starke
4b04699b30 Removed unnecessary english localisation files since Base localisation is english 2019-08-23 10:17:21 +02:00
Michael Starke
3910b117a8 Updated german localization 2019-08-23 09:50:50 +02:00
Michael Starke
81dce1928a Updated to Xcode 10.3 2019-08-20 16:08:57 +02:00
Michael Starke
05f820a4a3 Merge branch 'master' into feature/import_plugins 2019-08-20 12:56:06 +02:00
Michael Starke
b9fbe43653 Merge branch 'master' into feature/duplicate_group 2019-08-20 12:55:31 +02:00
Michael Starke
145f27c334 Clarified localization context 2019-08-20 12:55:18 +02:00
Michael Starke
bf93ab574d Merge branch 'master' into feature/duplicate_group 2019-08-19 14:22:30 +02:00
Michael Starke
7fc1dd8a1b Do not relay on taking a screenshot to determine screen recording permissions. Instead read window titles of all visible windows. 2019-08-19 14:21:12 +02:00
Michael Starke
e31c7c6cd7 Updated translations 2019-08-19 14:20:27 +02:00
Michael Starke
7d8bb85d9b Added duplicate group as context menu action 2019-08-16 17:24:54 +02:00
Michael Starke
245a58d81b Fixed missing break in action validation resulting in copy as reference and copy custom attributes note working in search mode 2019-08-16 16:52:13 +02:00
Michael Starke
6b94cbd81b added prefix to prevent name clash 2019-08-16 15:38:01 +02:00
Michael Starke
cbc74ccca6 Split test into valid and invalid attributes 2019-08-16 14:57:41 +02:00
Michael Starke
9b2f8e5f6f Using property 2019-08-16 14:57:32 +02:00
Michael Starke
9c177afdb0 Added show group in outline to context menus 2019-08-14 13:26:33 +02:00
Michael Starke
6b13ab37b8 Updated localizations 2019-08-14 13:25:55 +02:00
Michael Starke
d4efba00ae Removed unused file 2019-08-14 13:25:47 +02:00
Michael Starke
2d3e81a5c1 Added double click action to select the group of the currently selected entry.
This feature is mainly aimed to ease navigation when browsing search results
2019-08-14 12:08:18 +02:00
Michael Starke
c523ba716f code style 2019-08-09 21:31:11 +02:00
Michael Starke
32c6bae7e4 Updated to Xcode 10.3 2019-08-07 15:09:25 +02:00
Anton Glezman
2aba4cbd93 Improved russian localization (#961) 2019-08-05 10:37:36 +02:00
Anton Glezman
5fbd6d1cde Fix localized string ambiguous with word allow/disallow (#959)
* Fix localized string ambiguous with word allow/disallow
* Fix typo
2019-08-05 10:37:01 +02:00
César Arratia
091a565bc8 Translation to spanish improved (#953)
* - Translation to Spanish of the new functionalities (adapt to new Localizable strings order)
- Corrections of some typos in English translation

* - Update all spanish translations, UI included
2019-07-19 12:40:56 +02:00
Michael Starke
0d3bf5ba71 Fixed typo in localisation comment 2019-07-18 11:41:22 +02:00
Michael Starke
d3a575fce3 Merge branch 'master' into feature/import_plugins 2019-07-15 18:21:33 +02:00
Michael Starke
1baf2cd8e6 Display a generic description text if the appropriate key is present in the InfoDictionary of the plugin bundle 2019-07-15 18:21:03 +02:00
Michael Starke
0455628d72 Merge branch 'master' into feature/import_plugins 2019-07-15 12:25:15 +02:00
Michael Starke
9d0dc1630d Added simple support for import Plugins via plugin API 2019-07-15 12:23:32 +02:00
Michael Starke
fc21257173 Minor style fixes 2019-07-15 12:22:07 +02:00
Michael Starke
53b807788a Fixed issue where remove connection would be used despite the user not consenting to it. 2019-07-12 17:07:30 +02:00
Michael Starke
024131de35 Fixed typo in comment 2019-07-12 17:01:22 +02:00
Michael Starke
a47557672f Merge branch 'master' into feature/use_local_plugins_json
# Conflicts:
#	MacPass/de.lproj/Localizable.strings
#	MacPass/en.lproj/Localizable.strings
2019-07-12 16:55:38 +02:00
Michael Starke
9a55559e71 Merge branch 'master' into feature/refactor_touchbar
# Conflicts:
#	MacPass/MPDocumentWindowController.m
2019-07-12 16:50:10 +02:00
Michael Starke
e82db2fe9d Added missing contraints 2019-07-12 16:47:26 +02:00
Michael Starke
50dad4de30 Updated english localization 2019-07-12 16:43:34 +02:00
Michael Starke
f7eb7147f3 Updated english localization 2019-07-12 16:42:21 +02:00
Michael Starke
d37164ad89 Updated english localization for database settings window 2019-07-12 16:40:51 +02:00
Michael Starke
add09827ba added missing changes to project file 2019-07-12 16:04:06 +02:00
Michael Starke
9a625dd57d Updated german and english localizations 2019-07-12 16:03:58 +02:00
Michael Starke
3191e56e58 Used more appropriate buttons for unlock/lock in Touch- and Toolbar 2019-07-12 14:40:14 +02:00
Michael Starke
a5c97469eb Moved constants into MPTouchBarButtonCreator, adjusted naming of constants to current convention 2019-07-12 13:26:21 +02:00
Michael Starke
02840548ba use isEqualToString instead of == 2019-07-12 11:26:11 +02:00
Michael Starke
52720a79d4 Fixed memory leak in taking a screenshot 2019-07-12 11:26:00 +02:00
Michael Starke
71e795c4f4 Updated Xcode version 2019-07-12 11:14:45 +02:00
Michael Starke
2381acfde9 Codestyle. Do not use == for string compare 2019-07-10 12:27:34 +02:00
Michael Starke
9d2819ce2c Codestyle 2019-07-10 12:27:18 +02:00
Michael Starke
d5592774d1 Disable plugin alert when running tests 2019-07-10 12:27:11 +02:00
Michael Starke
55f1ce22a9 Codestyle 2019-07-10 12:13:56 +02:00
Veit-Hendrik Schlenker
2d98c480da Add touchbar support (#862)
* Add touchbar support for the password input

* Add touchbar support for entry list

* Set NSTouchBarItemIdentifier as static strings

* Simplify touchbar initialization in NSTextView

* Remove colored buttons in touchbar to adhere to the Human Interface Guidelines

* Add search action to touchbar

* Create a TouchBarButtonCreator

* Enable Touchbar customization

* Fix typo

* Add customizationLabel to all buttons

* Use localised strings instead of hardcoded

* Add a popover touchbar for editing

* Update localisation

* Set the bezel color of the show password button to selected if toggled
2019-07-10 12:00:38 +02:00
Michael Starke
30a68fc9e3 Merge branch 'feature/check_autotype_screen_recording_permission' 2019-07-09 15:39:43 +02:00
Michael Starke
32899cb707 Introduced Autotype doctor in preparation for macOS 10.15.
This change removes the test for autotype on startup and will only check for permissoins when the pereferences are shown or when (gloabal)autotype is performed.
2019-07-09 15:39:23 +02:00
Michael Starke
b1cb776e14 Moved accessibilty permission checks into MPAutotypeDoctor. Added screen capture permission test. 2019-07-03 17:28:58 +02:00
Michael Starke
176a3b7db4 use property instead of setter 2019-07-03 12:47:28 +02:00
Michael Starke
38e61b96a5 Added missing palettlabel to toolbar items to show up in customizing sheet 2019-07-03 12:05:43 +02:00
Michael Starke
54d7ce4f77 Merge branch 'master' into feature/use_local_plugins_json 2019-07-03 12:03:09 +02:00
Michael Starke
2e523f6018 Merge branch 'master' into feature/check_autotype_screen_recording_permission 2019-07-03 12:02:56 +02:00
Michael Starke
077a5851cf append branch name if we're not on master 2019-07-03 11:14:42 +02:00
Michael Starke
3cab0ea4dd Fixed versioning script to correctly work with more complex branches 2019-07-03 11:02:10 +02:00
Michael Starke
ddb0f92dce Using a notification based aproach to ensure the desired target application is activated before performing any autotype commands 2019-07-01 16:53:05 +02:00
Michael Starke
0c12236401 Use naive polling to check if requested application is already active 2019-07-01 14:40:10 +02:00
Michael Starke
c7d85d6daa Added log message when no window title can be determined 2019-07-01 13:27:18 +02:00
Michael Starke
28817b6c80 wired plugin repository download settings and fixed crash when initializing plugin host 2019-06-26 13:05:40 +02:00
Michael Starke
972f775ab3 added load external content ui for settings 2019-06-26 12:33:49 +02:00
Michael Starke
4a33a7ece2 ignore updated localizations helper file 2019-06-26 12:33:38 +02:00
Michael Starke
e0d12bea5a Added setup to store a copy of the plugin.json inside Macpass and use that as fallback as well as if the user denies access to remote systems 2019-06-25 12:59:51 +02:00
Michael Starke
8f5914afd2 Project structure cleanup and renaming 2019-06-25 11:41:53 +02:00
Jesse Reppin
eaa0f68c7b Updated german localization (#943)
* Updated german localization

Add in GeneralSettings.strings "Enable Autosave" and "Close and open all documents for changes to take effect" in German.

* Updated german localization
2019-06-19 10:10:43 +02:00
Michael Starke
9f43d52917 Remove alert pop-up in test scenarios to prevent main thread stalls 2019-06-17 16:32:36 +02:00
Michael Starke
9e474375bf Removed unimplemented test cases 2019-06-17 16:32:12 +02:00
Michael Starke
714bba4ce5 Revert "Added delay settings key"
This reverts commit 3ef2c01859.
2019-06-17 15:39:19 +02:00
Michael Starke
8d66621803 Added support for {DELAY=<delay>} to allow for custom delay in command execution instead of using dedicated UI and settings for this 2019-06-17 15:38:12 +02:00
Michael Starke
3ef2c01859 Added delay settings key 2019-06-17 11:23:39 +02:00
Michael Starke
4abdff79a5 Fixed typos in comment 2019-05-16 09:21:09 +02:00
Michael Starke
f9b36177fd Fixed wrong usage of window title 2019-05-09 20:43:07 +02:00
Michael Starke
9134f4959b Use window title supplied by plugins 2019-05-09 20:39:09 +02:00
Michael Starke
6e011c00fa Using resolvers to determine the window title. Title is currently not used for anything besides logging. 2019-05-08 08:33:11 +02:00
Michael Starke
64de5a0d21 Add apple event usage descriptions since Info.plists of plugins will not be considered when determining Automation capabilites 2019-05-08 08:32:43 +02:00
Michael Starke
5da86637e5 Stubbed API for Autotype plugins that resolve window titles 2019-05-07 08:13:41 +02:00
Michael Starke
ba2fc255dc Updated dutch localization 2019-04-26 14:51:22 +02:00
Michael Starke
8cc701af5f Updated french localization 2019-04-25 16:01:19 +02:00
Michael Starke
305ce06ab4 Updated french localization 2019-04-25 11:57:19 +02:00
Michael Starke
349eb5791e Renamed statupstate 2019-04-24 17:09:56 +02:00
Michael Starke
2beb1bbceb Merge branch 'feature/fix-welcome-window-restoration' 2019-04-24 15:57:51 +02:00
Michael Starke
c46dba59c3 do not show welcome window when we are asked to open a file via double-click in the Finder 2019-04-24 15:57:20 +02:00
Michael Starke
25538dd3bf Updated to Xcode 10.2 2019-04-24 12:06:28 +02:00
Michael Starke
e8fa409cef moved observation to init since it’s need from the start 2019-04-24 12:06:16 +02:00
Michael Starke
6b6c4fb736 Updated to Xcode 10.2 2019-04-05 17:09:08 +02:00
Michael Starke
7c2cf6eadb Re-worked hide after copy to pasteboard. It now works for all copy actions that securely copy to the clipboard (closed #906) 2019-04-05 08:57:59 +02:00
Michael Starke
853e47c43f Moved hide after copy to separate section since it’s meaning changes 2019-04-05 08:35:13 +02:00
Michael Starke
a5da80f094 Added UI to enable hide-after-copy 2019-04-05 08:24:47 +02:00
Michael Starke
878cef88c5 Reenabled tababale key selection also fixing first responder issue when closing password generator popover (fixes #896) 2019-04-05 08:24:47 +02:00
Michael Starke
43508ad3a5 Added trailing comma 2019-04-05 08:24:47 +02:00
Michael Starke
d909c377fb Dutch advanced database settings tab was broken because of a malformed localisation (fixes #913) 2019-04-05 08:24:47 +02:00
Deniz Türkoglu
ae4656c79a Keyfile selection window must be modal (#898)
If we don't use the modal view, the user can put the file selection
window to background, click 'Choose...' and open additional windows.
2019-04-05 08:23:32 +02:00
Anton Glezman
1c0a76dc74 Russian localization (#918) 2019-04-05 08:22:54 +02:00
Michael Starke
b667cf75bf Updated contributors (rebase) 2019-04-01 09:18:41 +02:00
Michael Starke
4222922b68 Bumped to 0.7.8 2019-04-01 09:17:46 +02:00
Michael Starke
81d722dd3a Updated to current Xcode 2019-04-01 09:17:46 +02:00
Michael Starke
d26304285f Fixed enforce each of group setting not being correctly stored as defaults (fixes #914) 2019-04-01 09:17:46 +02:00
Michael Starke
1f4966e4c0 Disabled tab for MPPathControl since it yields first responder assertions that need to be hunted down first 2019-04-01 09:17:46 +02:00
Michael Starke
c72566d4c1 Fixed wrong assertion in index check preventing the first deletion of fist custom attribute (fixes #911) 2019-04-01 09:17:46 +02:00
Michael Starke
3dedbc1f68 Enabled english, german and dutch localization for save panel accessory view (fixes #912) 2019-04-01 09:17:46 +02:00
Michael Starke
7df1c9dff8 Added entry images to menu items and shortened label (closes #904) 2019-04-01 09:17:46 +02:00
Michael Starke
76b76526e3 Reformatted line breaks 2019-04-01 09:17:46 +02:00
Michael Starke
bb4390aa84 Added comma to make Contributors more readable, updated script to sort uniquely (rebase) 2019-04-01 09:17:15 +02:00
Michael Starke
e5e0e689c3 fixed mail links of contributors (rebase) 2019-04-01 09:15:01 +02:00
Michael Starke
9026efa662 Added Frank Kooij to credits (rebase) 2019-04-01 09:12:52 +02:00
Michael Starke
9a721c0a1f Updated Dutch localization 2019-03-28 09:08:05 +01:00
Michael Starke
be5b2577f0 Updated contributor in README. Added macpassapp.org URL to credits 2019-03-28 09:00:23 +01:00
Michael Starke
1372dbd444 Autotype candiadate selection window now supports double click to select an entry (fixes #901) 2019-03-27 17:39:45 +01:00
573 changed files with 19989 additions and 5783 deletions

2
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,2 @@
github: mstarke
custom: https://flattr.com/thing/1550529/mstarkeMacPass-on-GitHub

32
.github/workflows/nightly.yml vendored Normal file
View File

@@ -0,0 +1,32 @@
name: Nightly
on:
#push:
# branches: [ master ]
#pull_request:
# branches: [ master ]
schedule:
- cron: '0 23 * * *'
workflow_dispatch:
jobs:
nightly:
runs-on: macos-10.15
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
- name: Bootstrap Carthage
run: carthage bootstrap --platform macOS
- name: Install xcpretty
run: gem install xcpretty --no-document --quiet
- name: Build
run: |
set -o pipefail
xcodebuild clean
xcodebuild build -configuration release -project MacPass.xcodeproj -scheme MacPass CODE_SIGNING_REQUIRED=NO -derivedDataPath ./build | xcpretty -c

1
.gitignore vendored
View File

@@ -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

3
.gitmodules vendored
View File

@@ -1,6 +1,3 @@
[submodule "DDHotKey"] [submodule "DDHotKey"]
path = DDHotKey path = DDHotKey
url = https://github.com/mstarke/DDHotKey.git url = https://github.com/mstarke/DDHotKey.git
[submodule "TransformerKit"]
path = TransformerKit
url = https://github.com/mattt/TransformerKit.git

View File

@@ -1,4 +1,4 @@
osx_image: xcode10.2 osx_image: xcode12.2
xcode_project: MacPass.xcodeproj xcode_project: MacPass.xcodeproj
xcode_scheme: MacPass xcode_scheme: MacPass
language: objective-c language: objective-c
@@ -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

View File

@@ -4,18 +4,21 @@ Thanks for taking the time to contribute to MacPass! This documents describes a
## Translations ## Translations
MacPass has translations for a few languages. If you can translate to another language, or you think a translation is wrong, follow the next steps to add or improve a translation: MacPass has translations for a few languages. If you can translate to another language, or you think a translation is wrong, follow the next steps to add or improve a translation:
- You can use a XLIFF editor for translating the strings. For example [XLIFFTool](https://itunes.apple.com/us/app/xlifftool/id1074282695)
- For a new localization only: - Get a XLIFF editor for translating localization files. For example [XLIFFTool](https://itunes.apple.com/us/app/xlifftool/id1074282695)
- Select MacPass in the project navigator - Get the current XLIFF export for your language. You can either download the `Localizations.zip` on the [Continous release](https://github.com/MacPass/MacPass/releases) or you can export them in Xcode:
- Select the MacPass project in the project and targets list - For a new localization only:
- Open the info tab and click the `+` button un the localizations section. - Select MacPass in the project navigator
- Choose the language you want to translate - Select the MacPass project in the project and targets list
- Select all resources and click finish, now the new language is available for export in the next step - Open the info tab and click the `+` button un the localizations section.
- Export the XLIFF file - Choose the language you want to translate
- Select the MacPass project in XCode - Select all resources and click finish, now the new language is available for export in the next step
- Go to `Editor -> Export for Localization` - For present localizations directly Export the XLIFF file
- Select the language you want to translate - Select the MacPass project in Xcode
- Now use your XLIFF editor and save the file if you are done with your translations - Go to `Editor -> Export for Localization`
- Select the language you want to translate
- Now use your XLIFF editor and save the file after you are done with your translations
- Go back to XCode and use `Editor -> Import Localization` to import the changes - Go back to XCode and use `Editor -> Import Localization` to import the changes
- Open a Pull Request with your changes.
Alternatively, you can open an issue to ask a dev to create the XLIFF file for you and send it back after you've finished localising. Alternatively, you can open an issue to ask a dev to create the XLIFF file for you and send it back after you've finished localising.

View File

@@ -1,3 +1,4 @@
github "sparkle-project/Sparkle" ~> 1.18.1 github "sparkle-project/Sparkle" ~> 1.22
github "MacPass/KeePassKit" ~> 2.4 github "mattt/TransformerKit" ~> 1.1.1
github "mstarke/HNHUi" ~> 3.0 github "MacPass/KeePassKit" "76e6ecda942f9e328efde7883ad75aed7290b632"
github "mstarke/HNHUi" ~> 4.0

View File

@@ -1,4 +1,5 @@
github "MacPass/KeePassKit" "2.4.2" github "MacPass/KeePassKit" "76e6ecda942f9e328efde7883ad75aed7290b632"
github "mstarke/HNHUi" "3.0" github "mattt/TransformerKit" "1.1.1"
github "robbiehanson/KissXML" "5.2.3" github "mstarke/HNHUi" "4.0.3"
github "sparkle-project/Sparkle" "1.20.0" github "robbiehanson/KissXML" "5.3.3"
github "sparkle-project/Sparkle" "1.24.0"

View File

@@ -1,7 +1,7 @@
MacPass, a KeePass compatible Password Manager for OS X MacPass, a KeePass compatible Password Manager for OS X
Copyright (C) 2012-2016 Michael Starke, and all MacPass contributors Copyright (C) 2012-2016 Michael Starke, and all MacPass contributors
A full list of contributors can be found at A full list of contributors can be found at
<https://github.com/mstarke/MacPass/graphs/contributors> <https://github.com/MacPass/MacPass/graphs/contributors>
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1010" LastUpgradeVersion = "1240"
version = "2.0"> version = "2.0">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
@@ -26,20 +26,8 @@
buildConfiguration = "Debug" buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
codeCoverageEnabled = "YES" shouldUseLaunchSchemeArgsEnv = "NO"
shouldUseLaunchSchemeArgsEnv = "NO"> codeCoverageEnabled = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4C45FB19178E09ED0010007D"
BuildableName = "MacPassTests.xctest"
BlueprintName = "MacPassTests"
ReferencedContainer = "container:MacPass.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion> <MacroExpansion>
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
@@ -55,9 +43,24 @@
value = "YES" value = "YES"
isEnabled = "YES"> isEnabled = "YES">
</EnvironmentVariable> </EnvironmentVariable>
<EnvironmentVariable
key = "MPIsRunningTests"
value = "YES"
isEnabled = "YES">
</EnvironmentVariable>
</EnvironmentVariables> </EnvironmentVariables>
<AdditionalOptions> <Testables>
</AdditionalOptions> <TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4C45FB19178E09ED0010007D"
BuildableName = "MacPassTests.xctest"
BlueprintName = "MacPassTests"
ReferencedContainer = "container:MacPass.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug" buildConfiguration = "Debug"
@@ -102,8 +105,6 @@
isEnabled = "NO"> isEnabled = "NO">
</EnvironmentVariable> </EnvironmentVariable>
</EnvironmentVariables> </EnvironmentVariables>
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release" buildConfiguration = "Release"

View File

@@ -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="12120" systemVersion="16F73" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="17506" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="12120"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17506"/>
<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>
@@ -19,7 +19,7 @@
<rect key="frame" x="0.0" y="0.0" width="392" height="210"/> <rect key="frame" x="0.0" y="0.0" width="392" height="210"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews> <subviews>
<tokenField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Jzn-UC-Ok8"> <tokenField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Jzn-UC-Ok8">
<rect key="frame" x="20" y="50" width="352" height="66"/> <rect key="frame" x="20" y="50" width="352" height="66"/>
<constraints> <constraints>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="66" id="7rr-fC-NeH"/> <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="66" id="7rr-fC-NeH"/>
@@ -31,13 +31,13 @@
</tokenFieldCell> </tokenFieldCell>
</tokenField> </tokenField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="lS4-1R-Bhp"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="lS4-1R-Bhp">
<rect key="frame" x="215" y="18" width="157" height="25"/> <rect key="frame" x="215" y="19" width="157" height="23"/>
<buttonCell key="cell" type="roundTextured" title="Set Autotype Sequence" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="aOD-Ih-Sft"> <buttonCell key="cell" type="roundTextured" title="Set Autotype Sequence" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="aOD-Ih-Sft">
<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>
</button> </button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7xF-eN-vs3"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="7xF-eN-vs3">
<rect key="frame" x="18" y="176" width="207" height="14"/> <rect key="frame" x="18" y="176" width="207" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Available Commands and Placeholders" id="lug-97-H9D"> <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Available Commands and Placeholders" id="lug-97-H9D">
<font key="font" metaFont="smallSystem"/> <font key="font" metaFont="smallSystem"/>
@@ -45,7 +45,7 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="9Kw-lW-ASe"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9Kw-lW-ASe">
<rect key="frame" x="18" y="124" width="107" height="14"/> <rect key="frame" x="18" y="124" width="107" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Autotype Sequence" id="8ny-Qk-Jvo"> <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Autotype Sequence" id="8ny-Qk-Jvo">
<font key="font" metaFont="smallSystem"/> <font key="font" metaFont="smallSystem"/>
@@ -53,7 +53,7 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<tokenField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="k06-gn-ahB"> <tokenField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="k06-gn-ahB">
<rect key="frame" x="20" y="146" width="352" height="22"/> <rect key="frame" x="20" y="146" width="352" height="22"/>
<constraints> <constraints>
<constraint firstAttribute="width" relation="lessThanOrEqual" constant="400" id="can-wk-8oX"/> <constraint firstAttribute="width" relation="lessThanOrEqual" constant="400" id="can-wk-8oX"/>

View File

@@ -1,110 +1,25 @@
<?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="17506" 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="17506"/>
<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="targetApplicationImageView" destination="bWJ-Ub-c10" id="vTC-FO-QQO"/>
<outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/> <outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
</connections> </connections>
</customObject> </customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" 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="480" height="241"/> <rect key="frame" x="0.0" y="0.0" width="480" height="201"/>
<subviews> <subviews>
<scrollView wantsLayer="YES" autohidesScrollers="YES" horizontalLineScroll="38" horizontalPageScroll="10" verticalLineScroll="38" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7cB-re-3ys">
<rect key="frame" x="20" y="61" width="440" height="118"/>
<clipView key="contentView" id="WSc-o2-GsZ">
<rect key="frame" x="1" y="1" width="438" height="116"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" columnReordering="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="36" viewBased="YES" id="Ih2-lo-t2W">
<rect key="frame" x="0.0" y="0.0" width="438" height="116"/>
<autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn width="435" minWidth="40" maxWidth="1000" id="wTy-0L-yzY">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="PKW-gr-yqN">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
<prototypeCellViews>
<tableCellView id="vkI-FK-7wg">
<rect key="frame" x="1" y="1" width="435" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Utl-Gl-ETE">
<rect key="frame" x="2" y="1" width="14" height="14"/>
<constraints>
<constraint firstAttribute="width" relation="lessThanOrEqual" constant="32" id="N48-cx-w8q"/>
<constraint firstAttribute="height" relation="lessThanOrEqual" constant="32" id="mde-14-jf7"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSActionTemplate" id="gT4-lt-7Ir"/>
</imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsExpansionToolTips="YES" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Dxk-A7-QSy">
<rect key="frame" x="22" y="0.0" width="413" height="17"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" allowsUndo="NO" sendsActionOnEndEditing="YES" title="Content" id="TN3-3a-LaA">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="Dxk-A7-QSy" secondAttribute="bottom" id="0Ds-yc-1wj"/>
<constraint firstItem="Dxk-A7-QSy" firstAttribute="top" secondItem="vkI-FK-7wg" secondAttribute="top" id="3KK-oo-Ogk"/>
<constraint firstItem="Dxk-A7-QSy" firstAttribute="leading" secondItem="Utl-Gl-ETE" secondAttribute="trailing" constant="8" symbolic="YES" id="L0l-PB-4Dt"/>
<constraint firstAttribute="trailing" secondItem="Dxk-A7-QSy" secondAttribute="trailing" constant="2" id="kOy-Jo-rYe"/>
<constraint firstItem="Utl-Gl-ETE" firstAttribute="leading" secondItem="vkI-FK-7wg" secondAttribute="leading" constant="2" id="rRi-nE-1Z3"/>
<constraint firstItem="Utl-Gl-ETE" firstAttribute="top" secondItem="vkI-FK-7wg" secondAttribute="top" constant="2" id="sJf-FS-87E"/>
</constraints>
<connections>
<outlet property="imageView" destination="Utl-Gl-ETE" id="5dQ-R4-kfV"/>
<outlet property="textField" destination="Dxk-A7-QSy" id="8uP-9M-aOd"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
<connections>
<outlet property="dataSource" destination="-2" id="4ld-qs-eNP"/>
<outlet property="delegate" destination="-2" id="ibb-G8-tPQ"/>
</connections>
</tableView>
</subviews>
</clipView>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="Xgd-fL-vdl">
<rect key="frame" x="1" y="235" width="92" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="5cX-o7-7ZJ">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="330" translatesAutoresizingMaskIntoConstraints="NO" id="kDw-2l-7gQ">
<rect key="frame" x="18" y="187" width="444" height="34"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="There are multiple matches for the current window. Please select which match should be used." id="gcf-gb-ZsF">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="zBX-HB-tR7"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="zBX-HB-tR7">
<rect key="frame" x="236" y="13" width="82" height="32"/> <rect key="frame" x="236" y="13" width="82" height="32"/>
<buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="60p-7v-Nje"> <buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="60p-7v-Nje">
@@ -131,25 +46,146 @@ DQ
<action selector="selectAutotypeContext:" target="-2" id="a2F-ID-uOd"/> <action selector="selectAutotypeContext:" target="-2" id="a2F-ID-uOd"/>
</connections> </connections>
</button> </button>
<stackView distribution="fill" orientation="vertical" alignment="centerX" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="82Y-g7-4wV">
<rect key="frame" x="20" y="109" width="440" height="72"/>
<subviews>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="bWJ-Ub-c10">
<rect key="frame" x="204" y="40" width="32" height="32"/>
<constraints>
<constraint firstAttribute="height" relation="lessThanOrEqual" constant="128" id="Rzo-8n-W92"/>
<constraint firstAttribute="width" relation="lessThanOrEqual" constant="128" id="uhc-Ce-lb8"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyUpOrDown" image="NSApplicationIcon" id="d6x-JH-Lw2"/>
</imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="kDw-2l-7gQ">
<rect key="frame" x="-2" y="0.0" width="444" height="32"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="There are multiple matches for the current window. Please select which match should be used." id="gcf-gb-ZsF">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<visibilityPriorities>
<integer value="1000"/>
<integer value="1000"/>
</visibilityPriorities>
<customSpacing>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
<scrollView wantsLayer="YES" verticalCompressionResistancePriority="250" autohidesScrollers="YES" horizontalLineScroll="38" horizontalPageScroll="10" verticalLineScroll="38" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="7cB-re-3ys">
<rect key="frame" x="20" y="61" width="440" height="40"/>
<clipView key="contentView" id="WSc-o2-GsZ">
<rect key="frame" x="1" y="1" width="438" height="38"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" columnReordering="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="36" viewBased="YES" id="Ih2-lo-t2W">
<rect key="frame" x="0.0" y="0.0" width="438" height="38"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn width="435" minWidth="40" maxWidth="1000" id="wTy-0L-yzY">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="PKW-gr-yqN">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
<prototypeCellViews>
<tableCellView id="vkI-FK-7wg" customClass="MPExtendedTableCellView">
<rect key="frame" x="1" y="1" width="435" height="36"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Utl-Gl-ETE">
<rect key="frame" x="2" y="20" width="14" height="14"/>
<constraints>
<constraint firstAttribute="width" relation="lessThanOrEqual" constant="32" id="N48-cx-w8q"/>
<constraint firstAttribute="height" relation="lessThanOrEqual" constant="32" id="mde-14-jf7"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSActionTemplate" id="gT4-lt-7Ir"/>
</imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsExpansionToolTips="YES" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Dxk-A7-QSy">
<rect key="frame" x="22" y="20" width="413" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" allowsUndo="NO" sendsActionOnEndEditing="YES" title="Title" id="TN3-3a-LaA">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsExpansionToolTips="YES" textCompletion="NO" translatesAutoresizingMaskIntoConstraints="NO" id="rHv-KR-Ja6">
<rect key="frame" x="22" y="2" width="413" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" allowsUndo="NO" sendsActionOnEndEditing="YES" title="Sequence" id="bvJ-2i-eMc">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="Dxk-A7-QSy" firstAttribute="top" secondItem="vkI-FK-7wg" secondAttribute="top" id="3KK-oo-Ogk"/>
<constraint firstAttribute="bottom" secondItem="rHv-KR-Ja6" secondAttribute="bottom" constant="2" id="Fct-2X-0MX"/>
<constraint firstItem="Dxk-A7-QSy" firstAttribute="leading" secondItem="Utl-Gl-ETE" secondAttribute="trailing" constant="8" symbolic="YES" id="L0l-PB-4Dt"/>
<constraint firstItem="rHv-KR-Ja6" firstAttribute="leading" secondItem="Dxk-A7-QSy" secondAttribute="leading" id="cHl-VR-d3w"/>
<constraint firstAttribute="trailing" secondItem="rHv-KR-Ja6" secondAttribute="trailing" constant="2" id="jqL-Dd-V0M"/>
<constraint firstAttribute="trailing" secondItem="Dxk-A7-QSy" secondAttribute="trailing" constant="2" id="kOy-Jo-rYe"/>
<constraint firstItem="Utl-Gl-ETE" firstAttribute="leading" secondItem="vkI-FK-7wg" secondAttribute="leading" constant="2" id="rRi-nE-1Z3"/>
<constraint firstItem="Utl-Gl-ETE" firstAttribute="top" secondItem="vkI-FK-7wg" secondAttribute="top" constant="2" id="sJf-FS-87E"/>
<constraint firstItem="rHv-KR-Ja6" firstAttribute="top" secondItem="Dxk-A7-QSy" secondAttribute="bottom" constant="2" id="uTd-5E-IzI"/>
</constraints>
<connections>
<outlet property="addionalTextField" destination="rHv-KR-Ja6" id="VTf-Dz-qYp"/>
<outlet property="imageView" destination="Utl-Gl-ETE" id="5dQ-R4-kfV"/>
<outlet property="textField" destination="Dxk-A7-QSy" id="8uP-9M-aOd"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
<connections>
<action trigger="doubleAction" selector="selectAutotypeContext:" target="-2" id="NoK-fa-xIL"/>
<outlet property="dataSource" destination="-2" id="4ld-qs-eNP"/>
<outlet property="delegate" destination="-2" id="ibb-G8-tPQ"/>
</connections>
</tableView>
</subviews>
</clipView>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="Xgd-fL-vdl">
<rect key="frame" x="1" y="235" width="92" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="5cX-o7-7ZJ">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstAttribute="bottom" secondItem="V5B-Qq-GN8" secondAttribute="bottom" constant="20" id="FMz-e1-hOB"/> <constraint firstAttribute="bottom" secondItem="V5B-Qq-GN8" secondAttribute="bottom" constant="20" id="FMz-e1-hOB"/>
<constraint firstItem="kDw-2l-7gQ" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="GcO-tk-i2z"/> <constraint firstAttribute="trailing" secondItem="82Y-g7-4wV" secondAttribute="trailing" constant="20" symbolic="YES" id="Fvf-rw-waQ"/>
<constraint firstItem="kDw-2l-7gQ" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" symbolic="YES" id="OHm-6j-uPs"/>
<constraint firstAttribute="trailing" secondItem="V5B-Qq-GN8" secondAttribute="trailing" constant="20" symbolic="YES" id="SRs-hx-av7"/> <constraint firstAttribute="trailing" secondItem="V5B-Qq-GN8" secondAttribute="trailing" constant="20" symbolic="YES" id="SRs-hx-av7"/>
<constraint firstItem="V5B-Qq-GN8" firstAttribute="leading" secondItem="zBX-HB-tR7" secondAttribute="trailing" constant="12" symbolic="YES" id="UuF-Ba-HS5"/> <constraint firstItem="V5B-Qq-GN8" firstAttribute="leading" secondItem="zBX-HB-tR7" secondAttribute="trailing" constant="12" symbolic="YES" id="UuF-Ba-HS5"/>
<constraint firstItem="zBX-HB-tR7" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="ZNu-po-1u8"/> <constraint firstItem="zBX-HB-tR7" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="ZNu-po-1u8"/>
<constraint firstItem="7cB-re-3ys" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="egY-ml-urP"/> <constraint firstItem="7cB-re-3ys" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="egY-ml-urP"/>
<constraint firstItem="7cB-re-3ys" firstAttribute="top" secondItem="82Y-g7-4wV" secondAttribute="bottom" constant="8" symbolic="YES" id="f0g-kf-N2j"/>
<constraint firstItem="82Y-g7-4wV" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" symbolic="YES" id="hDi-Va-2Mb"/>
<constraint firstAttribute="trailing" secondItem="7cB-re-3ys" secondAttribute="trailing" constant="20" symbolic="YES" id="hqW-Hz-bFN"/> <constraint firstAttribute="trailing" secondItem="7cB-re-3ys" secondAttribute="trailing" constant="20" symbolic="YES" id="hqW-Hz-bFN"/>
<constraint firstItem="V5B-Qq-GN8" firstAttribute="baseline" secondItem="zBX-HB-tR7" secondAttribute="baseline" id="iAg-1w-h25"/> <constraint firstItem="V5B-Qq-GN8" firstAttribute="baseline" secondItem="zBX-HB-tR7" secondAttribute="baseline" id="iAg-1w-h25"/>
<constraint firstItem="zBX-HB-tR7" firstAttribute="top" secondItem="7cB-re-3ys" secondAttribute="bottom" constant="20" symbolic="YES" id="onA-YV-ezJ"/> <constraint firstItem="zBX-HB-tR7" firstAttribute="top" secondItem="7cB-re-3ys" secondAttribute="bottom" constant="20" symbolic="YES" id="onA-YV-ezJ"/>
<constraint firstItem="7cB-re-3ys" firstAttribute="top" secondItem="kDw-2l-7gQ" secondAttribute="bottom" constant="8" symbolic="YES" id="ss6-Ku-XPY"/> <constraint firstItem="82Y-g7-4wV" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="uoN-Et-pWh"/>
<constraint firstAttribute="trailing" secondItem="kDw-2l-7gQ" secondAttribute="trailing" constant="20" symbolic="YES" id="zSz-fH-fVn"/>
</constraints> </constraints>
<point key="canvasLocation" x="176" y="-39"/> <point key="canvasLocation" x="-388" y="-2744"/>
</customView> </customView>
</objects> </objects>
<resources> <resources>
<image name="NSActionTemplate" width="14" height="14"/> <image name="NSActionTemplate" width="14" height="14"/>
<image name="NSApplicationIcon" width="32" height="32"/>
</resources> </resources>
</document> </document>

View File

@@ -0,0 +1,149 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="17156" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17156"/>
<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="433" width="80" height="16"/>
<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="369" 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="321" 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="283" 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="177" 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="283" width="112" height="16"/>
<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="305" width="360" height="5"/>
</box>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="d5Z-hD-bpr">
<rect key="frame" x="38" y="129" 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="86" 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="50" 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="-742" y="-147"/>
</customView>
</objects>
<resources>
<image name="NSStatusAvailable" width="16" height="16"/>
</resources>
</document>

View File

@@ -1,17 +1,20 @@
{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf200 {\rtf1\ansi\ansicpg1252\cocoartf2513
{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;} \cocoatextscaling0\cocoaplatform0{\fonttbl\f0\fswiss\fcharset0 Helvetica-Bold;\f1\fswiss\fcharset0 Helvetica;\f2\fnil\fcharset0 HelveticaNeue;
{\colortbl;\red255\green255\blue255;\red0\green0\blue0;\red9\green79\blue209;\red52\green110\blue183; \f3\fnil\fcharset0 AppleColorEmoji;\f4\fnil\fcharset0 SFProText-Regular;}
\red38\green38\blue38;} {\colortbl;\red255\green255\blue255;\red0\green0\blue0;\red9\green79\blue209;\red69\green60\blue204;
{\*\expandedcolortbl;;\cssrgb\c0\c0\c0\cname textColor;\cssrgb\c0\c40784\c85490\cname linkColor;\csgenericrgb\c20392\c43137\c71765; \red52\green110\blue183;\red38\green38\blue38;}
\csgenericrgb\c14902\c14902\c14902;} {\*\expandedcolortbl;;\cssrgb\c0\c0\c0\cname textColor;\cssrgb\c0\c40784\c85490\cname linkColor;\cssrgb\c34510\c33725\c83922;
\csgenericrgb\c20392\c43137\c71765;\csgenericrgb\c14902\c14902\c14902;}
\paperw11900\paperh16840\vieww25780\viewh19380\viewkind0 \paperw11900\paperh16840\vieww25780\viewh19380\viewkind0
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
\f0\b\fs24 \cf2 Project Website:\cf0 \ \f0\b\fs24 \cf2 Project Website:\cf0 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
{\field{\*\fldinst{HYPERLINK "https://github.com/mstarke/MacPass"}}{\fldrslt {\field{\*\fldinst{HYPERLINK "https://macpassapp.org"}}{\fldrslt
\f1\b0 \cf3 MacPass}} \f1\b0 \cf2 macpassapp.org}}
\f1\b0 \ \f1\b0 \cf3 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
{\field{\*\fldinst{HYPERLINK "https://github.com/MacPass/MacPass"}}{\fldrslt \cf3 MacPass}} \cf2 on GitHub.\
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
\f0\b \cf2 \ \f0\b \cf2 \
@@ -19,7 +22,7 @@ License:\
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
\f1\b0 \cf2 MacPass KeePass compatible client for OS X\ \f1\b0 \cf2 MacPass KeePass compatible client for OS X\
Copyright (c) 2012-2019 Michael Starke, HicknHack Software GmbH\ Copyright (c) 2012-2021 Michael Starke, HicknHack Software GmbH\
\ \
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by\ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by\
the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\ the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\
@@ -34,11 +37,36 @@ You should have received a copy of the GNU General Public License along with thi
\ \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
\f0\b \cf0 \kerning1\expnd0\expndtw0 Sponsors:
\f2\b0\fs52 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0
{\field{\*\fldinst{HYPERLINK "mailto:frank.mittelbach@latex-project.org"}}{\fldrslt
\f1\fs24 \cf0 \kerning1\expnd0\expndtw3
Frank Mittelbach}}
\f1\fs24 \kerning1\expnd0\expndtw3
\
\pard\pardeftab720\partightenfactor0
{\field{\*\fldinst{HYPERLINK "mailto:github@soebes.com"}}{\fldrslt \cf0 \kerning1\expnd0\expndtw3
Karl Heinz Marbaise}}\kerning1\expnd0\expndtw3
\f3 \kerning1\expnd0\expndtw3
\uc0\u55356 \u57225
\f1 \kerning1\expnd0\expndtw3
\
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\partightenfactor0
\cf0 \kerning1\expnd0\expndtw3
\
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
\f0\b \cf2 \kerning1\expnd0\expndtw0 Credits:\ \f0\b \cf2 \kerning1\expnd0\expndtw0 Credits:\
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
\f1\b0 \cf2 \ \f1\b0 \cf2 \
Dutch translation: {\field{\*\fldinst{HYPERLINK "https://github.com/clone1612"}}{\fldrslt \cf3 Jannick Hemelhof}}\cf0 \ Dutch translation: {\field{\*\fldinst{HYPERLINK "https://github.com/FrankKooij"}}{\fldrslt \cf3 Frank Kooij}},
\f4 \cf4 \expnd0\expndtw0\kerning0
{\field{\*\fldinst{HYPERLINK "https://github.com/clone1612"}}{\fldrslt
\f1 \cf3 \kerning1\expnd0\expndtw0 Jannick Hemelhof}}
\f1 \cf0 \kerning1\expnd0\expndtw0 \
\ \
\cf2 French translation:\cf0 {\field{\*\fldinst{HYPERLINK "mailto:gil@panix.com"}}{\fldrslt \cf3 Gil Andr\'e9}}\ \cf2 French translation:\cf0 {\field{\*\fldinst{HYPERLINK "mailto:gil@panix.com"}}{\fldrslt \cf3 Gil Andr\'e9}}\
\ \
@@ -56,17 +84,17 @@ Moises Perez}}\
\cf2 MacPass\kerning1\expnd0\expndtw3 \cf2 MacPass\kerning1\expnd0\expndtw3
\kerning1\expnd0\expndtw0 Icon:\cf0 {\field{\*\fldinst{HYPERLINK "http://iiro.jappinen.me"}}{\fldrslt \cf3 Iiro J\'e4ppinen}}\ \kerning1\expnd0\expndtw0 Icon:\cf0 {\field{\*\fldinst{HYPERLINK "http://iiro.jappinen.me"}}{\fldrslt \cf3 Iiro J\'e4ppinen}}\
\ \
\cf2 Database Icons:\cf0 {\field{\*\fldinst{HYPERLINK "https://github.com/JoannaOlsen"}}{\fldrslt \cf3 Joanna Olsen}}\cf4 \ \cf2 Database Icons:\cf0 {\field{\*\fldinst{HYPERLINK "https://github.com/JoannaOlsen"}}{\fldrslt \cf3 Joanna Olsen}}\cf5 \
\ \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
{\field{\*\fldinst{HYPERLINK "https://github.com/robbiehanson/KissXML"}}{\fldrslt \cf3 KissXML}}\cf5 \ {\field{\*\fldinst{HYPERLINK "https://github.com/robbiehanson/KissXML"}}{\fldrslt \cf3 KissXML}}\cf6 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
\cf2 Copyright \'a9 2012 Robbie Hanson. All rights reserved.\ \cf2 Copyright \'a9 2012 Robbie Hanson. All rights reserved.\
\ \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
{\field{\*\fldinst{HYPERLINK "https://github.com/MiniKeePass/MiniKeePass"}}{\fldrslt \cf3 MiniKeePass}}\cf5 \ {\field{\*\fldinst{HYPERLINK "https://github.com/MiniKeePass/MiniKeePass"}}{\fldrslt \cf3 MiniKeePass}}\cf6 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
\cf2 Copyright \'a9 2011 Jason Rush and John Flanagan. All rights reserved.\cf5 \ \cf2 Copyright \'a9 2011 Jason Rush and John Flanagan. All rights reserved.\cf6 \
\ \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
{\field{\*\fldinst{HYPERLINK "https://github.com/mpowrie/KeePassLib"}}{\fldrslt \cf3 KeePass Database Library}}\ {\field{\*\fldinst{HYPERLINK "https://github.com/mpowrie/KeePassLib"}}{\fldrslt \cf3 KeePass Database Library}}\
@@ -75,34 +103,35 @@ Moises Perez}}\
\ \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
{\field{\*\fldinst{HYPERLINK "http://sparkle.andymatuschak.org"}}{\fldrslt \cf3 Sparkl\kerning1\expnd0\expndtw3 {\field{\*\fldinst{HYPERLINK "http://sparkle.andymatuschak.org"}}{\fldrslt \cf3 Sparkl\kerning1\expnd0\expndtw3
e}}\cf5 \kerning1\expnd0\expndtw3 e}}\cf6 \kerning1\expnd0\expndtw3
\ \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
\cf2 Copyright \'a9 2006 Andy Matuschak. \kerning1\expnd0\expndtw0 All rights reserved.\kerning1\expnd0\expndtw3 \cf2 \kerning1\expnd0\expndtw3
Copyright \'a9 2006 Andy Matuschak. \kerning1\expnd0\expndtw0 All rights reserved.\kerning1\expnd0\expndtw3
\ \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
\cf2 \kerning1\expnd0\expndtw0 \ \cf2 \kerning1\expnd0\expndtw0 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
{\field{\*\fldinst{HYPERLINK "http://stackoverflow.com/questions/11386876/how-to-encode-and-decode-files-as-base64-in-cocoa-objective-c"}}{\fldrslt \cf3 NSData+Base64}}\cf5 \ {\field{\*\fldinst{HYPERLINK "http://stackoverflow.com/questions/11386876/how-to-encode-and-decode-files-as-base64-in-cocoa-objective-c"}}{\fldrslt \cf3 NSData+Base64}}\cf6 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
\cf2 Copyright \'a92013, {\field{\*\fldinst{HYPERLINK "http://stackoverflow.com/users/200321/denis2342"}}{\fldrslt \cf3 denis2342}}\cf3 \ \cf2 Copyright \'a92013, {\field{\*\fldinst{HYPERLINK "http://stackoverflow.com/users/200321/denis2342"}}{\fldrslt \cf3 denis2342}}\cf3 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
\cf5 \ \cf6 \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
{\field{\*\fldinst{HYPERLINK "http://www.cocoadev.com/index.pl?NSDataCategory"}}{\fldrslt \cf3 NSData+Gzip}}\ {\field{\*\fldinst{HYPERLINK "http://www.cocoadev.com/index.pl?NSDataCategory"}}{\fldrslt \cf3 NSData+Gzip}}\
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
\cf2 Extracted from code on the CocoaDev Wiki\cf5 \ \cf2 Extracted from code on the CocoaDev Wiki\cf6 \
\ \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
{\field{\*\fldinst{HYPERLINK "https://github.com/karelia/SecurityInterface"}}{\fldrslt \cf3 KSPasswordField}}\ {\field{\*\fldinst{HYPERLINK "https://github.com/karelia/SecurityInterface"}}{\fldrslt \cf3 KSPasswordField}}\
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
\cf2 Code reused in HNHUISecureTextField\ \cf2 Code reused in HNHUISecureTextField\
Copyright \'a92012 Mike Abdullah, Karelia Software. All rights reserved.\cf5 \ Copyright \'a92012 Mike Abdullah, Karelia Software. All rights reserved.\cf6 \
\ \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
{\field{\*\fldinst{HYPERLINK "https://github.com/AlanQuatermain/aqtoolkit"}}{\fldrslt \cf3 NSData+CommonCrypto}}\ {\field{\*\fldinst{HYPERLINK "https://github.com/AlanQuatermain/aqtoolkit"}}{\fldrslt \cf3 NSData+CommonCrypto}}\
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
\cf2 Copyright \'a92008-2009 Jim Dovey, All rights reserved.\cf5 \ \cf2 Copyright \'a92008-2009 Jim Dovey, All rights reserved.\cf6 \
\ \
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\partightenfactor0
{\field{\*\fldinst{HYPERLINK "https://github.com/mattt/TransformerKit"}}{\fldrslt \cf3 TransformerKit}}\ {\field{\*\fldinst{HYPERLINK "https://github.com/mattt/TransformerKit"}}{\fldrslt \cf3 TransformerKit}}\

View File

@@ -1,9 +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="14113" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="17701" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14113"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17701"/>
<capability name="box content view" minToolsVersion="7.0"/>
<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>
@@ -48,17 +47,17 @@
</customObject> </customObject>
<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"/>
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="1"> <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="1">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/> <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="196" y="240" width="500" height="360"/> <rect key="contentRect" x="196" y="240" width="500" height="360"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/> <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
<view key="contentView" id="2"> <view key="contentView" misplaced="YES" id="2">
<rect key="frame" x="0.0" y="0.0" width="553" height="484"/> <rect key="frame" x="0.0" y="0.0" width="500" height="360"/>
<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="480" y="13" width="59" height="32"/> <rect key="frame" x="385" 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"/>
@@ -71,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="398" y="13" width="82" height="32"/> <rect key="frame" x="303" 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"/>
@@ -84,27 +83,27 @@ Gw
</connections> </connections>
</button> </button>
<tabView translatesAutoresizingMaskIntoConstraints="NO" id="357"> <tabView translatesAutoresizingMaskIntoConstraints="NO" id="357">
<rect key="frame" x="13" y="41" width="527" height="437"/> <rect key="frame" x="13" y="41" width="432" height="338"/>
<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">
<view key="view" id="361"> <view key="view" id="361">
<rect key="frame" x="10" y="33" width="454" height="267"/> <rect key="frame" x="10" y="33" width="454" height="265"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="231"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="231">
<rect key="frame" x="154" y="225" width="280" height="22"/> <rect key="frame" x="154" y="224" width="280" height="21"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="280" id="cra-uC-nCv"/> <constraint firstAttribute="width" constant="280" id="cra-uC-nCv"/>
</constraints> </constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="232"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="232">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="256"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="256">
<rect key="frame" x="70" y="201" width="78" height="17"/> <rect key="frame" x="70" y="201" width="78" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Description:" id="257"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Description:" id="257">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -112,7 +111,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="189"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="189">
<rect key="frame" x="46" y="229" width="102" height="17"/> <rect key="frame" x="46" y="228" width="102" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Database name:" id="190"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Database name:" id="190">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -120,7 +119,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1394"> <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1394">
<rect key="frame" x="152" y="73" width="70" height="26"/> <rect key="frame" x="152" y="72" width="71" height="25"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="1395"> <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="1395">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/> <font key="font" metaFont="menu"/>
@@ -133,7 +132,7 @@ Gw
</popUpButtonCell> </popUpButtonCell>
</popUpButton> </popUpButton>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1404"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1404">
<rect key="frame" x="60" y="78" width="88" height="17"/> <rect key="frame" x="60" y="78" width="88" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Compression:" id="1405"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Compression:" id="1405">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -141,7 +140,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1434"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1434">
<rect key="frame" x="107" y="48" width="41" height="17"/> <rect key="frame" x="107" y="48" width="41" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Color:" id="1435"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Color:" id="1435">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -149,7 +148,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<colorWell translatesAutoresizingMaskIntoConstraints="NO" id="1439" customClass="HNHUIColorWell"> <colorWell translatesAutoresizingMaskIntoConstraints="NO" id="1439" customClass="HNHUIColorWell">
<rect key="frame" x="154" y="45" width="44" height="23"/> <rect key="frame" x="154" y="44" width="44" height="23"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="44" id="XBF-V3-71G"/> <constraint firstAttribute="width" constant="44" id="XBF-V3-71G"/>
<constraint firstAttribute="height" constant="23" id="fgN-h5-Mr8"/> <constraint firstAttribute="height" constant="23" id="fgN-h5-Mr8"/>
@@ -157,37 +156,37 @@ Gw
<color key="color" red="0.05813049898" green="0.055541899059999997" blue="1" alpha="1" colorSpace="calibratedRGB"/> <color key="color" red="0.05813049898" green="0.055541899059999997" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</colorWell> </colorWell>
<scrollView horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1530"> <scrollView horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1530">
<rect key="frame" x="154" y="117" width="280" height="100"/> <rect key="frame" x="154" y="116" width="280" height="100"/>
<clipView key="contentView" 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" widthSizable="YES" heightSizable="YES"/>
<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"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<size key="minSize" width="278" height="98"/> <size key="minSize" width="278" height="98"/>
<size key="maxSize" width="463" height="10000000"/> <size key="maxSize" width="463" height="10000000"/>
<color key="insertionPointColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> <color key="insertionPointColor" name="textColor" catalog="System" colorSpace="catalog"/>
</textView> </textView>
</subviews> </subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</clipView> </clipView>
<constraints> <constraints>
<constraint firstAttribute="height" constant="100" id="8fE-cP-ksD"/> <constraint firstAttribute="height" constant="100" id="8fE-cP-ksD"/>
<constraint firstAttribute="width" constant="280" id="J06-kE-yVi"/> <constraint firstAttribute="width" constant="280" id="J06-kE-yVi"/>
</constraints> </constraints>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="1532"> <scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="1532">
<rect key="frame" x="-100" y="-100" width="87" height="18"/> <rect key="frame" x="-100" y="-100" width="87" height="18"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
</scroller> </scroller>
<scroller key="verticalScroller" verticalHuggingPriority="750" horizontal="NO" id="1533"> <scroller key="verticalScroller" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="1533">
<rect key="frame" x="263" y="1" width="16" height="98"/> <rect key="frame" x="263" y="1" width="16" height="98"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
</scroller> </scroller>
</scrollView> </scrollView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="RhU-5I-S5l"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="RhU-5I-S5l">
<rect key="frame" x="75" y="20" width="73" height="17"/> <rect key="frame" x="75" y="20" width="73" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="File format:" id="bTk-YZ-x0G"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="File format:" id="bTk-YZ-x0G">
<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"/>
@@ -195,7 +194,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1Ci-0B-yV5"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1Ci-0B-yV5">
<rect key="frame" x="152" y="20" width="72" height="17"/> <rect key="frame" x="152" y="20" width="72" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="VersionInfo" id="Ush-4r-A1A"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="VersionInfo" id="Ush-4r-A1A">
<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"/>
@@ -237,11 +236,11 @@ Gw
</tabViewItem> </tabViewItem>
<tabViewItem label="Security" identifier="" id="370"> <tabViewItem label="Security" identifier="" id="370">
<view key="view" id="371"> <view key="view" id="371">
<rect key="frame" x="10" y="33" width="454" height="243"/> <rect key="frame" x="10" y="33" width="412" height="292"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3ek-Rg-w82"> <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3ek-Rg-w82">
<rect key="frame" x="150" y="199" width="155" height="26"/> <rect key="frame" x="129" y="248" width="155" height="25"/>
<constraints> <constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="150" id="F8Y-Uw-4mL"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="150" id="F8Y-Uw-4mL"/>
</constraints> </constraints>
@@ -252,7 +251,7 @@ Gw
</popUpButtonCell> </popUpButtonCell>
</popUpButton> </popUpButton>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="vH7-5a-52C"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="vH7-5a-52C">
<rect key="frame" x="73" y="206" width="73" height="17"/> <rect key="frame" x="52" y="255" width="73" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Encryption:" id="gxY-UL-bEG"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Encryption:" id="gxY-UL-bEG">
<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"/>
@@ -260,29 +259,29 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<box title="Key derivation" translatesAutoresizingMaskIntoConstraints="NO" id="pbl-Mb-r8V"> <box title="Key derivation" translatesAutoresizingMaskIntoConstraints="NO" id="pbl-Mb-r8V">
<rect key="frame" x="17" y="16" width="420" height="178"/> <rect key="frame" x="17" y="16" width="378" height="227"/>
<view key="contentView" id="hkT-SX-Te1"> <view key="contentView" id="hkT-SX-Te1">
<rect key="frame" x="2" y="2" width="416" height="161"/> <rect key="frame" x="3" y="3" width="372" height="209"/>
<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="253" y="18" width="143" height="25"/> <rect key="frame" x="209" 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"/>
</buttonCell> </buttonCell>
</button> </button>
<tabView drawsBackground="NO" type="noTabsNoBorder" translatesAutoresizingMaskIntoConstraints="NO" id="2MY-PW-kzL"> <tabView drawsBackground="NO" type="noTabsNoBorder" translatesAutoresizingMaskIntoConstraints="NO" id="2MY-PW-kzL">
<rect key="frame" x="13" y="50" width="390" height="62"/> <rect key="frame" x="12" y="49" width="348" height="111"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<tabViewItems> <tabViewItems>
<tabViewItem label="Aes" identifier="1" id="ft1-pl-lpO"> <tabViewItem label="Aes" identifier="1" id="ft1-pl-lpO">
<view key="view" id="88i-IZ-Yev"> <view key="view" id="88i-IZ-Yev">
<rect key="frame" x="0.0" y="0.0" width="390" height="62"/> <rect key="frame" x="0.0" y="0.0" width="390" height="61"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ztz-iY-hWV"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ztz-iY-hWV">
<rect key="frame" x="64" y="23" width="50" height="17"/> <rect key="frame" x="64" y="23" width="50" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Rounds" id="uUQ-9s-M5E"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Rounds" id="uUQ-9s-M5E">
<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"/>
@@ -290,7 +289,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="8aq-34-rcd"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="8aq-34-rcd">
<rect key="frame" x="120" y="20" width="150" height="22"/> <rect key="frame" x="120" y="20" width="150" height="21"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="150" id="cdb-ED-zB3"/> <constraint firstAttribute="width" constant="150" id="cdb-ED-zB3"/>
</constraints> </constraints>
@@ -299,7 +298,7 @@ Gw
<real key="minimum" value="0.0"/> <real key="minimum" value="0.0"/>
</numberFormatter> </numberFormatter>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" 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>
@@ -315,13 +314,13 @@ Gw
</constraints> </constraints>
</view> </view>
</tabViewItem> </tabViewItem>
<tabViewItem label="Argon2" identifier="2" id="6qB-sH-9FI"> <tabViewItem label="Argon2d" identifier="2" id="6qB-sH-9FI">
<view key="view" id="ORc-Gq-vFd"> <view key="view" id="ORc-Gq-vFd">
<rect key="frame" x="0.0" y="0.0" width="348" height="114"/> <rect key="frame" x="0.0" y="0.0" width="348" height="111"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="aNy-eF-jKq"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="aNy-eF-jKq">
<rect key="frame" x="39" y="87" width="54" height="17"/> <rect key="frame" x="39" y="85" width="54" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Threads" id="2QI-ne-N5d"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Threads" id="2QI-ne-N5d">
<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"/>
@@ -329,7 +328,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="ml2-wP-EaZ"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="ml2-wP-EaZ">
<rect key="frame" x="32" y="55" width="61" height="17"/> <rect key="frame" x="32" y="54" width="61" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Iterations" id="2ZA-Gc-JdZ"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Iterations" id="2ZA-Gc-JdZ">
<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"/>
@@ -337,7 +336,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="178-0f-guB"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="178-0f-guB">
<rect key="frame" x="99" y="84" width="150" height="22"/> <rect key="frame" x="99" y="82" width="150" height="21"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="150" id="IEL-Dn-XFa"/> <constraint firstAttribute="width" constant="150" id="IEL-Dn-XFa"/>
</constraints> </constraints>
@@ -347,24 +346,24 @@ Gw
<real key="maximum" value="16777215"/> <real key="maximum" value="16777215"/>
</numberFormatter> </numberFormatter>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="39N-8Q-J8b"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="39N-8Q-J8b">
<rect key="frame" x="99" y="52" width="150" height="22"/> <rect key="frame" x="99" y="51" width="150" height="21"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="9wr-x8-Wtv"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="9wr-x8-Wtv">
<numberFormatter key="formatter" formatterBehavior="default10_4" usesGroupingSeparator="NO" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="42" id="Kim-cZ-JbF"> <numberFormatter key="formatter" formatterBehavior="default10_4" usesGroupingSeparator="NO" groupingSize="0" minimumIntegerDigits="0" maximumIntegerDigits="42" id="Kim-cZ-JbF">
<real key="minimum" value="1"/> <real key="minimum" value="1"/>
<real key="maximum" value="4294967295"/> <real key="maximum" value="4294967295"/>
</numberFormatter> </numberFormatter>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="eEW-oa-V7U"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="eEW-oa-V7U">
<rect key="frame" x="99" y="20" width="129" height="22"/> <rect key="frame" x="99" y="20" width="129" height="21"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="M1E-89-YVm"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="M1E-89-YVm">
<byteCountFormatter key="formatter" countStyle="binary" allowsNonnumericFormatting="NO" id="tSh-D8-DnC"/> <byteCountFormatter key="formatter" countStyle="binary" allowsNonnumericFormatting="NO" id="tSh-D8-DnC"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
@@ -373,7 +372,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="9kV-19-lm6"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="9kV-19-lm6">
<rect key="frame" x="39" y="23" width="54" height="17"/> <rect key="frame" x="39" y="23" width="54" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Memory" id="iRY-If-Kwn"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Memory" id="iRY-If-Kwn">
<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"/>
@@ -381,7 +380,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="NfL-iP-SRk"> <stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="NfL-iP-SRk">
<rect key="frame" x="233" y="18" width="19" height="27"/> <rect key="frame" x="233" y="17" width="19" height="28"/>
<stepperCell key="cell" continuous="YES" alignment="left" maxValue="100" id="dvB-J3-Wmb"/> <stepperCell key="cell" continuous="YES" alignment="left" maxValue="100" id="dvB-J3-Wmb"/>
</stepper> </stepper>
</subviews> </subviews>
@@ -412,10 +411,16 @@ Gw
</constraints> </constraints>
</view> </view>
</tabViewItem> </tabViewItem>
<tabViewItem label="Argon2id" identifier="" id="xI9-6m-9ju">
<view key="view" id="k6k-0V-j7w">
<rect key="frame" x="0.0" y="0.0" width="348" height="111"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
</view>
</tabViewItem>
</tabViewItems> </tabViewItems>
</tabView> </tabView>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2cq-R3-Ksh"> <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2cq-R3-Ksh">
<rect key="frame" x="131" y="117" width="155" height="26"/> <rect key="frame" x="109" y="165" width="155" height="25"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="Pb9-YV-rYe"> <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="Pb9-YV-rYe">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/> <font key="font" metaFont="menu"/>
@@ -426,7 +431,7 @@ Gw
</connections> </connections>
</popUpButton> </popUpButton>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="4el-r1-iRL"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="4el-r1-iRL">
<rect key="frame" x="64" y="124" width="63" height="17"/> <rect key="frame" x="42" y="172" width="63" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Algorithm" id="GVd-KH-pHc"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Algorithm" id="GVd-KH-pHc">
<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"/>
@@ -494,7 +499,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1294"> <stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1294">
<rect key="frame" x="255" y="324" width="19" height="27"/> <rect key="frame" x="255" y="325" width="19" height="27"/>
<stepperCell key="cell" continuous="YES" alignment="left" maxValue="100" id="1295"/> <stepperCell key="cell" continuous="YES" alignment="left" maxValue="100" id="1295"/>
</stepper> </stepper>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1268"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1268">
@@ -522,18 +527,18 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="599"> <stepper horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="599">
<rect key="frame" x="255" y="296" width="19" height="27"/> <rect key="frame" x="255" y="297" width="19" height="27"/>
<stepperCell key="cell" continuous="YES" alignment="left" maxValue="100" id="600"/> <stepperCell key="cell" continuous="YES" alignment="left" maxValue="100" id="600"/>
</stepper> </stepper>
<button translatesAutoresizingMaskIntoConstraints="NO" id="535"> <button translatesAutoresizingMaskIntoConstraints="NO" id="535">
<rect key="frame" x="184" y="265" width="137" height="18"/> <rect key="frame" x="184" y="266" width="137" height="18"/>
<buttonCell key="cell" type="check" title="Enable Recycle Bin" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="536"> <buttonCell key="cell" type="check" title="Enable Recycle Bin" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="536">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="678"> <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="678">
<rect key="frame" x="184" y="235" width="37" height="26"/> <rect key="frame" x="184" y="236" width="38" height="25"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="679"> <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="679">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/> <font key="font" metaFont="menu"/>
@@ -541,10 +546,10 @@ Gw
</popUpButtonCell> </popUpButtonCell>
</popUpButton> </popUpButton>
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="U7M-MH-EFw"> <box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="U7M-MH-EFw">
<rect key="frame" x="20" y="287" width="467" height="5"/> <rect key="frame" x="20" y="288" width="467" height="5"/>
</box> </box>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1582"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1582">
<rect key="frame" x="63" y="199" width="117" height="17"/> <rect key="frame" x="63" y="200" width="117" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Default Username:" id="1591"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Default Username:" id="1591">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -552,15 +557,15 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1730"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1730">
<rect key="frame" x="186" y="196" width="301" height="22"/> <rect key="frame" x="186" y="197" width="301" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="1731"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="1731">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1738"> <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1738">
<rect key="frame" x="184" y="152" width="37" height="26"/> <rect key="frame" x="184" y="153" width="38" height="25"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="1739"> <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="1739">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/> <font key="font" metaFont="menu"/>
@@ -568,7 +573,7 @@ Gw
</popUpButtonCell> </popUpButtonCell>
</popUpButton> </popUpButton>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="19r-LE-7X5"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="19r-LE-7X5">
<rect key="frame" x="186" y="94" width="128" height="22"/> <rect key="frame" x="186" y="95" width="128" height="22"/>
<constraints> <constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="128" id="COb-0V-OmT"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="128" id="COb-0V-OmT"/>
</constraints> </constraints>
@@ -584,21 +589,21 @@ Gw
<stepperCell key="cell" continuous="YES" alignment="left" maxValue="100" id="qQV-3d-GpK"/> <stepperCell key="cell" continuous="YES" alignment="left" maxValue="100" id="qQV-3d-GpK"/>
</stepper> </stepper>
<button verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Hqc-B0-xyz"> <button verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Hqc-B0-xyz">
<rect key="frame" x="184" y="122" width="171" height="18"/> <rect key="frame" x="184" y="123" width="171" height="18"/>
<buttonCell key="cell" type="check" title="Recommend key change" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="CtU-Eq-dgy"> <buttonCell key="cell" type="check" title="Recommend key change" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="CtU-Eq-dgy">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="upv-b3-vCc"> <button translatesAutoresizingMaskIntoConstraints="NO" id="upv-b3-vCc">
<rect key="frame" x="184" y="70" width="129" height="18"/> <rect key="frame" x="184" y="71" width="129" height="18"/>
<buttonCell key="cell" type="check" title="Force key change" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="z6u-YT-7LE"> <buttonCell key="cell" type="check" title="Force key change" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="z6u-YT-7LE">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="VYh-cm-fix"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="VYh-cm-fix">
<rect key="frame" x="186" y="42" width="128" height="22"/> <rect key="frame" x="186" y="43" width="128" height="22"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="M9G-Yy-1s4"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="M9G-Yy-1s4">
<customFormatter key="formatter" id="3Ax-U4-Ofb" customClass="MPDayCountFormatter"/> <customFormatter key="formatter" id="3Ax-U4-Ofb" customClass="MPDayCountFormatter"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
@@ -619,7 +624,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="I0d-r2-ySf"> <box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="I0d-r2-ySf">
<rect key="frame" x="20" y="144" width="467" height="5"/> <rect key="frame" x="20" y="145" width="467" height="5"/>
</box> </box>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="NPm-5h-2Mz"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="NPm-5h-2Mz">
<rect key="frame" x="65" y="242" width="115" height="17"/> <rect key="frame" x="65" y="242" width="115" height="17"/>
@@ -630,7 +635,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OmP-GD-2nA"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OmP-GD-2nA">
<rect key="frame" x="27" y="111" width="153" height="17"/> <rect key="frame" x="27" y="98" width="153" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Recommend key change" id="Xib-Fn-sqx"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Recommend key change" id="Xib-Fn-sqx">
<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"/>
@@ -638,7 +643,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="S0c-4E-42z"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="S0c-4E-42z">
<rect key="frame" x="56" y="59" width="124" height="17"/> <rect key="frame" x="56" y="46" width="124" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Enforce key change" id="5QH-N1-FHK"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Enforce key change" id="5QH-N1-FHK">
<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"/>
@@ -646,7 +651,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<button translatesAutoresizingMaskIntoConstraints="NO" id="VMc-Qg-eCr"> <button translatesAutoresizingMaskIntoConstraints="NO" id="VMc-Qg-eCr">
<rect key="frame" x="184" y="18" width="257" height="18"/> <rect key="frame" x="184" y="19" width="257" height="18"/>
<buttonCell key="cell" type="check" title="Force key change once after unlocking" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="pA1-aL-KjT"> <buttonCell key="cell" type="check" title="Force key change once after unlocking" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="pA1-aL-KjT">
<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"/>

View File

@@ -1,8 +1,9 @@
<?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="6254" systemVersion="13F34" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15702" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6254"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15702"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="MPDatePickingViewController"> <customObject id="-2" userLabel="File's Owner" customClass="MPDatePickingViewController">
@@ -15,24 +16,23 @@
<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 id="1"> <customView id="1">
<rect key="frame" x="0.0" y="0.0" width="316" height="259"/> <rect key="frame" x="0.0" y="0.0" width="180" height="134"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews> <subviews>
<datePicker horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3"> <datePicker horizontalHuggingPriority="750" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3">
<rect key="frame" x="20" y="91" width="277" height="148"/> <rect key="frame" x="20" y="91" width="143" height="27"/>
<datePickerCell key="cell" borderStyle="bezel" alignment="left" datePickerStyle="clockAndCalendar" id="4"> <datePickerCell key="cell" borderStyle="bezel" alignment="left" id="4">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<calendarDate key="date" timeIntervalSinceReferenceDate="-595929600" calendarFormat="%Y-%m-%d %H:%M:%S %z"> <date key="date" timeIntervalSinceReferenceDate="-595929600">
<!--1982-02-12 16:00:00 +0000--> <!--1982-02-12 16:00:00 +0000-->
<timeZone key="timeZone" name="US/Pacific"/> </date>
</calendarDate>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<datePickerElements key="datePickerElements" year="YES" month="YES" day="YES" hour="YES" minute="YES"/> <datePickerElements key="datePickerElements" year="YES" month="YES" day="YES" hour="YES" minute="YES"/>
</datePickerCell> </datePickerCell>
</datePicker> </datePicker>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="15"> <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="15">
<rect key="frame" x="18" y="47" width="281" height="26"/> <rect key="frame" x="18" y="47" width="145" height="25"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="16"> <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="16">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/> <font key="font" metaFont="menu"/>
@@ -43,7 +43,7 @@
</connections> </connections>
</popUpButton> </popUpButton>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="25"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="25">
<rect key="frame" x="226" y="18" width="70" height="25"/> <rect key="frame" x="90" y="19" width="70" height="23"/>
<buttonCell key="cell" type="roundTextured" title="Use Date" bezelStyle="texturedRounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="26"> <buttonCell key="cell" type="roundTextured" title="Use Date" bezelStyle="texturedRounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="26">
<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"/>
@@ -53,7 +53,7 @@
</connections> </connections>
</button> </button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="29"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="29">
<rect key="frame" x="162" y="18" width="56" height="25"/> <rect key="frame" x="26" y="19" width="56" height="23"/>
<buttonCell key="cell" type="roundTextured" title="Cancel" bezelStyle="texturedRounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="30"> <buttonCell key="cell" type="roundTextured" title="Cancel" bezelStyle="texturedRounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="30">
<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"/>
@@ -77,6 +77,7 @@
<constraint firstItem="15" firstAttribute="top" secondItem="3" secondAttribute="bottom" constant="20" symbolic="YES" id="qKB-vi-OAw"/> <constraint firstItem="15" firstAttribute="top" secondItem="3" secondAttribute="bottom" constant="20" symbolic="YES" id="qKB-vi-OAw"/>
<constraint firstItem="25" firstAttribute="top" secondItem="15" secondAttribute="bottom" constant="8" symbolic="YES" id="sxX-fk-xaJ"/> <constraint firstItem="25" firstAttribute="top" secondItem="15" secondAttribute="bottom" constant="8" symbolic="YES" id="sxX-fk-xaJ"/>
</constraints> </constraints>
<point key="canvasLocation" x="-89" y="77"/>
</customView> </customView>
</objects> </objects>
</document> </document>

View File

@@ -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="17701" 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="17701"/>
<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>
@@ -19,6 +19,7 @@
<outlet property="customFieldsTableView" destination="193" id="266"/> <outlet property="customFieldsTableView" destination="193" id="266"/>
<outlet property="enableAutotypeCheckButton" destination="kdV-Xa-8p3" id="vlC-HP-lBv"/> <outlet property="enableAutotypeCheckButton" destination="kdV-Xa-8p3" id="vlC-HP-lBv"/>
<outlet property="expiresCheckButton" destination="7" id="286"/> <outlet property="expiresCheckButton" destination="7" id="286"/>
<outlet property="fieldsStackView" destination="dx3-E2-FFt" id="GbY-9q-iEy"/>
<outlet property="generalView" destination="4" id="270"/> <outlet property="generalView" destination="4" id="270"/>
<outlet property="generatePasswordButton" destination="59" id="282"/> <outlet property="generatePasswordButton" destination="59" id="282"/>
<outlet property="infoTabControl" destination="82" id="264"/> <outlet property="infoTabControl" destination="82" id="264"/>
@@ -46,8 +47,8 @@
<rect key="frame" x="0.0" y="0.0" width="293" height="493"/> <rect key="frame" x="0.0" y="0.0" width="293" height="493"/>
<subviews> <subviews>
<segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="82"> <segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="82">
<rect key="frame" x="57" y="469" width="179" height="19"/> <rect key="frame" x="76" y="470" width="142" height="19"/>
<segmentedCell key="cell" controlSize="small" borderStyle="border" alignment="left" style="texturedSquare" trackingMode="selectOne" id="238"> <segmentedCell key="cell" controlSize="small" borderStyle="border" alignment="left" style="capsule" trackingMode="selectOne" id="238">
<font key="font" metaFont="smallSystem"/> <font key="font" metaFont="smallSystem"/>
<segments> <segments>
<segment label="General" selected="YES"/> <segment label="General" selected="YES"/>
@@ -96,18 +97,17 @@
<rect key="frame" x="20" y="26" width="253" height="396"/> <rect key="frame" x="20" y="26" width="253" height="396"/>
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="F3N-QI-Di5"> <clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="F3N-QI-Di5">
<rect key="frame" x="1" y="1" width="251" height="394"/> <rect key="frame" x="1" y="1" width="251" height="394"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask"/>
<subviews> <subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" multipleSelection="NO" autosaveColumns="NO" rowHeight="36" rowSizeStyle="automatic" viewBased="YES" id="137"> <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" multipleSelection="NO" autosaveColumns="NO" rowHeight="36" rowSizeStyle="automatic" viewBased="YES" id="137">
<rect key="frame" x="0.0" y="0.0" width="251" height="394"/> <rect key="frame" x="0.0" y="0.0" width="251" height="394"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="2"/> <size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="alternateSelectedControlTextColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="alternateSelectedControlTextColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/> <color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns> <tableColumns>
<tableColumn width="248" minWidth="40" maxWidth="1000" id="140"> <tableColumn width="219" minWidth="40" maxWidth="1000" id="140">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left"> <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="0.33333298560000002" alpha="1" colorSpace="calibratedWhite"/> <color key="backgroundColor" white="0.33333298560000002" alpha="1" colorSpace="calibratedWhite"/>
</tableHeaderCell> </tableHeaderCell>
@@ -119,11 +119,11 @@
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/> <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews> <prototypeCellViews>
<tableCellView identifier="NormalCell" id="143"> <tableCellView identifier="NormalCell" id="143">
<rect key="frame" x="1" y="1" width="248" height="36"/> <rect key="frame" x="11" y="1" width="228" height="36"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<imageView translatesAutoresizingMaskIntoConstraints="NO" id="144"> <imageView translatesAutoresizingMaskIntoConstraints="NO" id="144">
<rect key="frame" x="3" y="2" width="32" height="32"/> <rect key="frame" x="3" y="-1" width="32" height="38"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="32" id="153"/> <constraint firstAttribute="width" constant="32" id="153"/>
<constraint firstAttribute="height" constant="32" id="154"/> <constraint firstAttribute="height" constant="32" id="154"/>
@@ -131,7 +131,7 @@
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSActionTemplate" id="152"/> <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSActionTemplate" id="152"/>
</imageView> </imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="145"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="145">
<rect key="frame" x="41" y="10" width="206" height="17"/> <rect key="frame" x="41" y="10" width="186" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="151"> <textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="151">
<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"/>
@@ -152,11 +152,11 @@
</connections> </connections>
</tableCellView> </tableCellView>
<tableCellView identifier="SelectedCell" id="141" customClass="MPSelectedAttachmentTableCellView"> <tableCellView identifier="SelectedCell" id="141" customClass="MPSelectedAttachmentTableCellView">
<rect key="frame" x="1" y="39" width="248" height="36"/> <rect key="frame" x="11" y="39" width="228" height="36"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<imageView translatesAutoresizingMaskIntoConstraints="NO" id="167"> <imageView translatesAutoresizingMaskIntoConstraints="NO" id="167">
<rect key="frame" x="3" y="2" width="32" height="32"/> <rect key="frame" x="3" y="-1" width="32" height="38"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="32" id="168"/> <constraint firstAttribute="height" constant="32" id="168"/>
<constraint firstAttribute="width" constant="32" id="169"/> <constraint firstAttribute="width" constant="32" id="169"/>
@@ -164,7 +164,7 @@
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSActionTemplate" id="170"/> <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSActionTemplate" id="170"/>
</imageView> </imageView>
<textField horizontalHuggingPriority="249" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="166"> <textField horizontalHuggingPriority="249" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="166">
<rect key="frame" x="41" y="10" width="158" height="17"/> <rect key="frame" x="41" y="10" width="131" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="171"> <textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="171">
<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"/>
@@ -172,7 +172,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="42g-QS-XtW"> <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="42g-QS-XtW">
<rect key="frame" x="205" y="6" width="40" height="23"/> <rect key="frame" x="175" y="4" width="54" height="25"/>
<popUpButtonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" borderStyle="border" imageScaling="proportionallyDown" inset="2" pullsDown="YES" altersStateOfSelectedItem="NO" id="nJc-UT-cas"> <popUpButtonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" borderStyle="border" imageScaling="proportionallyDown" inset="2" pullsDown="YES" altersStateOfSelectedItem="NO" id="nJc-UT-cas">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/> <font key="font" metaFont="menu"/>
@@ -259,182 +259,13 @@
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="82" secondAttribute="trailing" constant="20" symbolic="YES" id="4df-0Y-ggz"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="82" secondAttribute="trailing" constant="20" symbolic="YES" id="4df-0Y-ggz"/>
<constraint firstItem="82" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="3" secondAttribute="leading" constant="20" symbolic="YES" id="zU6-5h-Swa"/> <constraint firstItem="82" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="3" secondAttribute="leading" constant="20" symbolic="YES" id="zU6-5h-Swa"/>
</constraints> </constraints>
<point key="canvasLocation" x="391" y="-865"/> <point key="canvasLocation" x="-680" y="-1408"/>
</view> </view>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="4" customClass="HNHUIScrollDocumentViewAdapter"> <customView translatesAutoresizingMaskIntoConstraints="NO" id="4" customClass="HNHUIScrollDocumentViewAdapter">
<rect key="frame" x="0.0" y="0.0" width="291" height="712"/> <rect key="frame" x="0.0" y="0.0" width="291" height="484"/>
<subviews> <subviews>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="52">
<rect key="frame" x="18" y="693" width="27" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Title" id="71">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="249" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="53" customClass="HNHUITextField">
<rect key="frame" x="20" y="663" width="251" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="7Xj-3i-fBY"/>
</constraints>
<textFieldCell key="cell" lineBreakMode="truncatingTail" truncatesLastVisibleLine="YES" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" usesSingleLineMode="YES" id="70">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<outlet property="delegate" destination="-2" id="pQH-Xf-3pz"/>
<outlet property="nextKeyView" destination="55" id="FgE-cj-E5Z"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="54">
<rect key="frame" x="18" y="637" width="58" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Username" id="69">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="249" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="55" customClass="HNHUITextField">
<rect key="frame" x="20" y="607" width="251" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="0l5-fD-0eW"/>
</constraints>
<textFieldCell key="cell" lineBreakMode="truncatingTail" truncatesLastVisibleLine="YES" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" usesSingleLineMode="YES" id="68">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<outlet property="delegate" destination="-2" id="22y-I8-aaG"/>
<outlet property="nextKeyView" destination="60" id="ZPp-lg-TBS"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="56" customClass="HNHUITextField">
<rect key="frame" x="20" y="469" width="251" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="SoS-8e-rkN"/>
</constraints>
<textFieldCell key="cell" lineBreakMode="truncatingTail" truncatesLastVisibleLine="YES" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" usesSingleLineMode="YES" id="67">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<outlet property="delegate" destination="-2" id="LzV-u6-mkP"/>
<outlet property="nextKeyView" destination="7" id="8Vo-ZR-aWE"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="57">
<rect key="frame" x="18" y="499" width="26" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="URL" id="66">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="58">
<rect key="frame" x="18" y="581" width="55" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Password" id="65">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="59">
<rect key="frame" x="20" y="520" width="251" height="23"/>
<buttonCell key="cell" type="roundTextured" title="Generate" bezelStyle="texturedRounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="64">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="showPasswordGenerator:" target="-2" id="xxV-lD-L1K"/>
<outlet property="nextKeyView" destination="56" id="rY0-PH-WBT"/>
</connections>
</button>
<secureTextField verticalHuggingPriority="750" horizontalCompressionResistancePriority="249" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="60" customClass="HNHUISecureTextField">
<rect key="frame" x="20" y="551" width="211" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="VFI-jo-tOU"/>
</constraints>
<secureTextFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" usesSingleLineMode="YES" id="63">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<allowedInputSourceLocales>
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
</allowedInputSourceLocales>
</secureTextFieldCell>
<connections>
<outlet property="delegate" destination="-2" id="RBf-26-U9y"/>
<outlet property="nextKeyView" destination="61" id="5yc-GS-oVG"/>
</connections>
</secureTextField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="61">
<rect key="frame" x="239" y="550" width="32" height="23"/>
<constraints>
<constraint firstAttribute="width" constant="32" id="rSr-fw-11t"/>
</constraints>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSQuickLookTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="62">
<behavior key="behavior" pushIn="YES" changeContents="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<outlet property="nextKeyView" destination="59" id="ZRe-l9-kNq"/>
</connections>
</button>
<button horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="7">
<rect key="frame" x="18" y="441" width="67" height="18"/>
<constraints>
<constraint firstAttribute="height" constant="14" id="vgc-Xu-RJs"/>
</constraints>
<buttonCell key="cell" type="check" title="Expires" bezelStyle="regularSquare" imagePosition="left" lineBreakMode="truncatingMiddle" state="on" inset="2" id="78">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="toggleExpire:" target="-2" id="EBe-2q-ASh"/>
<outlet property="nextKeyView" destination="8" id="SbJ-ZA-mXZ"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="8">
<rect key="frame" x="239" y="438" width="32" height="23"/>
<constraints>
<constraint firstAttribute="width" constant="32" id="Ped-nx-uti"/>
</constraints>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSActionTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="77">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="pickExpiryDate:" target="-1" id="DQK-sp-SIL"/>
<outlet property="nextKeyView" destination="5" id="cVg-qt-OBX"/>
</connections>
</button>
<tokenField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="5">
<rect key="frame" x="20" y="332" width="251" height="77"/>
<constraints>
<constraint firstAttribute="height" constant="77" id="80"/>
</constraints>
<tokenFieldCell key="cell" selectable="YES" editable="YES" borderStyle="bezel" alignment="left" drawsBackground="YES" allowsEditingTextAttributes="YES" id="81">
<font key="font" metaFont="cellTitle"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</tokenFieldCell>
<connections>
<outlet property="nextKeyView" destination="193" id="Kb5-0L-Lkd"/>
</connections>
</tokenField>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6">
<rect key="frame" x="18" y="417" width="29" height="14"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Tags" id="79">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="249" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="0U8-TS-giU"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="249" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="0U8-TS-giU">
<rect key="frame" x="18" y="80" width="32" height="14"/> <rect key="frame" x="18" y="77" width="32" height="14"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="UUID" id="vTq-N1-5oa"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="UUID" id="vTq-N1-5oa">
<font key="font" metaFont="smallSystem"/> <font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
@@ -442,10 +273,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="249" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="IpW-b2-jWu" customClass="HNHUITextField"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="249" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="IpW-b2-jWu" customClass="HNHUITextField">
<rect key="frame" x="20" y="50" width="251" height="22"/> <rect key="frame" x="20" y="48" width="251" height="21"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="Zfy-mh-1TF"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="Hml-NR-AeS"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="Hml-NR-AeS">
<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"/>
@@ -456,7 +284,7 @@
</connections> </connections>
</textField> </textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="QSX-Xo-tcH"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="QSX-Xo-tcH">
<rect key="frame" x="20" y="19" width="251" height="23"/> <rect key="frame" x="19" y="18" width="253" height="23"/>
<buttonCell key="cell" type="roundTextured" title="Show Plugin Data" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="X9y-K7-lix"> <buttonCell key="cell" type="roundTextured" title="Show Plugin Data" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="X9y-K7-lix">
<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"/>
@@ -467,7 +295,7 @@
</connections> </connections>
</button> </button>
<segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="G9J-nn-2bu" customClass="MPContextButton"> <segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="G9J-nn-2bu" customClass="MPContextButton">
<rect key="frame" x="216" y="101" width="55" height="23"/> <rect key="frame" x="219" y="98" width="54" height="24"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="texturedRounded" trackingMode="selectOne" id="POU-2t-8fl"> <segmentedCell key="cell" borderStyle="border" alignment="left" style="texturedRounded" trackingMode="selectOne" id="POU-2t-8fl">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<segments> <segments>
@@ -480,68 +308,238 @@
<outlet property="nextKeyView" destination="QSX-Xo-tcH" id="P9m-Wl-V3E"/> <outlet property="nextKeyView" destination="QSX-Xo-tcH" id="P9m-Wl-V3E"/>
</connections> </connections>
</segmentedControl> </segmentedControl>
<stackView distribution="fill" orientation="vertical" alignment="leading" horizontalStackHuggingPriority="250" verticalStackHuggingPriority="250" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="dx3-E2-FFt">
<rect key="frame" x="20" y="135" width="251" height="329"/>
<subviews>
<textField horizontalHuggingPriority="249" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="52">
<rect key="frame" x="-2" y="315" width="255" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Title" id="71">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="249" verticalHuggingPriority="750" horizontalCompressionResistancePriority="249" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="53" customClass="HNHUITextField">
<rect key="frame" x="0.0" y="286" width="251" height="21"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" truncatesLastVisibleLine="YES" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" usesSingleLineMode="YES" id="70">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<outlet property="delegate" destination="-2" id="pQH-Xf-3pz"/>
<outlet property="nextKeyView" destination="55" id="FgE-cj-E5Z"/>
</connections>
</textField>
<textField horizontalHuggingPriority="249" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="54">
<rect key="frame" x="-2" y="264" width="255" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Username" id="69">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="249" verticalHuggingPriority="750" horizontalCompressionResistancePriority="249" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="55" customClass="HNHUITextField">
<rect key="frame" x="0.0" y="236" width="251" height="20"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" truncatesLastVisibleLine="YES" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" usesSingleLineMode="YES" id="68">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<outlet property="delegate" destination="-2" id="22y-I8-aaG"/>
<outlet property="nextKeyView" destination="60" id="ZPp-lg-TBS"/>
</connections>
</textField>
<textField horizontalHuggingPriority="249" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="58">
<rect key="frame" x="-2" y="214" width="255" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Password" id="65">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<stackView distribution="fill" orientation="horizontal" alignment="centerY" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" horizontalHuggingPriority="249" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="C4J-K4-QBG">
<rect key="frame" x="0.0" y="186" width="251" height="20"/>
<subviews>
<secureTextField horizontalHuggingPriority="249" verticalHuggingPriority="750" horizontalCompressionResistancePriority="249" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="60" customClass="HNHUISecureTextField">
<rect key="frame" x="0.0" y="0.0" width="135" height="20"/>
<secureTextFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" usesSingleLineMode="YES" id="63" customClass="HNHUISecureTextFieldCell">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<allowedInputSourceLocales>
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
</allowedInputSourceLocales>
</secureTextFieldCell>
<connections>
<outlet property="delegate" destination="-2" id="RBf-26-U9y"/>
<outlet property="nextKeyView" destination="61" id="5yc-GS-oVG"/>
</connections>
</secureTextField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="61">
<rect key="frame" x="142" y="-2" width="32" height="23"/>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSQuickLookTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="62">
<behavior key="behavior" pushIn="YES" changeContents="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<outlet property="nextKeyView" destination="59" id="ZRe-l9-kNq"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="59">
<rect key="frame" x="180" y="-2" width="72" height="23"/>
<buttonCell key="cell" type="roundTextured" title="Generate" bezelStyle="texturedRounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="64">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="showPasswordGenerator:" target="-2" id="xxV-lD-L1K"/>
<outlet property="nextKeyView" destination="56" id="rY0-PH-WBT"/>
</connections>
</button>
</subviews>
<visibilityPriorities>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
</visibilityPriorities>
<customSpacing>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
<textField horizontalHuggingPriority="249" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="57">
<rect key="frame" x="-2" y="164" width="255" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="URL" id="66">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="56" customClass="HNHUITextField">
<rect key="frame" x="0.0" y="135" width="251" height="21"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" truncatesLastVisibleLine="YES" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" usesSingleLineMode="YES" id="67">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<outlet property="delegate" destination="-2" id="LzV-u6-mkP"/>
<outlet property="nextKeyView" destination="7" id="8Vo-ZR-aWE"/>
</connections>
</textField>
<stackView distribution="fill" orientation="horizontal" alignment="centerY" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" horizontalHuggingPriority="248" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="buA-UH-XId">
<rect key="frame" x="0.0" y="107" width="251" height="20"/>
<subviews>
<button horizontalHuggingPriority="249" horizontalCompressionResistancePriority="249" translatesAutoresizingMaskIntoConstraints="NO" id="7">
<rect key="frame" x="-2" y="1" width="214" height="18"/>
<buttonCell key="cell" type="check" title="Expires" bezelStyle="regularSquare" imagePosition="left" lineBreakMode="truncatingMiddle" state="on" inset="2" id="78">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="toggleExpire:" target="-2" id="EBe-2q-ASh"/>
<outlet property="nextKeyView" destination="8" id="SbJ-ZA-mXZ"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="8">
<rect key="frame" x="213" y="-7" width="45" height="32"/>
<buttonCell key="cell" type="push" bezelStyle="rounded" image="NSActionTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="77">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="pickExpiryDate:" target="-1" id="DQK-sp-SIL"/>
<outlet property="nextKeyView" destination="5" id="cVg-qt-OBX"/>
</connections>
</button>
</subviews>
<visibilityPriorities>
<integer value="1000"/>
<integer value="1000"/>
</visibilityPriorities>
<customSpacing>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
<textField horizontalHuggingPriority="249" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6">
<rect key="frame" x="-2" y="85" width="255" height="14"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Tags" id="79">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<tokenField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="5">
<rect key="frame" x="0.0" y="0.0" width="251" height="77"/>
<constraints>
<constraint firstAttribute="height" constant="77" id="80"/>
</constraints>
<tokenFieldCell key="cell" selectable="YES" editable="YES" borderStyle="bezel" alignment="left" drawsBackground="YES" allowsEditingTextAttributes="YES" id="81">
<font key="font" metaFont="cellTitle"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</tokenFieldCell>
<connections>
<outlet property="nextKeyView" destination="193" id="Kb5-0L-Lkd"/>
</connections>
</tokenField>
</subviews>
<visibilityPriorities>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
</visibilityPriorities>
<customSpacing>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstItem="52" firstAttribute="top" secondItem="4" secondAttribute="top" constant="5" id="11"/>
<constraint firstItem="52" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="12"/>
<constraint firstItem="53" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="13"/>
<constraint firstItem="53" firstAttribute="top" secondItem="52" secondAttribute="bottom" constant="8" symbolic="YES" id="14"/>
<constraint firstAttribute="trailing" secondItem="53" secondAttribute="trailing" constant="20" symbolic="YES" id="15"/>
<constraint firstItem="54" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="16"/>
<constraint firstItem="54" firstAttribute="top" secondItem="53" secondAttribute="bottom" constant="12" id="17"/>
<constraint firstItem="55" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="18"/>
<constraint firstItem="55" firstAttribute="top" secondItem="54" secondAttribute="bottom" constant="8" symbolic="YES" id="19"/>
<constraint firstAttribute="trailing" secondItem="55" secondAttribute="trailing" constant="20" symbolic="YES" id="20"/>
<constraint firstItem="57" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="21"/>
<constraint firstItem="56" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="23"/>
<constraint firstItem="56" firstAttribute="top" secondItem="57" secondAttribute="bottom" constant="8" symbolic="YES" id="24"/>
<constraint firstAttribute="trailing" secondItem="56" secondAttribute="trailing" constant="20" symbolic="YES" id="25"/>
<constraint firstItem="58" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="26"/>
<constraint firstItem="60" firstAttribute="top" secondItem="58" secondAttribute="bottom" constant="8" symbolic="YES" id="29"/>
<constraint firstItem="60" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="30"/>
<constraint firstItem="59" firstAttribute="top" secondItem="61" secondAttribute="bottom" constant="8" symbolic="YES" id="31"/>
<constraint firstItem="59" firstAttribute="top" secondItem="60" secondAttribute="bottom" constant="8" symbolic="YES" id="32"/>
<constraint firstItem="59" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="33"/>
<constraint firstAttribute="trailing" secondItem="59" secondAttribute="trailing" constant="20" symbolic="YES" id="34"/>
<constraint firstItem="61" firstAttribute="leading" secondItem="60" secondAttribute="trailing" constant="8" symbolic="YES" id="40"/>
<constraint firstAttribute="trailing" secondItem="61" secondAttribute="trailing" constant="20" symbolic="YES" id="41"/>
<constraint firstItem="7" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="42"/>
<constraint firstItem="7" firstAttribute="centerY" secondItem="8" secondAttribute="centerY" id="43"/>
<constraint firstItem="6" firstAttribute="top" secondItem="7" secondAttribute="bottom" constant="12" id="44"/>
<constraint firstItem="6" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="45"/>
<constraint firstAttribute="trailing" secondItem="8" secondAttribute="trailing" constant="20" symbolic="YES" id="47"/>
<constraint firstItem="5" firstAttribute="top" secondItem="6" secondAttribute="bottom" constant="8" symbolic="YES" id="48"/>
<constraint firstItem="5" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="49"/>
<constraint firstAttribute="trailing" secondItem="5" secondAttribute="trailing" constant="20" symbolic="YES" id="50"/>
<constraint firstItem="QSX-Xo-tcH" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="2AA-hQ-mL7"/> <constraint firstItem="QSX-Xo-tcH" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="2AA-hQ-mL7"/>
<constraint firstItem="IpW-b2-jWu" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" id="51R-pR-KLO"/> <constraint firstItem="IpW-b2-jWu" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" id="51R-pR-KLO"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="52" secondAttribute="trailing" constant="20" symbolic="YES" id="6P6-fW-kGx"/>
<constraint firstAttribute="trailing" secondItem="IpW-b2-jWu" secondAttribute="trailing" constant="20" id="D0t-s7-2hT"/> <constraint firstAttribute="trailing" secondItem="IpW-b2-jWu" secondAttribute="trailing" constant="20" id="D0t-s7-2hT"/>
<constraint firstItem="7" firstAttribute="top" secondItem="56" secondAttribute="bottom" constant="12" id="Gh9-Lg-kcm"/> <constraint firstAttribute="bottom" secondItem="QSX-Xo-tcH" secondAttribute="bottom" constant="20" symbolic="YES" id="Fpp-iu-smS"/>
<constraint firstItem="IpW-b2-jWu" firstAttribute="top" secondItem="0U8-TS-giU" secondAttribute="bottom" constant="8" symbolic="YES" id="HSM-Aj-X9I"/> <constraint firstItem="IpW-b2-jWu" firstAttribute="top" secondItem="0U8-TS-giU" secondAttribute="bottom" constant="8" symbolic="YES" id="HSM-Aj-X9I"/>
<constraint firstItem="58" firstAttribute="top" secondItem="55" secondAttribute="bottom" constant="12" id="JiM-Dm-AG8"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="57" secondAttribute="trailing" constant="20" symbolic="YES" id="N4A-wg-PdS"/>
<constraint firstItem="QSX-Xo-tcH" firstAttribute="top" secondItem="IpW-b2-jWu" secondAttribute="bottom" constant="8" symbolic="YES" id="TPp-cx-48q"/> <constraint firstItem="QSX-Xo-tcH" firstAttribute="top" secondItem="IpW-b2-jWu" secondAttribute="bottom" constant="8" symbolic="YES" id="TPp-cx-48q"/>
<constraint firstItem="8" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="7" secondAttribute="trailing" constant="8" symbolic="YES" id="Xa5-Ir-XNC"/>
<constraint firstAttribute="bottom" secondItem="QSX-Xo-tcH" secondAttribute="bottom" constant="20" symbolic="YES" id="ZdF-5c-xDa"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="0U8-TS-giU" secondAttribute="trailing" constant="20" symbolic="YES" id="a5R-eI-VuV"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="0U8-TS-giU" secondAttribute="trailing" constant="20" symbolic="YES" id="a5R-eI-VuV"/>
<constraint firstItem="0U8-TS-giU" firstAttribute="top" secondItem="G9J-nn-2bu" secondAttribute="bottom" constant="8" symbolic="YES" id="aes-tv-LHA"/> <constraint firstItem="0U8-TS-giU" firstAttribute="top" secondItem="G9J-nn-2bu" secondAttribute="bottom" constant="8" symbolic="YES" id="aes-tv-LHA"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="54" secondAttribute="trailing" constant="20" symbolic="YES" id="cYP-oK-dVP"/> <constraint firstAttribute="trailing" secondItem="dx3-E2-FFt" secondAttribute="trailing" constant="20" symbolic="YES" id="esd-fR-ZGC"/>
<constraint firstAttribute="trailing" secondItem="G9J-nn-2bu" secondAttribute="trailing" constant="20" symbolic="YES" id="ggu-f5-LtR"/> <constraint firstAttribute="trailing" secondItem="G9J-nn-2bu" secondAttribute="trailing" constant="20" symbolic="YES" id="ggu-f5-LtR"/>
<constraint firstAttribute="trailing" secondItem="QSX-Xo-tcH" secondAttribute="trailing" constant="20" symbolic="YES" id="hr2-Eb-g24"/> <constraint firstAttribute="trailing" secondItem="QSX-Xo-tcH" secondAttribute="trailing" constant="20" symbolic="YES" id="hr2-Eb-g24"/>
<constraint firstItem="dx3-E2-FFt" firstAttribute="top" secondItem="4" secondAttribute="top" constant="20" symbolic="YES" id="k31-5b-7n6"/>
<constraint firstItem="0U8-TS-giU" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" id="kLH-Bj-C5m"/> <constraint firstItem="0U8-TS-giU" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" id="kLH-Bj-C5m"/>
<constraint firstItem="57" firstAttribute="top" secondItem="59" secondAttribute="bottom" constant="8" symbolic="YES" id="lYe-am-xJx"/> <constraint firstItem="dx3-E2-FFt" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="sjr-Xo-zxh"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="58" secondAttribute="trailing" constant="20" symbolic="YES" id="rbs-i7-bti"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="6" secondAttribute="trailing" constant="20" symbolic="YES" id="uuh-ba-z4h"/>
<constraint firstItem="G9J-nn-2bu" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="z4K-PB-Qfb"/> <constraint firstItem="G9J-nn-2bu" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="z4K-PB-Qfb"/>
</constraints> </constraints>
<point key="canvasLocation" x="-679" y="-1054"/> <point key="canvasLocation" x="-304" y="-1442"/>
</customView> </customView>
<view translatesAutoresizingMaskIntoConstraints="NO" id="zv7-wE-Bmg" customClass="HNHUIScrollDocumentViewAdapter"> <view translatesAutoresizingMaskIntoConstraints="NO" id="zv7-wE-Bmg" customClass="HNHUIScrollDocumentViewAdapter">
<rect key="frame" x="0.0" y="0.0" width="301" height="424"/> <rect key="frame" x="0.0" y="0.0" width="301" height="424"/>
<subviews> <subviews>
<button translatesAutoresizingMaskIntoConstraints="NO" id="kdV-Xa-8p3"> <button translatesAutoresizingMaskIntoConstraints="NO" id="kdV-Xa-8p3">
<rect key="frame" x="18" y="398" width="265" height="18"/> <rect key="frame" x="18" y="399" width="263" height="16"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="14" id="c9A-Ju-Cj9"/> <constraint firstAttribute="height" constant="14" id="c9A-Ju-Cj9"/>
</constraints> </constraints>
@@ -551,7 +549,7 @@
</buttonCell> </buttonCell>
</button> </button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="I7L-Am-Qpa"> <button translatesAutoresizingMaskIntoConstraints="NO" id="I7L-Am-Qpa">
<rect key="frame" x="18" y="378" width="265" height="18"/> <rect key="frame" x="18" y="379" width="263" height="16"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="14" id="KKP-xg-uUu"/> <constraint firstAttribute="height" constant="14" id="KKP-xg-uUu"/>
</constraints> </constraints>
@@ -569,10 +567,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cDK-DM-F5z" customClass="HNHUITextField"> <textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cDK-DM-F5z" customClass="HNHUITextField">
<rect key="frame" x="20" y="328" width="221" height="22"/> <rect key="frame" x="20" y="329" width="228" height="21"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="2hC-UP-Iie"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="Custom Entry Sequence" drawsBackground="YES" id="R2X-Ex-c6q"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="Custom Entry Sequence" drawsBackground="YES" id="R2X-Ex-c6q">
<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"/>
@@ -580,7 +575,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="iR3-FU-MYu"> <textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="iR3-FU-MYu">
<rect key="frame" x="18" y="306" width="265" height="14"/> <rect key="frame" x="18" y="307" width="265" height="14"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="14" id="xvF-LU-XNu"/> <constraint firstAttribute="height" constant="14" id="xvF-LU-XNu"/>
</constraints> </constraints>
@@ -591,21 +586,20 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<scrollView autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2YH-c2-Cwc"> <scrollView autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="2YH-c2-Cwc">
<rect key="frame" x="20" y="138" width="261" height="160"/> <rect key="frame" x="20" y="136" width="261" height="163"/>
<clipView key="contentView" id="aDE-WT-YIv"> <clipView key="contentView" id="aDE-WT-YIv">
<rect key="frame" x="1" y="1" width="259" height="158"/> <rect key="frame" x="1" y="1" width="259" height="161"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" columnReordering="NO" columnSelection="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" id="caM-L6-UHC"> <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" columnReordering="NO" columnSelection="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" id="caM-L6-UHC">
<rect key="frame" x="0.0" y="0.0" width="259" height="158"/> <rect key="frame" x="0.0" y="0.0" width="259" height="161"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<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"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/> <color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns> <tableColumns>
<tableColumn width="256" minWidth="40" maxWidth="1000" id="Wdn-k1-39b"> <tableColumn width="247" minWidth="40" maxWidth="1000" id="Wdn-k1-39b">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left"> <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="0.33333298560000002" alpha="1" colorSpace="calibratedWhite"/> <color key="backgroundColor" white="0.33333298560000002" alpha="1" colorSpace="calibratedWhite"/>
</tableHeaderCell> </tableHeaderCell>
@@ -651,10 +645,7 @@
</scroller> </scroller>
</scrollView> </scrollView>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Iy9-9L-Aev"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Iy9-9L-Aev">
<rect key="frame" x="249" y="107" width="32" height="23"/> <rect key="frame" x="256" y="106" width="26" height="23"/>
<constraints>
<constraint firstAttribute="width" constant="32" id="mjs-Yf-Cb2"/>
</constraints>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSAddTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="5J6-uD-iK6"> <buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSAddTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="5J6-uD-iK6">
<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"/>
@@ -664,10 +655,7 @@
</connections> </connections>
</button> </button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="AAj-Ak-z46"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="AAj-Ak-z46">
<rect key="frame" x="209" y="107" width="32" height="23"/> <rect key="frame" x="224" y="106" width="26" height="23"/>
<constraints>
<constraint firstAttribute="width" constant="32" id="vWY-ez-gy9"/>
</constraints>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSRemoveTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="86n-d4-lOW"> <buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSRemoveTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="86n-d4-lOW">
<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"/>
@@ -677,7 +665,7 @@
</connections> </connections>
</button> </button>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="HQa-of-iwh"> <textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="HQa-of-iwh">
<rect key="frame" x="18" y="90" width="265" height="14"/> <rect key="frame" x="18" y="88" width="265" height="14"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="14" id="GF5-sR-zdR"/> <constraint firstAttribute="height" constant="14" id="GF5-sR-zdR"/>
</constraints> </constraints>
@@ -688,10 +676,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<comboBox verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="rD3-Wn-ZFX"> <comboBox verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="rD3-Wn-ZFX">
<rect key="frame" x="20" y="58" width="264" height="26"/> <rect key="frame" x="20" y="57" width="264" height="25"/>
<constraints>
<constraint firstAttribute="height" constant="20" id="rXS-QE-6cW"/>
</constraints>
<comboBoxCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" completes="NO" id="VLq-Hn-aei"> <comboBoxCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" completes="NO" id="VLq-Hn-aei">
<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"/>
@@ -699,7 +684,7 @@
</comboBoxCell> </comboBoxCell>
</comboBox> </comboBox>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="z03-zW-GN3"> <textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="z03-zW-GN3">
<rect key="frame" x="18" y="40" width="265" height="14"/> <rect key="frame" x="18" y="39" width="265" height="14"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="14" id="MPq-gU-72D"/> <constraint firstAttribute="height" constant="14" id="MPq-gU-72D"/>
</constraints> </constraints>
@@ -710,10 +695,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="NjR-ea-Y7k" customClass="HNHUITextField"> <textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="NjR-ea-Y7k" customClass="HNHUITextField">
<rect key="frame" x="20" y="10" width="221" height="22"/> <rect key="frame" x="20" y="10" width="228" height="21"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="oIA-8f-Jkf"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="Custom Window Sequence" drawsBackground="YES" id="fW9-9p-wwR"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="Custom Window Sequence" drawsBackground="YES" id="fW9-9p-wwR">
<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"/>
@@ -721,10 +703,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="m1C-m8-BKR"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="m1C-m8-BKR">
<rect key="frame" x="249" y="9" width="32" height="23"/> <rect key="frame" x="255" y="9" width="27" height="23"/>
<constraints>
<constraint firstAttribute="width" constant="32" id="Ek5-IH-qGo"/>
</constraints>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSActionTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="HIC-T9-j9G"> <buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSActionTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="HIC-T9-j9G">
<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"/>
@@ -734,10 +713,7 @@
</connections> </connections>
</button> </button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="HDS-Bz-jrr"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="HDS-Bz-jrr">
<rect key="frame" x="249" y="326" width="32" height="23"/> <rect key="frame" x="255" y="327" width="27" height="23"/>
<constraints>
<constraint firstAttribute="width" constant="32" id="CbR-2P-dZH"/>
</constraints>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSActionTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="V5Z-qf-FVH"> <buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSActionTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="V5Z-qf-FVH">
<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"/>
@@ -788,24 +764,23 @@
<constraint firstAttribute="trailing" secondItem="45R-v4-ywl" secondAttribute="trailing" constant="20" symbolic="YES" id="uUm-S5-cxM"/> <constraint firstAttribute="trailing" secondItem="45R-v4-ywl" secondAttribute="trailing" constant="20" symbolic="YES" id="uUm-S5-cxM"/>
<constraint firstAttribute="trailing" secondItem="z03-zW-GN3" secondAttribute="trailing" constant="20" symbolic="YES" id="wiq-pY-TG8"/> <constraint firstAttribute="trailing" secondItem="z03-zW-GN3" secondAttribute="trailing" constant="20" symbolic="YES" id="wiq-pY-TG8"/>
</constraints> </constraints>
<point key="canvasLocation" x="39" y="-995"/> <point key="canvasLocation" x="146" y="-1275"/>
</view> </view>
<scrollView borderType="line" autohidesScrollers="YES" horizontalLineScroll="56" horizontalPageScroll="10" verticalLineScroll="56" verticalPageScroll="10" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="180" customClass="HNHUIScrollView"> <scrollView borderType="line" autohidesScrollers="YES" horizontalLineScroll="56" horizontalPageScroll="10" verticalLineScroll="56" verticalPageScroll="10" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="180" customClass="HNHUIScrollView">
<rect key="frame" x="0.0" y="0.0" width="261" height="270"/> <rect key="frame" x="0.0" y="0.0" width="261" height="268"/>
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="k8G-zp-BXZ"> <clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="k8G-zp-BXZ">
<rect key="frame" x="1" y="1" width="259" height="268"/> <rect key="frame" x="1" y="1" width="259" height="266"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<tableView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" selectionHighlightStyle="none" columnSelection="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="54" viewBased="YES" id="193" customClass="MPCustomFieldTableView"> <tableView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" selectionHighlightStyle="none" columnSelection="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="54" viewBased="YES" id="193">
<rect key="frame" x="0.0" y="0.0" width="259" height="268"/> <rect key="frame" x="0.0" y="0.0" width="259" height="266"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<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"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/> <color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns> <tableColumns>
<tableColumn width="256" minWidth="40" maxWidth="1000000" id="194"> <tableColumn width="247" minWidth="40" maxWidth="1000000" id="194">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left"> <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="0.33333298560000002" alpha="1" colorSpace="calibratedWhite"/> <color key="backgroundColor" white="0.33333298560000002" alpha="1" colorSpace="calibratedWhite"/>
</tableHeaderCell> </tableHeaderCell>
@@ -817,23 +792,22 @@
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/> <tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
<prototypeCellViews> <prototypeCellViews>
<tableCellView identifier="SelectedCell" id="196" customClass="MPCustomFieldTableCellView"> <tableCellView identifier="SelectedCell" id="196" customClass="MPCustomFieldTableCellView">
<rect key="frame" x="1" y="1" width="256" height="54"/> <rect key="frame" x="1" y="1" width="256" height="53"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="199" customClass="HNHUISecureTextField"> <textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="199" customClass="HNHUISecureTextField">
<rect key="frame" x="3" y="10" width="139" height="22"/> <rect key="frame" x="3" y="10" width="153" height="21"/>
<constraints> <constraints>
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="22" id="212"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="50" id="213"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="50" id="213"/>
</constraints> </constraints>
<textFieldCell key="cell" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="Value" drawsBackground="YES" id="214"> <textFieldCell key="cell" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="Value" drawsBackground="YES" id="214" customClass="HNHUISecureTextFieldCell">
<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="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="200"> <textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="200">
<rect key="frame" x="1" y="40" width="223" height="14"/> <rect key="frame" x="1" y="39" width="223" height="14"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="14" id="210"/> <constraint firstAttribute="height" constant="14" id="210"/>
</constraints> </constraints>
@@ -844,20 +818,14 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="198"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="198">
<rect key="frame" x="190" y="9" width="32" height="23"/> <rect key="frame" x="197" y="9" width="26" height="23"/>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="32" id="215"/>
</constraints>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSRemoveTemplate" imagePosition="overlaps" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="216"> <buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSRemoveTemplate" imagePosition="overlaps" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="216">
<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>
</button> </button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="tDI-EL-JGB"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="tDI-EL-JGB">
<rect key="frame" x="150" y="9" width="32" height="23"/> <rect key="frame" x="163" y="9" width="28" height="23"/>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="32" id="JGO-sl-fdM"/>
</constraints>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="52_EncryptedTemplate" imagePosition="overlaps" alignment="center" lineBreakMode="truncatingTail" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="fat-C5-dS2"> <buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="52_EncryptedTemplate" imagePosition="overlaps" alignment="center" lineBreakMode="truncatingTail" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="fat-C5-dS2">
<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"/>
@@ -902,14 +870,14 @@
<connections> <connections>
<outlet property="nextKeyView" destination="G9J-nn-2bu" id="CZ9-f2-JDQ"/> <outlet property="nextKeyView" destination="G9J-nn-2bu" id="CZ9-f2-JDQ"/>
</connections> </connections>
<point key="canvasLocation" x="-1317" y="-1440"/> <point key="canvasLocation" x="-1015" y="-1275"/>
</scrollView> </scrollView>
</objects> </objects>
<resources> <resources>
<image name="52_EncryptedTemplate" width="16" height="16"/> <image name="52_EncryptedTemplate" width="16" height="16"/>
<image name="NSActionTemplate" width="14" height="14"/> <image name="NSActionTemplate" width="15" height="15"/>
<image name="NSAddTemplate" width="11" height="11"/> <image name="NSAddTemplate" width="14" height="13"/>
<image name="NSQuickLookTemplate" width="19" height="12"/> <image name="NSQuickLookTemplate" width="21" height="13"/>
<image name="NSRemoveTemplate" width="11" height="11"/> <image name="NSRemoveTemplate" width="14" height="4"/>
</resources> </resources>
</document> </document>

View File

@@ -1,19 +1,21 @@
<?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="15705" 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="15705"/>
<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"/>
<outlet property="enableAutosaveCheckButton" destination="lz3-4U-UMI" id="L5y-58-IgH"/> <outlet property="enableAutosaveCheckButton" destination="lz3-4U-UMI" id="L5y-58-IgH"/>
<outlet property="faviconDownloadMethodPopup" destination="OfU-6f-oTU" id="OfU-6f-oTU-outlet"/>
<outlet property="fileChangeStrategyPopup" destination="wIu-Sh-2a2" id="oJo-dA-lEE"/> <outlet property="fileChangeStrategyPopup" destination="wIu-Sh-2a2" id="oJo-dA-lEE"/>
<outlet property="idleTimeOutPopup" destination="584" id="809"/> <outlet property="idleTimeOutPopup" destination="584" id="809"/>
<outlet property="lockOnLogoutCheckButton" destination="5SP-Vi-1sn" id="yaI-LH-R5A"/> <outlet property="lockOnLogoutCheckButton" destination="5SP-Vi-1sn" id="yaI-LH-R5A"/>
<outlet property="lockOnScreenSleepCheckButton" destination="nRe-7S-HwK" id="0IB-5B-pfw"/>
<outlet property="lockOnSleepCheckButton" destination="630" id="810"/> <outlet property="lockOnSleepCheckButton" destination="630" id="810"/>
<outlet property="preventUniversalClipboardSupportCheckButton" destination="nqZ-rB-mFS" id="sbx-rl-reT"/> <outlet property="preventUniversalClipboardSupportCheckButton" destination="nqZ-rB-mFS" id="sbx-rl-reT"/>
<outlet property="rememberKeyFileCheckButton" destination="bSt-Wf-FNZ" id="aQm-EA-yAN"/> <outlet property="rememberKeyFileCheckButton" destination="bSt-Wf-FNZ" id="aQm-EA-yAN"/>
@@ -24,16 +26,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="524"/> <rect key="frame" x="0.0" y="0.0" width="406" height="679"/>
<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="146" width="372" height="381"/>
<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="366" height="363"/>
<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">
<rect key="frame" x="14" y="311" width="120" height="17"/> <rect key="frame" x="14" y="335" width="120" height="17"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="17" id="803"/> <constraint firstAttribute="height" constant="17" id="803"/>
</constraints> </constraints>
@@ -44,10 +46,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="332" 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"/>
@@ -65,7 +64,7 @@
</popUpButtonCell> </popUpButtonCell>
</popUpButton> </popUpButton>
<button verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="447"> <button verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="447">
<rect key="frame" x="29" y="287" width="164" height="18"/> <rect key="frame" x="29" y="311" width="164" height="18"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="14" id="773"/> <constraint firstAttribute="height" constant="14" id="773"/>
</constraints> </constraints>
@@ -75,7 +74,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="192" 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"/>
@@ -92,14 +91,14 @@
</popUpButtonCell> </popUpButtonCell>
</popUpButton> </popUpButton>
<button translatesAutoresizingMaskIntoConstraints="NO" id="630"> <button translatesAutoresizingMaskIntoConstraints="NO" id="630">
<rect key="frame" x="29" y="149" width="119" height="18"/> <rect key="frame" x="29" y="173" width="119" height="18"/>
<buttonCell key="cell" type="check" title="Lock after sleep" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="631"> <buttonCell key="cell" type="check" title="Lock after sleep" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="631">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="805"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="805">
<rect key="frame" x="14" y="173" width="93" height="17"/> <rect key="frame" x="14" y="197" width="93" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Lock while idle" id="806"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Lock while idle" id="806">
<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"/>
@@ -113,8 +112,8 @@
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="5cV-xX-SUU"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" 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="330" 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 +122,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="166" 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"/>
@@ -133,21 +132,21 @@
</connections> </connections>
</button> </button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="5SP-Vi-1sn"> <button translatesAutoresizingMaskIntoConstraints="NO" id="5SP-Vi-1sn">
<rect key="frame" x="29" y="129" width="129" height="18"/> <rect key="frame" x="29" y="151" width="129" height="18"/>
<buttonCell key="cell" type="check" title="Lock after log out" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="Dzn-9R-JjE"> <buttonCell key="cell" type="check" title="Lock after log out" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="Dzn-9R-JjE">
<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="nqZ-rB-mFS"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="nqZ-rB-mFS">
<rect key="frame" x="14" y="262" width="242" height="18"/> <rect key="frame" x="14" y="286" width="242" height="18"/>
<buttonCell key="cell" type="check" title="Prevent Universal Clipboard support" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="fNy-mS-phi"> <buttonCell key="cell" type="check" title="Prevent Universal Clipboard support" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="fNy-mS-phi">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hy4-RL-dAa"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="hy4-RL-dAa">
<rect key="frame" x="18" y="200" width="324" height="56"/> <rect key="frame" x="18" y="224" width="330" 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>
@@ -155,20 +154,30 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="nRe-7S-HwK">
<rect key="frame" x="29" y="129" width="164" height="18"/>
<buttonCell key="cell" type="check" title="Lock after screen sleep" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="l3t-og-mJd">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstItem="5cV-xX-SUU" firstAttribute="leading" secondItem="mNh-3L-Z6E" secondAttribute="leading" constant="20" symbolic="YES" id="1jw-nb-bAB"/> <constraint firstItem="5cV-xX-SUU" firstAttribute="leading" secondItem="mNh-3L-Z6E" secondAttribute="leading" constant="20" symbolic="YES" id="1jw-nb-bAB"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="630" secondAttribute="trailing" constant="20" symbolic="YES" id="7cd-1e-eRD"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="630" secondAttribute="trailing" constant="20" symbolic="YES" id="7cd-1e-eRD"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="nqZ-rB-mFS" secondAttribute="trailing" constant="20" symbolic="YES" id="CL9-fA-GTJ"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="nqZ-rB-mFS" secondAttribute="trailing" constant="20" symbolic="YES" id="CL9-fA-GTJ"/>
<constraint firstItem="bSt-Wf-FNZ" firstAttribute="top" secondItem="nRe-7S-HwK" secondAttribute="bottom" constant="11" id="MkJ-O0-qYd"/>
<constraint firstItem="nRe-7S-HwK" firstAttribute="leading" secondItem="447" secondAttribute="leading" id="Mrg-k2-soG"/>
<constraint firstItem="584" firstAttribute="top" secondItem="hy4-RL-dAa" secondAttribute="bottom" constant="8" symbolic="YES" id="SV7-PD-nId"/> <constraint firstItem="584" firstAttribute="top" secondItem="hy4-RL-dAa" secondAttribute="bottom" constant="8" symbolic="YES" id="SV7-PD-nId"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="bSt-Wf-FNZ" secondAttribute="trailing" constant="20" symbolic="YES" id="VQY-eq-fCM"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="bSt-Wf-FNZ" secondAttribute="trailing" constant="20" symbolic="YES" id="VQY-eq-fCM"/>
<constraint firstItem="bSt-Wf-FNZ" firstAttribute="top" secondItem="5SP-Vi-1sn" secondAttribute="bottom" constant="11" id="WUG-Uf-FCO"/> <constraint firstItem="nRe-7S-HwK" firstAttribute="top" secondItem="5SP-Vi-1sn" secondAttribute="bottom" constant="8" id="YZv-Dp-CrZ"/>
<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="8" 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="nRe-7S-HwK" secondAttribute="trailing" constant="20" symbolic="YES" id="pgB-km-W16"/>
<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 +187,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,41 +204,40 @@
<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="531" width="372" height="128"/>
<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="366" height="110"/>
<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">
<rect key="frame" x="14" y="85" width="234" height="18"/> <rect key="frame" x="14" y="84" width="234" height="18"/>
<buttonCell key="cell" type="check" title="Reopen last Database after Launch" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="531"> <buttonCell key="cell" type="check" title="Reopen last Database after Launch" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="531">
<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="lz3-4U-UMI"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="lz3-4U-UMI">
<rect key="frame" x="14" y="65" width="123" height="18"/> <rect key="frame" x="14" y="64" width="123" height="18"/>
<buttonCell key="cell" type="check" title="Enable Autosave" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="wG7-bi-2fi"> <buttonCell key="cell" type="check" title="Enable Autosave" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="wG7-bi-2fi">
<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" translatesAutoresizingMaskIntoConstraints="NO" id="3Bo-Ml-1KB"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="3Bo-Ml-1KB">
<rect key="frame" x="18" y="45" width="324" height="14"/> <rect key="frame" x="18" y="44" width="330" 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"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="h3w-Ms-ohK"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="h3w-Ms-ohK">
<rect key="frame" x="14" y="20" width="93" height="17"/> <rect key="frame" x="14" y="20" width="93" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="If file changes:" id="QrK-hM-Xt1"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="If file changes:" id="QrK-hM-Xt1">
<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"/>
@@ -237,7 +245,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="13" 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 +255,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"/>
@@ -266,18 +274,71 @@
<constraint firstItem="530" firstAttribute="top" secondItem="888" secondAttribute="top" constant="25" id="w7t-Jm-kXg"/> <constraint firstItem="530" firstAttribute="top" secondItem="888" secondAttribute="top" constant="25" id="w7t-Jm-kXg"/>
</constraints> </constraints>
</box> </box>
<box autoresizesSubviews="NO" verticalHuggingPriority="500" borderType="line" title="Network" translatesAutoresizingMaskIntoConstraints="NO" id="wD1-ag-7V5">
<rect key="frame" x="17" y="16" width="372" height="126"/>
<view key="contentView" id="bQD-ZX-d0i">
<rect key="frame" x="3" y="3" width="366" height="108"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="fl5-Xu-nZP">
<rect key="frame" x="14" y="81" width="113" height="16"/>
<constraints>
<constraint firstAttribute="height" constant="16" id="kK7-bB-zKY"/>
</constraints>
<textFieldCell key="cell" lineBreakMode="clipping" title="Favicon download" id="YGj-dH-duz">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField autoresizesSubviews="NO" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="MWj-9m-uGk">
<rect key="frame" x="18" y="13" width="330" height="56"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" id="DaG-1a-SET">
<font key="font" metaFont="message" size="11"/>
<string key="title">By default web site icon is downloaded directly from entry's host URL. For some websites it doesn't work and you might prefer using 3rdparty APIs. In this case only host from the URL will be used to get the icon from selected service.</string>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<popUpButton verticalHuggingPriority="750" horizontalCompressionResistancePriority="749" translatesAutoresizingMaskIntoConstraints="NO" id="OfU-6f-oTU">
<rect key="frame" x="131" y="76" width="38" height="25"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="mdi-Go-1bJ">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
<menu key="menu" id="Xnp-a8-ePw"/>
</popUpButtonCell>
</popUpButton>
</subviews>
<constraints>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="OfU-6f-oTU" secondAttribute="trailing" constant="16" id="0Wl-LS-ePD"/>
<constraint firstItem="OfU-6f-oTU" firstAttribute="centerY" secondItem="fl5-Xu-nZP" secondAttribute="centerY" id="R81-Ij-pdy"/>
<constraint firstItem="OfU-6f-oTU" firstAttribute="leading" secondItem="fl5-Xu-nZP" secondAttribute="trailing" constant="8" id="XS0-fl-B2Z"/>
</constraints>
</view>
<constraints>
<constraint firstItem="MWj-9m-uGk" firstAttribute="leading" secondItem="bQD-ZX-d0i" secondAttribute="leading" constant="20" id="1AE-Eu-ceQ"/>
<constraint firstItem="fl5-Xu-nZP" firstAttribute="top" secondItem="wD1-ag-7V5" secondAttribute="top" constant="26" id="OK9-PR-DfC"/>
<constraint firstItem="MWj-9m-uGk" firstAttribute="top" secondItem="fl5-Xu-nZP" secondAttribute="bottom" constant="12" id="Udz-22-4O1"/>
<constraint firstAttribute="trailing" secondItem="MWj-9m-uGk" secondAttribute="trailing" constant="20" id="hA0-ra-UeU"/>
<constraint firstItem="fl5-Xu-nZP" firstAttribute="leading" secondItem="bQD-ZX-d0i" secondAttribute="leading" constant="16" id="hzo-40-wxR"/>
<constraint firstAttribute="bottom" secondItem="MWj-9m-uGk" secondAttribute="bottom" constant="12" id="k80-DD-Y5l"/>
</constraints>
</box>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstItem="465" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="475"/> <constraint firstItem="465" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="475"/>
<constraint firstAttribute="trailing" secondItem="465" secondAttribute="trailing" constant="20" symbolic="YES" id="525"/> <constraint firstAttribute="trailing" secondItem="465" secondAttribute="trailing" constant="20" symbolic="YES" id="525"/>
<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 firstAttribute="width" relation="greaterThanOrEqual" constant="400" id="918"/>
<constraint firstAttribute="width" constant="400" id="918"/> <constraint firstItem="wD1-ag-7V5" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="20" id="3kp-Uf-fyC"/>
<constraint firstAttribute="bottom" secondItem="465" secondAttribute="bottom" constant="20" symbolic="YES" id="uwq-az-XwJ"/> <constraint firstItem="wD1-ag-7V5" firstAttribute="bottom" secondItem="1" secondAttribute="bottom" constant="-20" id="EeW-K0-jec"/>
<constraint firstItem="465" firstAttribute="top" secondItem="cpg-tt-SHE" secondAttribute="bottom" constant="5" id="wyH-HB-i2U"/> <constraint firstItem="wD1-ag-7V5" firstAttribute="top" secondItem="465" secondAttribute="bottom" constant="8" symbolic="YES" id="FsW-LX-Drs"/>
<constraint firstItem="888" firstAttribute="top" secondItem="1" secondAttribute="top" constant="20" symbolic="YES" id="ZMP-Lv-rQh"/>
<constraint firstAttribute="trailing" secondItem="wD1-ag-7V5" secondAttribute="trailing" constant="20" id="ccK-FL-7Wx"/>
<constraint firstItem="465" firstAttribute="top" secondItem="888" secondAttribute="bottom" constant="8" symbolic="YES" id="wyH-HB-i2U"/>
</constraints> </constraints>
<point key="canvasLocation" x="-131" y="-93"/> <point key="canvasLocation" x="-535" y="-327.5"/>
</customView> </customView>
</objects> </objects>
</document> </document>

View File

@@ -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="17506" 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="17506"/>
<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>
@@ -44,7 +44,7 @@
</connections> </connections>
</imageView> </imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="249" translatesAutoresizingMaskIntoConstraints="NO" id="3013"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="249" translatesAutoresizingMaskIntoConstraints="NO" id="3013">
<rect key="frame" x="58" y="628" width="202" height="17"/> <rect key="frame" x="58" y="628" width="202" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" truncatesLastVisibleLine="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="Label" usesSingleLineMode="YES" id="3014"> <textFieldCell key="cell" lineBreakMode="truncatingTail" truncatesLastVisibleLine="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" title="Label" usesSingleLineMode="YES" id="3014">
<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"/>
@@ -83,7 +83,7 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2985"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2985">
<rect key="frame" x="82" y="194" width="115" height="24"/> <rect key="frame" x="82" y="194" width="115" height="23"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="No Selection" id="2986"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="No Selection" id="2986">
<font key="font" metaFont="system" size="20"/> <font key="font" metaFont="system" size="20"/>
<color key="textColor" name="controlShadowColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlShadowColor" catalog="System" colorSpace="catalog"/>
@@ -200,7 +200,7 @@
<constraint firstItem="3145" firstAttribute="leading" secondItem="2894" secondAttribute="leading" id="3155"/> <constraint firstItem="3145" firstAttribute="leading" secondItem="2894" secondAttribute="leading" id="3155"/>
<constraint firstAttribute="bottom" secondItem="3145" secondAttribute="bottom" id="PjS-Y5-YA6"/> <constraint firstAttribute="bottom" secondItem="3145" secondAttribute="bottom" id="PjS-Y5-YA6"/>
</constraints> </constraints>
<point key="canvasLocation" x="-224" y="-890"/> <point key="canvasLocation" x="-349" y="-997"/>
</customView> </customView>
</objects> </objects>
<resources> <resources>

View File

@@ -1,13 +1,14 @@
<?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="17701" 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="17701"/>
<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="alwaysShowConfirmationBeforeAutotypeCheckBox" destination="uZQ-Gd-hfu" id="6NL-Tz-7su"/>
<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"/>
<outlet property="enableGlobalAutotypeCheckBox" destination="tik-Ar-FJg" id="yVA-bM-sSh"/> <outlet property="enableGlobalAutotypeCheckBox" destination="tik-Ar-FJg" id="yVA-bM-sSh"/>
@@ -26,56 +27,56 @@
<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="417" height="664"/>
<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="246" width="383" height="398"/>
<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="377" height="380"/>
<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 distribution="fill" orientation="vertical" alignment="leading" horizontalStackHuggingPriority="250" verticalStackHuggingPriority="250" horizontalHuggingPriority="249" 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="345" height="353"/>
<beginningViews> <subviews>
<textField verticalHuggingPriority="750" fixedFrame="YES" preferredMaxLayoutWidth="328" translatesAutoresizingMaskIntoConstraints="NO" id="hMJ-Mo-xOM"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="hMJ-Mo-xOM">
<rect key="frame" x="-2" y="227" width="332" height="56"/> <rect key="frame" x="-2" y="311" width="349" 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 horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="jai-b6-Qv4">
<rect key="frame" x="-6" y="191" width="160" height="32"/> <rect key="frame" x="-7" y="276" width="171" 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 horizontalHuggingPriority="249" translatesAutoresizingMaskIntoConstraints="NO" id="tik-Ar-FJg">
<rect key="frame" x="-2" y="174" width="162" height="18"/> <rect key="frame" x="-2" y="258" width="347" height="18"/>
<buttonCell key="cell" type="check" title="Enable global Autotype" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="1qb-Rd-jYu"> <buttonCell key="cell" type="check" title="Enable global Autotype" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="1qb-Rd-jYu">
<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>
<stackView orientation="horizontal" alignment="centerY" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="d6A-Vb-CMt"> <stackView distribution="fill" orientation="horizontal" alignment="centerY" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="d6A-Vb-CMt">
<rect key="frame" x="0.0" y="146" width="328" height="22"/> <rect key="frame" x="0.0" y="230" width="281" height="21"/>
<beginningViews> <subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="buI-Wb-o3V"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="buI-Wb-o3V">
<rect key="frame" x="-2" y="3" width="57" height="17"/> <rect key="frame" x="-2" y="3" width="57" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Shortcut" id="6oN-CH-T0O"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Shortcut" id="6oN-CH-T0O">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Kvg-he-3c8" customClass="DDHotKeyTextField"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Kvg-he-3c8" customClass="DDHotKeyTextField">
<rect key="frame" x="61" y="0.0" width="136" height="22"/> <rect key="frame" x="61" y="0.0" width="89" height="21"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="89" id="Mia-b8-HCZ"/> <constraint firstAttribute="width" constant="89" id="Mia-b8-HCZ"/>
</constraints> </constraints>
@@ -85,15 +86,15 @@
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="f5q-EW-RHf"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="f5q-EW-RHf">
<rect key="frame" x="203" y="4" width="127" height="14"/> <rect key="frame" x="156" y="4" width="127" height="14"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Shortcut is missing Key" id="Lxp-wI-yQy"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Shortcut is missing Key" id="Lxp-wI-yQy">
<font key="font" metaFont="smallSystem"/> <font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="disabledControlTextColor" 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>
</beginningViews> </subviews>
<visibilityPriorities> <visibilityPriorities>
<integer value="1000"/> <integer value="1000"/>
<integer value="1000"/> <integer value="1000"/>
@@ -105,50 +106,66 @@
<real value="3.4028234663852886e+38"/> <real value="3.4028234663852886e+38"/>
</customSpacing> </customSpacing>
</stackView> </stackView>
<button fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="DAX-V8-Say"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="uZQ-Gd-hfu">
<rect key="frame" x="-2" y="122" width="208" height="18"/> <rect key="frame" x="-2" y="205" width="347" height="18"/>
<buttonCell key="cell" type="check" title="Always show confirmation before executing Autotype" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="rrU-70-Ara">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="249" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="cUt-aB-oib">
<rect key="frame" x="-2" y="156" width="349" height="42"/>
<textFieldCell key="cell" controlSize="small" selectable="YES" id="VjU-Hz-cu4">
<font key="font" metaFont="smallSystem"/>
<string key="title">If enabled, a dialog will show up before Autotype is executed even if only a single match was found to prevent accidental input and wrong matches</string>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button horizontalHuggingPriority="249" translatesAutoresizingMaskIntoConstraints="NO" id="DAX-V8-Say">
<rect key="frame" x="-2" y="131" width="347" height="18"/>
<buttonCell key="cell" type="check" title="Include Entry Title for matches" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="tmL-dT-D0G"> <buttonCell key="cell" type="check" title="Include Entry Title for matches" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="tmL-dT-D0G">
<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 fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8Wz-lo-AXG"> <button horizontalHuggingPriority="249" translatesAutoresizingMaskIntoConstraints="NO" id="8Wz-lo-AXG">
<rect key="frame" x="-2" y="100" width="206" height="18"/> <rect key="frame" x="-2" y="107" width="347" height="18"/>
<buttonCell key="cell" type="check" title="Include Entry URL for matches" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="TzR-00-Vp3"> <buttonCell key="cell" type="check" title="Include Entry URL for matches" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="TzR-00-Vp3">
<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 fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="TiO-ah-BlR"> <button horizontalHuggingPriority="249" translatesAutoresizingMaskIntoConstraints="NO" id="TiO-ah-BlR">
<rect key="frame" x="-2" y="78" width="239" height="18"/> <rect key="frame" x="-2" y="83" width="347" height="18"/>
<buttonCell key="cell" type="check" title="Include Entry URL Host for matches" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="B1D-j9-L8x"> <buttonCell key="cell" type="check" title="Include Entry URL Host for matches" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="B1D-j9-L8x">
<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 fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="9MH-jx-GpG"> <button horizontalHuggingPriority="249" translatesAutoresizingMaskIntoConstraints="NO" id="9MH-jx-GpG">
<rect key="frame" x="-2" y="56" width="210" height="18"/> <rect key="frame" x="-2" y="59" width="347" height="18"/>
<buttonCell key="cell" type="check" title="Include Entry Tags for matches" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="rbu-G7-MT8"> <buttonCell key="cell" type="check" title="Include Entry Tags for matches" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="rbu-G7-MT8">
<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" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="VK8-z4-2ci"> <button horizontalHuggingPriority="249" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="VK8-z4-2ci">
<rect key="frame" x="-2" y="34" width="122" height="18"/> <rect key="frame" x="-2" y="35" width="347" height="18"/>
<buttonCell key="cell" type="check" title="Interpret ⌃ as ⌘" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="QfO-yG-l3F"> <buttonCell key="cell" type="check" title="Interpret ⌃ as ⌘" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="QfO-yG-l3F">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="wbP-A9-jpw"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="wbP-A9-jpw">
<rect key="frame" x="-2" y="0.0" width="332" height="28"/> <rect key="frame" x="-2" y="0.0" width="349" height="28"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="If enabled, every {CONTROL} command will be sent as ⌘. Only disable this if you are sure you need to." id="QRy-CY-ENC"> <textFieldCell key="cell" sendsActionOnEndEditing="YES" title="If enabled, every {CONTROL} command will be sent as ⌘. Only disable this if you are sure you need to." id="QRy-CY-ENC">
<font key="font" metaFont="smallSystem"/> <font key="font" metaFont="smallSystem"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
</beginningViews> </subviews>
<visibilityPriorities> <visibilityPriorities>
<integer value="1000"/> <integer value="1000"/>
<integer value="1000"/> <integer value="1000"/>
@@ -160,6 +177,8 @@
<integer value="1000"/> <integer value="1000"/>
<integer value="1000"/> <integer value="1000"/>
<integer value="1000"/> <integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
</visibilityPriorities> </visibilityPriorities>
<customSpacing> <customSpacing>
<real value="3.4028234663852886e+38"/> <real value="3.4028234663852886e+38"/>
@@ -172,6 +191,8 @@
<real value="3.4028234663852886e+38"/> <real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/> <real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/> <real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing> </customSpacing>
</stackView> </stackView>
</subviews> </subviews>
@@ -184,20 +205,20 @@
</constraints> </constraints>
</box> </box>
<box autoresizesSubviews="NO" verticalHuggingPriority="500" borderType="line" title="Preview" translatesAutoresizingMaskIntoConstraints="NO" id="VVs-b5-cX9"> <box autoresizesSubviews="NO" verticalHuggingPriority="500" borderType="line" title="Preview" translatesAutoresizingMaskIntoConstraints="NO" id="VVs-b5-cX9">
<rect key="frame" x="17" y="16" width="366" height="95"/> <rect key="frame" x="17" y="145" width="383" height="97"/>
<view key="contentView" id="ww4-uR-8gP"> <view key="contentView" id="ww4-uR-8gP">
<rect key="frame" x="3" y="3" width="360" height="77"/> <rect key="frame" x="3" y="3" width="377" height="79"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<button translatesAutoresizingMaskIntoConstraints="NO" id="LNw-5t-TS4"> <button translatesAutoresizingMaskIntoConstraints="NO" id="LNw-5t-TS4">
<rect key="frame" x="14" y="51" width="178" height="18"/> <rect key="frame" x="14" y="52" width="182" height="18"/>
<buttonCell key="cell" type="check" title="Enable Quicklook Preview" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="ERs-ct-Eyx"> <buttonCell key="cell" type="check" title="Enable Quicklook Preview" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="ERs-ct-Eyx">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="V6l-R9-hIj"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="V6l-R9-hIj">
<rect key="frame" x="14" y="17" width="332" height="28"/> <rect key="frame" x="14" y="17" width="349" height="28"/>
<textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" title="If enabled attached files will be copied to a temporary location for preview and deleted after the preview is closed." id="WmI-IB-Aso"> <textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" title="If enabled attached files will be copied to a temporary location for preview and deleted after the preview is closed." id="WmI-IB-Aso">
<font key="font" metaFont="smallSystem"/> <font key="font" metaFont="smallSystem"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -218,18 +239,57 @@
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="V6l-R9-hIj" secondAttribute="trailing" constant="16" id="ivY-UD-QFJ"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="V6l-R9-hIj" secondAttribute="trailing" constant="16" id="ivY-UD-QFJ"/>
</constraints> </constraints>
</box> </box>
<box title="Keychain" translatesAutoresizingMaskIntoConstraints="NO" id="ChZ-ku-FOP">
<rect key="frame" x="17" y="16" width="383" height="125"/>
<view key="contentView" id="ocY-lR-P2Z">
<rect key="frame" x="3" y="3" width="377" height="107"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="u5z-ST-gTK">
<rect key="frame" x="9" y="60" width="154" height="32"/>
<buttonCell key="cell" type="push" title="Renew TouchID Key" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="b4n-g4-CtW">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="RenewTouchIdKey:" target="-2" id="dl7-WD-Abu"/>
</connections>
</button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="9kv-ns-mQx">
<rect key="frame" x="14" y="16" width="349" height="42"/>
<textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" id="LyC-Hd-ecK">
<font key="font" metaFont="smallSystem"/>
<string key="title">MacPass will no longer be able to unlock any Database with TouchID until it is successfully unlocked with the password and or keyfile.</string>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="9kv-ns-mQx" secondAttribute="bottom" constant="16" id="INC-l7-zwP"/>
<constraint firstItem="u5z-ST-gTK" firstAttribute="leading" secondItem="ocY-lR-P2Z" secondAttribute="leading" constant="16" id="KDt-yM-fh3"/>
<constraint firstItem="9kv-ns-mQx" firstAttribute="top" secondItem="u5z-ST-gTK" secondAttribute="bottom" constant="9" id="RjN-pw-qLc"/>
<constraint firstItem="9kv-ns-mQx" firstAttribute="leading" secondItem="u5z-ST-gTK" secondAttribute="leading" id="X5L-Rj-Wky"/>
<constraint firstItem="u5z-ST-gTK" firstAttribute="top" secondItem="ocY-lR-P2Z" secondAttribute="top" constant="20" symbolic="YES" id="guH-ws-dzX"/>
<constraint firstAttribute="trailing" secondItem="9kv-ns-mQx" secondAttribute="trailing" constant="16" id="icu-An-dNK"/>
<constraint firstAttribute="trailing" relation="lessThanOrEqual" secondItem="u5z-ST-gTK" secondAttribute="trailing" priority="240" constant="16" id="rni-sA-a7w"/>
</constraints>
</view>
</box>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstAttribute="width" constant="400" id="19"/> <constraint firstItem="ChZ-ku-FOP" firstAttribute="trailing" secondItem="ww4-uR-8gP" secondAttribute="trailing" id="39G-i3-XQa"/>
<constraint firstItem="ChZ-ku-FOP" firstAttribute="top" secondItem="VVs-b5-cX9" secondAttribute="bottom" constant="8" symbolic="YES" id="3ub-U2-KCr"/>
<constraint firstItem="P9N-HM-wER" firstAttribute="top" secondItem="1" secondAttribute="top" constant="20" symbolic="YES" id="8fy-q5-VJy"/> <constraint firstItem="P9N-HM-wER" firstAttribute="top" secondItem="1" secondAttribute="top" constant="20" symbolic="YES" id="8fy-q5-VJy"/>
<constraint firstAttribute="bottom" secondItem="VVs-b5-cX9" secondAttribute="bottom" constant="20" symbolic="YES" id="TZB-qe-7eg"/> <constraint firstItem="ChZ-ku-FOP" firstAttribute="leading" secondItem="ww4-uR-8gP" secondAttribute="leading" id="BQW-Zd-udd"/>
<constraint firstItem="VVs-b5-cX9" firstAttribute="top" secondItem="P9N-HM-wER" secondAttribute="bottom" constant="8" id="VCX-JW-cBe"/> <constraint firstAttribute="bottom" secondItem="ChZ-ku-FOP" secondAttribute="bottom" constant="20" symbolic="YES" id="DBk-vZ-yOT"/>
<constraint firstItem="VVs-b5-cX9" firstAttribute="top" secondItem="P9N-HM-wER" secondAttribute="bottom" constant="8" symbolic="YES" id="VCX-JW-cBe"/>
<constraint firstItem="VVs-b5-cX9" firstAttribute="trailing" secondItem="P9N-HM-wER" secondAttribute="trailing" id="k9i-4T-WY0"/> <constraint firstItem="VVs-b5-cX9" firstAttribute="trailing" secondItem="P9N-HM-wER" secondAttribute="trailing" id="k9i-4T-WY0"/>
<constraint firstAttribute="trailing" secondItem="P9N-HM-wER" secondAttribute="trailing" constant="20" id="n5w-Cw-Bbt"/> <constraint firstAttribute="trailing" secondItem="P9N-HM-wER" secondAttribute="trailing" constant="20" id="n5w-Cw-Bbt"/>
<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="-1204.5" y="-1287.5"/>
</customView> </customView>
</objects> </objects>
</document> </document>

View File

@@ -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">
@@ -151,9 +151,9 @@
<action selector="mergeWithOther:" target="-1" id="OyM-CZ-TDD"/> <action selector="mergeWithOther:" target="-1" id="OyM-CZ-TDD"/>
</connections> </connections>
</menuItem> </menuItem>
<menuItem title="Import" id="aTb-sW-nUd"> <menuItem title="Import From" id="aTb-sW-nUd">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Import" id="4q9-u1-pcm"> <menu key="submenu" title="Import From" id="4q9-u1-pcm">
<items> <items>
<menuItem title="XML…" id="rW0-r1-QYL"> <menuItem title="XML…" id="rW0-r1-QYL">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
@@ -167,16 +167,20 @@
</connections> </connections>
</menu> </menu>
</menuItem> </menuItem>
<menuItem title="Export" id="tz9-yK-pOf"> <menuItem title="Export To" id="tz9-yK-pOf">
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Export" id="p8h-Fg-h1O"> <menu key="submenu" title="Export To" id="p8h-Fg-h1O">
<items> <items>
<menuItem title="XML…" keyEquivalent="E" id="1259"> <menuItem title="XML…" id="1259">
<modifierMask key="keyEquivalentModifierMask"/>
<connections> <connections>
<action selector="exportAsXML:" target="-1" id="NCG-gr-YI5"/> <action selector="exportAsXML:" target="-1" id="NCG-gr-YI5"/>
</connections> </connections>
</menuItem> </menuItem>
</items> </items>
<connections>
<outlet property="delegate" destination="494" id="ALY-P3-PzW"/>
</connections>
</menu> </menu>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="74"> <menuItem isSeparatorItem="YES" id="74">
@@ -317,12 +321,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>
@@ -351,6 +361,7 @@ CA
</menu> </menu>
<customObject id="494" customClass="MPAppDelegate"> <customObject id="494" customClass="MPAppDelegate">
<connections> <connections>
<outlet property="exportMenu" destination="p8h-Fg-h1O" id="elV-BC-ZZt"/>
<outlet property="fileNewMenuItem" destination="82" id="BUX-dy-HS2"/> <outlet property="fileNewMenuItem" destination="82" id="BUX-dy-HS2"/>
<outlet property="fixAutotypeMenuItem" destination="nx7-Vf-LiD" id="5n1-bG-JxJ"/> <outlet property="fixAutotypeMenuItem" destination="nx7-Vf-LiD" id="5n1-bG-JxJ"/>
<outlet property="importMenu" destination="4q9-u1-pcm" id="0XM-fS-Vyy"/> <outlet property="importMenu" destination="4q9-u1-pcm" id="0XM-fS-Vyy"/>

View File

@@ -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>

View File

@@ -1,17 +1,18 @@
<?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="17701" 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="17701"/>
<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="MPPasswordEditWindowController"> <customObject id="-2" userLabel="File's Owner" customClass="MPPasswordEditWindowController">
<connections> <connections>
<outlet property="changePasswordButton" destination="68" id="85"/> <outlet property="changePasswordButton" destination="68" id="85"/>
<outlet property="errorTextField" destination="12" id="79"/>
<outlet property="hasPasswordSwitchButton" destination="yKc-I9-uzv" id="aUH-R4-WwP"/> <outlet property="hasPasswordSwitchButton" destination="yKc-I9-uzv" id="aUH-R4-WwP"/>
<outlet property="keyErrorTextField" destination="ibK-Px-Fvt" id="l7h-qa-idf"/>
<outlet property="keyfilePathControl" destination="4" id="63"/> <outlet property="keyfilePathControl" destination="4" id="63"/>
<outlet property="passwordErrorTextField" destination="12" id="79"/>
<outlet property="passwordRepeatTextField" destination="11" id="62"/> <outlet property="passwordRepeatTextField" destination="11" id="62"/>
<outlet property="passwordTextField" destination="9" id="61"/> <outlet property="passwordTextField" destination="9" id="61"/>
<outlet property="togglePasswordButton" destination="7" id="64"/> <outlet property="togglePasswordButton" destination="7" id="64"/>
@@ -23,99 +24,13 @@
<window title="Change Password" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="1"> <window title="Change Password" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="1">
<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="1090" y="652" width="369" height="164"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/> <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
<view key="contentView" misplaced="YES" id="2"> <view key="contentView" verticalHuggingPriority="251" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" 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="363" height="220"/>
<autoresizingMask key="autoresizingMask"/>
<subviews> <subviews>
<pathControl verticalHuggingPriority="750" allowsExpansionToolTips="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4" customClass="MPPathControl">
<rect key="frame" x="105" y="87" width="242" height="25"/>
<pathCell key="cell" selectable="YES" editable="YES" alignment="left" pathStyle="popUp" id="23">
<font key="font" metaFont="system"/>
</pathCell>
</pathControl>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="5">
<rect key="frame" x="53" y="91" width="49" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Keyfile:" id="22">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6">
<rect key="frame" x="108" y="60" width="236" height="23"/>
<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"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="generateKey:" target="-2" id="66"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="7">
<rect key="frame" x="352" y="153" width="31" height="23"/>
<constraints>
<constraint firstAttribute="width" constant="31" id="59"/>
</constraints>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSQuickLookTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="20">
<behavior key="behavior" pushIn="YES" changeContents="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="8">
<rect key="frame" x="352" y="89" width="31" height="23"/>
<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"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="clearKey:" target="-2" id="65"/>
</connections>
</button>
<secureTextField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9" customClass="HNHUISecureTextField">
<rect key="frame" x="108" y="152" width="236" height="24"/>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="200" id="Gin-yR-DMk"/>
</constraints>
<secureTextFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="Enter Password" drawsBackground="YES" usesSingleLineMode="YES" id="18">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<allowedInputSourceLocales>
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
</allowedInputSourceLocales>
</secureTextFieldCell>
</secureTextField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="10">
<rect key="frame" x="51" y="122" width="51" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Repeat:" id="16">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<secureTextField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="11" customClass="HNHUISecureTextField">
<rect key="frame" x="108" y="118" 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">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<allowedInputSourceLocales>
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
</allowedInputSourceLocales>
</secureTextFieldCell>
</secureTextField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="12">
<rect key="frame" x="158" y="184" width="136" height="14"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Missmatching Passwords" id="14">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="68"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="68">
<rect key="frame" x="240" y="13" width="149" height="32"/> <rect key="frame" x="200" y="13" width="149" height="32"/>
<buttonCell key="cell" type="push" title="Change Password" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="69"> <buttonCell key="cell" type="push" title="Change Password" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="69">
<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"/>
@@ -125,7 +40,7 @@
</connections> </connections>
</button> </button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="72"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="72">
<rect key="frame" x="158" y="13" width="82" height="32"/> <rect key="frame" x="118" y="13" width="82" height="32"/>
<buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="73"> <buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="73">
<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"/>
@@ -137,59 +52,168 @@ Gw
<action selector="cancel:" target="-2" id="84"/> <action selector="cancel:" target="-2" id="84"/>
</connections> </connections>
</button> </button>
<button horizontalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="yKc-I9-uzv"> <gridView horizontalHuggingPriority="251" verticalHuggingPriority="750" xPlacement="leading" yPlacement="bottom" rowAlignment="none" translatesAutoresizingMaskIntoConstraints="NO" id="0Iv-td-ACj">
<rect key="frame" x="18" y="155" width="84" height="18"/> <rect key="frame" x="20" y="61" width="323" height="139"/>
<buttonCell key="cell" type="check" title="Password:" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="OQz-DA-SoY"> <rows>
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/> <gridRow id="Ljm-xA-9NW"/>
<font key="font" metaFont="system"/> <gridRow id="Dv9-ND-6rX"/>
</buttonCell> <gridRow id="mNb-JP-3YX"/>
</button> <gridRow id="vQK-bD-mNH"/>
<gridRow id="DIe-Hz-bd0"/>
<gridRow id="TQt-iq-lMT"/>
</rows>
<columns>
<gridColumn xPlacement="trailing" id="uaf-ph-2zN"/>
<gridColumn xPlacement="fill" id="7oF-Xq-5de"/>
<gridColumn xPlacement="fill" id="clB-mU-Eba"/>
</columns>
<gridCells>
<gridCell row="Ljm-xA-9NW" column="uaf-ph-2zN" id="1U3-Im-v9n"/>
<gridCell row="Ljm-xA-9NW" column="7oF-Xq-5de" id="2bp-dG-V6t">
<textField key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="12">
<rect key="frame" x="84" y="125" width="204" height="14"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="PASSWORD_ERROR" id="14">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="Ljm-xA-9NW" column="clB-mU-Eba" id="blk-az-oHS"/>
<gridCell row="Dv9-ND-6rX" column="uaf-ph-2zN" id="JUU-XQ-60P">
<button key="contentView" horizontalHuggingPriority="252" translatesAutoresizingMaskIntoConstraints="NO" id="yKc-I9-uzv">
<rect key="frame" x="-2" y="97" width="84" height="24"/>
<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"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
</gridCell>
<gridCell row="Dv9-ND-6rX" column="7oF-Xq-5de" id="cw2-er-epO">
<secureTextField key="contentView" horizontalHuggingPriority="253" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9" customClass="HNHUISecureTextField">
<rect key="frame" x="86" y="99" width="200" height="20"/>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="200" id="gTV-5A-Fyo"/>
</constraints>
<secureTextFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="Enter Password" drawsBackground="YES" usesSingleLineMode="YES" id="18">
<font key="font" size="13" name="Menlo-Regular"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<allowedInputSourceLocales>
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
</allowedInputSourceLocales>
</secureTextFieldCell>
</secureTextField>
</gridCell>
<gridCell row="Dv9-ND-6rX" column="clB-mU-Eba" id="ykQ-xV-MfJ"/>
<gridCell row="mNb-JP-3YX" column="uaf-ph-2zN" id="DTm-fw-duK">
<textField key="contentView" horizontalHuggingPriority="252" verticalHuggingPriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="10">
<rect key="frame" x="31" y="73" width="51" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Repeat:" id="16">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="mNb-JP-3YX" column="7oF-Xq-5de" id="OBv-b8-DJs">
<secureTextField key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="11" customClass="HNHUISecureTextField">
<rect key="frame" x="86" y="73" width="200" height="20"/>
<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"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<allowedInputSourceLocales>
<string>NSAllRomanInputSourcesLocaleIdentifier</string>
</allowedInputSourceLocales>
</secureTextFieldCell>
</secureTextField>
</gridCell>
<gridCell row="mNb-JP-3YX" column="clB-mU-Eba" id="erv-Ur-nvi">
<button key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="7">
<rect key="frame" x="292" y="72" width="31" height="21"/>
<constraints>
<constraint firstAttribute="width" constant="31" id="59"/>
</constraints>
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSQuickLookTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="20">
<behavior key="behavior" pushIn="YES" changeContents="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
</gridCell>
<gridCell row="vQK-bD-mNH" column="uaf-ph-2zN" id="5U0-j9-rrv"/>
<gridCell row="vQK-bD-mNH" column="7oF-Xq-5de" id="8JE-Wh-Sad">
<textField key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ibK-Px-Fvt">
<rect key="frame" x="84" y="53" width="204" height="14"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="KEY_ERROR" id="EOD-dE-TFa">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" red="1" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="vQK-bD-mNH" column="clB-mU-Eba" id="fyu-1E-DpO"/>
<gridCell row="DIe-Hz-bd0" column="uaf-ph-2zN" id="Pjk-hs-Pb5">
<textField key="contentView" horizontalHuggingPriority="252" verticalHuggingPriority="749" translatesAutoresizingMaskIntoConstraints="NO" id="5">
<rect key="frame" x="33" y="28" width="49" height="19"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Keyfile:" id="22">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</gridCell>
<gridCell row="DIe-Hz-bd0" column="7oF-Xq-5de" id="o9J-f7-adq">
<pathControl key="contentView" verticalHuggingPriority="750" allowsExpansionToolTips="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4" customClass="MPPathControl">
<rect key="frame" x="83" y="24" width="206" height="25"/>
<pathCell key="cell" selectable="YES" editable="YES" alignment="left" pathStyle="popUp" id="23" customClass="MPPathCell">
<font key="font" metaFont="system"/>
</pathCell>
</pathControl>
</gridCell>
<gridCell row="DIe-Hz-bd0" column="clB-mU-Eba" id="miK-hQ-pkN">
<button key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="8">
<rect key="frame" x="292" y="27" width="31" height="20"/>
<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"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="clearKey:" target="-2" id="65"/>
</connections>
</button>
</gridCell>
<gridCell row="TQt-iq-lMT" column="uaf-ph-2zN" id="nAI-ge-Vjb"/>
<gridCell row="TQt-iq-lMT" column="7oF-Xq-5de" id="dT5-pB-M7d">
<button key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6">
<rect key="frame" x="86" y="-1" width="200" height="23"/>
<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"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="generateKey:" target="-2" id="66"/>
</connections>
</button>
</gridCell>
<gridCell row="TQt-iq-lMT" column="clB-mU-Eba" id="zle-AC-ZGd"/>
</gridCells>
</gridView>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstItem="9" firstAttribute="top" secondItem="12" secondAttribute="bottom" constant="8" symbolic="YES" id="26"/>
<constraint firstItem="4" firstAttribute="leading" secondItem="5" secondAttribute="trailing" constant="8" symbolic="YES" id="27"/>
<constraint firstItem="10" firstAttribute="baseline" secondItem="11" secondAttribute="baseline" id="29"/>
<constraint firstItem="7" firstAttribute="leading" secondItem="9" secondAttribute="trailing" constant="8" symbolic="YES" id="30"/>
<constraint firstItem="4" firstAttribute="top" secondItem="11" secondAttribute="bottom" constant="8" symbolic="YES" id="35"/>
<constraint firstItem="7" firstAttribute="top" secondItem="9" secondAttribute="top" id="36"/>
<constraint firstItem="11" firstAttribute="leading" secondItem="10" secondAttribute="trailing" constant="8" symbolic="YES" id="37"/>
<constraint firstItem="6" firstAttribute="top" secondItem="4" secondAttribute="bottom" constant="8" symbolic="YES" id="39"/>
<constraint firstItem="12" firstAttribute="centerX" secondItem="9" secondAttribute="centerX" id="40"/>
<constraint firstItem="8" firstAttribute="centerY" secondItem="4" secondAttribute="centerY" id="41"/>
<constraint firstItem="4" firstAttribute="bottom" secondItem="5" secondAttribute="bottom" id="43"/>
<constraint firstItem="12" firstAttribute="top" secondItem="2" secondAttribute="top" constant="20" symbolic="YES" id="53"/>
<constraint firstAttribute="trailing" secondItem="8" secondAttribute="trailing" constant="20" symbolic="YES" id="56"/>
<constraint firstAttribute="trailing" secondItem="7" secondAttribute="trailing" constant="20" symbolic="YES" id="57"/>
<constraint firstAttribute="trailing" secondItem="68" secondAttribute="trailing" constant="20" symbolic="YES" id="71"/> <constraint firstAttribute="trailing" secondItem="68" secondAttribute="trailing" constant="20" symbolic="YES" id="71"/>
<constraint firstItem="68" firstAttribute="leading" secondItem="72" secondAttribute="trailing" constant="12" symbolic="YES" id="75"/> <constraint firstItem="68" firstAttribute="leading" secondItem="72" secondAttribute="trailing" constant="12" symbolic="YES" id="75"/>
<constraint firstItem="72" firstAttribute="top" secondItem="6" secondAttribute="bottom" constant="20" symbolic="YES" id="76"/>
<constraint firstAttribute="bottom" secondItem="72" secondAttribute="bottom" constant="20" symbolic="YES" id="77"/> <constraint firstAttribute="bottom" secondItem="72" secondAttribute="bottom" constant="20" symbolic="YES" id="77"/>
<constraint firstAttribute="bottom" secondItem="68" secondAttribute="bottom" constant="20" symbolic="YES" id="78"/> <constraint firstAttribute="bottom" secondItem="68" secondAttribute="bottom" constant="20" symbolic="YES" id="78"/>
<constraint firstItem="5" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="2" secondAttribute="leading" constant="20" symbolic="YES" id="4Yq-mp-X3O"/> <constraint firstItem="0Iv-td-ACj" firstAttribute="leading" secondItem="2" secondAttribute="leading" constant="20" symbolic="YES" id="4Gf-qW-X3R"/>
<constraint firstItem="4" firstAttribute="width" secondItem="11" secondAttribute="width" id="55p-Rc-8jw"/>
<constraint firstItem="72" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="2" secondAttribute="leading" constant="20" symbolic="YES" id="5JM-Ve-z5Y"/> <constraint firstItem="72" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="2" secondAttribute="leading" constant="20" symbolic="YES" id="5JM-Ve-z5Y"/>
<constraint firstItem="8" firstAttribute="leading" secondItem="4" secondAttribute="trailing" constant="8" id="7GY-2X-nJn"/> <constraint firstItem="0Iv-td-ACj" firstAttribute="top" secondItem="2" secondAttribute="top" constant="20" symbolic="YES" id="FVY-mT-b2G"/>
<constraint firstItem="4" firstAttribute="leading" secondItem="5" secondAttribute="trailing" constant="8" id="7eR-m5-mhQ"/> <constraint firstAttribute="width" relation="lessThanOrEqual" constant="400" id="mhj-K7-dob"/>
<constraint firstItem="9" firstAttribute="baseline" secondItem="yKc-I9-uzv" secondAttribute="baseline" id="DrZ-BA-xPv"/> <constraint firstAttribute="trailing" secondItem="0Iv-td-ACj" secondAttribute="trailing" constant="20" symbolic="YES" id="q2z-sU-YCn"/>
<constraint firstItem="7" firstAttribute="leading" secondItem="9" secondAttribute="trailing" constant="8" id="IqJ-u6-6jk"/> <constraint firstItem="68" firstAttribute="top" secondItem="0Iv-td-ACj" secondAttribute="bottom" constant="20" symbolic="YES" id="s84-KY-RXX"/>
<constraint firstItem="yKc-I9-uzv" firstAttribute="leading" secondItem="2" secondAttribute="leading" constant="20" symbolic="YES" id="OdM-OO-kNS"/>
<constraint firstItem="7" firstAttribute="leading" secondItem="9" secondAttribute="trailing" constant="8" symbolic="YES" id="PnG-bb-nYQ"/>
<constraint firstItem="11" firstAttribute="top" secondItem="9" secondAttribute="bottom" constant="10" symbolic="YES" id="Qe9-z3-Wa6"/>
<constraint firstItem="yKc-I9-uzv" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="2" secondAttribute="leading" constant="20" symbolic="YES" id="R8d-VG-2we"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="6" secondAttribute="trailing" constant="20" symbolic="YES" id="TUn-PZ-fb5"/>
<constraint firstItem="10" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="2" secondAttribute="leading" constant="20" symbolic="YES" id="UHJ-Fx-Kkf"/>
<constraint firstItem="6" firstAttribute="width" secondItem="11" secondAttribute="width" id="V37-mo-ah1"/>
<constraint firstItem="9" firstAttribute="leading" secondItem="yKc-I9-uzv" secondAttribute="trailing" constant="8" symbolic="YES" id="f8B-Dm-rGD"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="12" secondAttribute="trailing" constant="20" symbolic="YES" id="hmt-qe-o3D"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="11" secondAttribute="trailing" constant="20" symbolic="YES" id="nDO-Oh-tGz"/>
<constraint firstItem="6" firstAttribute="leading" secondItem="4" secondAttribute="leading" id="tie-Hu-X1C"/>
<constraint firstItem="12" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="2" secondAttribute="leading" constant="20" symbolic="YES" id="ukY-Gg-KY2"/>
<constraint firstItem="11" firstAttribute="width" secondItem="9" secondAttribute="width" id="wEk-Sj-XCb"/>
<constraint firstItem="6" firstAttribute="leading" secondItem="11" secondAttribute="leading" id="xV3-et-ECG"/>
<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="-295" y="-412"/>
</window> </window>
</objects> </objects>
<resources> <resources>

View File

@@ -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="18122" 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="18122"/>
<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>
@@ -10,11 +10,14 @@
<connections> <connections>
<outlet property="cancelButton" destination="2pb-ZG-spA" id="YrR-Yi-dnQ"/> <outlet property="cancelButton" destination="2pb-ZG-spA" id="YrR-Yi-dnQ"/>
<outlet property="enablePasswordCheckBox" destination="d8O-Ha-rrS" id="2AI-e9-sph"/> <outlet property="enablePasswordCheckBox" destination="d8O-Ha-rrS" id="2AI-e9-sph"/>
<outlet property="keyFileWarningTextField" destination="txI-yI-5nE" id="WhF-O8-fsZ"/>
<outlet property="keyPathControl" destination="241" id="261"/> <outlet property="keyPathControl" destination="241" id="261"/>
<outlet property="messageImageView" destination="262" id="726-wK-c2h"/> <outlet property="messageImageView" destination="262" id="726-wK-c2h"/>
<outlet property="messageInfoTextField" destination="268" id="ahE-sq-QzR"/> <outlet property="messageInfoTextField" destination="268" id="ahE-sq-QzR"/>
<outlet property="passwordTextField" destination="338" id="495"/> <outlet property="passwordTextField" destination="338" id="495"/>
<outlet property="togglePasswordButton" destination="408" id="493"/> <outlet property="togglePasswordButton" destination="408" id="493"/>
<outlet property="touchIdButton" destination="mQA-C0-JyU" id="fM3-PG-1OB"/>
<outlet property="touchIdEnabledButton" destination="Hs8-Tc-ezo" id="9Go-LQ-mSw"/>
<outlet property="unlockButton" destination="2" id="ZRr-Ui-ExP"/> <outlet property="unlockButton" destination="2" id="ZRr-Ui-ExP"/>
<outlet property="view" destination="1" id="143"/> <outlet property="view" destination="1" id="143"/>
</connections> </connections>
@@ -22,23 +25,10 @@
<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 horizontalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="1"> <customView horizontalCompressionResistancePriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="1">
<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="526"/>
<subviews> <subviews>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2">
<rect key="frame" x="309" 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">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent" base64-UTF8="YES">
DQ
</string>
</buttonCell>
<connections>
<action selector="_submit:" target="-2" id="KZN-ap-nDc"/>
</connections>
</button>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="17"> <textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="17">
<rect key="frame" x="108" y="157" width="45" height="17"/> <rect key="frame" x="108" y="226" width="45" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Keyfile" id="18"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Keyfile" id="18">
<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"/>
@@ -46,13 +36,13 @@ DQ
</textFieldCell> </textFieldCell>
</textField> </textField>
<pathControl verticalHuggingPriority="750" allowsExpansionToolTips="YES" translatesAutoresizingMaskIntoConstraints="NO" id="241" customClass="MPPathControl"> <pathControl verticalHuggingPriority="750" allowsExpansionToolTips="YES" translatesAutoresizingMaskIntoConstraints="NO" id="241" customClass="MPPathControl">
<rect key="frame" x="156" y="153" width="197" height="25"/> <rect key="frame" x="156" y="222" width="197" height="25"/>
<pathCell key="cell" selectable="YES" editable="YES" alignment="left" pathStyle="popUp" id="242"> <pathCell key="cell" selectable="YES" editable="YES" alignment="left" pathStyle="popUp" id="242" customClass="MPPathCell">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</pathCell> </pathCell>
</pathControl> </pathControl>
<imageView translatesAutoresizingMaskIntoConstraints="NO" id="262"> <imageView translatesAutoresizingMaskIntoConstraints="NO" id="262">
<rect key="frame" x="230" y="241" width="48" height="48"/> <rect key="frame" x="230" y="332" width="48" height="48"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="48" id="273"/> <constraint firstAttribute="height" constant="48" id="273"/>
<constraint firstAttribute="width" constant="48" id="456"/> <constraint firstAttribute="width" constant="48" id="456"/>
@@ -60,7 +50,7 @@ DQ
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyUpOrDown" image="02_MessageBoxWarningTemplate" id="263"/> <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyUpOrDown" image="02_MessageBoxWarningTemplate" id="263"/>
</imageView> </imageView>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="268"> <textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="268">
<rect key="frame" x="199" y="216" width="110" height="17"/> <rect key="frame" x="199" y="308" width="110" height="16"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Wrong password!" id="269"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Wrong password!" id="269">
<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"/>
@@ -68,11 +58,11 @@ DQ
</textFieldCell> </textFieldCell>
</textField> </textField>
<secureTextField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="338" customClass="HNHUISecureTextField"> <secureTextField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="338" customClass="HNHUISecureTextField">
<rect key="frame" x="159" y="184" width="191" height="24"/> <rect key="frame" x="159" y="253" width="191" height="20"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="191" id="389"/> <constraint firstAttribute="width" constant="191" id="389"/>
</constraints> </constraints>
<secureTextFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="Enter Password" drawsBackground="YES" usesSingleLineMode="YES" id="339"> <secureTextFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="Enter Password" drawsBackground="YES" usesSingleLineMode="YES" id="339" customClass="HNHUISecureTextFieldCell">
<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"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
@@ -85,14 +75,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="357" y="251" width="32" 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="357" y="221" width="32" 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"/>
@@ -102,32 +92,86 @@ DQ
</connections> </connections>
</button> </button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="d8O-Ha-rrS"> <button translatesAutoresizingMaskIntoConstraints="NO" id="d8O-Ha-rrS">
<rect key="frame" x="72" y="187" width="81" height="18"/> <rect key="frame" x="66" y="254" width="85" height="18"/>
<buttonCell key="cell" type="check" title="Password" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="IU9-5u-jn9"> <buttonCell key="cell" type="check" title="Password" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="IU9-5u-jn9">
<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="2pb-ZG-spA"> <stackView distribution="fill" orientation="horizontal" alignment="top" spacing="12" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="tck-n8-s0U" userLabel="SubmitButtonContainer">
<rect key="frame" x="227" y="105" width="82" height="32"/> <rect key="frame" x="164" y="176" width="224" height="20"/>
<buttonCell key="cell" type="push" title="Cancel" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="erj-mR-UyO"> <subviews>
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2pb-ZG-spA">
<font key="font" metaFont="system"/> <rect key="frame" x="-7" y="-7" width="76" height="32"/>
<string key="keyEquivalent" base64-UTF8="YES"> <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"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent" base64-UTF8="YES">
Gw Gw
</string> </string>
</buttonCell>
<connections>
<action selector="_submit:" target="-2" id="aVF-1d-1Hq"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="mQA-C0-JyU">
<rect key="frame" x="67" y="-7" width="88" height="32"/>
<buttonCell key="cell" type="push" title="Touch ID" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="W9h-1u-9kq">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="unlockWithTouchID:" target="-2" id="1yL-6V-t8q"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="2">
<rect key="frame" x="153" y="-7" width="78" height="32"/>
<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"/>
<font key="font" metaFont="system"/>
<string key="keyEquivalent" base64-UTF8="YES">
DQ
</string>
</buttonCell>
<connections>
<action selector="_submit:" target="-2" id="KZN-ap-nDc"/>
</connections>
</button>
</subviews>
<visibilityPriorities>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
</visibilityPriorities>
<customSpacing>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
<textField hidden="YES" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="txI-yI-5nE">
<rect key="frame" x="157" y="204" width="195" height="14"/>
<textFieldCell key="cell" selectable="YES" title="key_file_warnig" id="f6J-5f-ZvP">
<font key="font" usesAppearanceFont="YES"/>
<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="Hs8-Tc-ezo">
<rect key="frame" x="66" y="287" width="76" height="18"/>
<buttonCell key="cell" type="check" title="TouchID" bezelStyle="regularSquare" imagePosition="left" allowsMixedState="YES" inset="2" id="h3C-Z4-x7N">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
<connections> <connections>
<action selector="_submit:" target="-2" id="aVF-1d-1Hq"/> <action selector="touchIdEnabledChanged:" target="-2" id="3pR-xA-wbI"/>
</connections> </connections>
</button> </button>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="2" secondAttribute="bottom" constant="20" symbolic="YES" id="122"/>
<constraint firstItem="262" firstAttribute="top" relation="greaterThanOrEqual" secondItem="1" secondAttribute="top" constant="20" symbolic="YES" id="276"/> <constraint firstItem="262" firstAttribute="top" relation="greaterThanOrEqual" secondItem="1" secondAttribute="top" constant="20" symbolic="YES" id="276"/>
<constraint firstAttribute="centerX" secondItem="262" secondAttribute="centerX" id="286"/> <constraint firstAttribute="centerX" secondItem="262" secondAttribute="centerX" id="286"/>
<constraint firstAttribute="centerY" secondItem="338" secondAttribute="centerY" id="386"/> <constraint firstAttribute="centerY" secondItem="338" secondAttribute="centerY" id="386"/>
<constraint firstItem="338" firstAttribute="top" secondItem="268" secondAttribute="bottom" constant="8" symbolic="YES" id="400"/>
<constraint firstItem="268" firstAttribute="top" secondItem="262" secondAttribute="bottom" constant="8" symbolic="YES" id="402"/> <constraint firstItem="268" firstAttribute="top" secondItem="262" secondAttribute="bottom" constant="8" symbolic="YES" id="402"/>
<constraint firstItem="408" firstAttribute="top" secondItem="338" secondAttribute="top" id="411"/> <constraint firstItem="408" firstAttribute="top" secondItem="338" secondAttribute="top" id="411"/>
<constraint firstItem="268" firstAttribute="centerX" secondItem="338" secondAttribute="centerX" id="447"/> <constraint firstItem="268" firstAttribute="centerX" secondItem="338" secondAttribute="centerX" id="447"/>
@@ -141,23 +185,28 @@ Gw
<constraint firstItem="486" firstAttribute="leading" secondItem="241" secondAttribute="trailing" constant="8" symbolic="YES" id="489"/> <constraint firstItem="486" firstAttribute="leading" secondItem="241" secondAttribute="trailing" constant="8" symbolic="YES" id="489"/>
<constraint firstItem="486" firstAttribute="leading" secondItem="408" secondAttribute="leading" id="490"/> <constraint firstItem="486" firstAttribute="leading" secondItem="408" secondAttribute="leading" id="490"/>
<constraint firstItem="408" firstAttribute="trailing" secondItem="486" secondAttribute="trailing" id="492"/> <constraint firstItem="408" firstAttribute="trailing" secondItem="486" secondAttribute="trailing" id="492"/>
<constraint firstItem="2" firstAttribute="trailing" secondItem="486" secondAttribute="trailing" id="496"/> <constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="Hs8-Tc-ezo" secondAttribute="trailing" constant="20" symbolic="YES" id="4Zq-48-2fD"/>
<constraint firstItem="tck-n8-s0U" firstAttribute="top" secondItem="txI-yI-5nE" secondAttribute="bottom" constant="8" id="6tz-an-3SW"/>
<constraint firstItem="408" firstAttribute="leading" secondItem="338" secondAttribute="trailing" constant="8" symbolic="YES" id="7qE-8F-QgB"/> <constraint firstItem="408" firstAttribute="leading" secondItem="338" secondAttribute="trailing" constant="8" symbolic="YES" id="7qE-8F-QgB"/>
<constraint firstItem="2pb-ZG-spA" firstAttribute="baseline" secondItem="2" secondAttribute="baseline" id="9nK-MH-Ozs"/> <constraint firstItem="txI-yI-5nE" firstAttribute="trailing" secondItem="241" secondAttribute="trailing" id="AVL-HO-SMq"/>
<constraint firstItem="17" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="EOa-K4-v7J"/> <constraint firstItem="17" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="EOa-K4-v7J"/>
<constraint firstItem="338" firstAttribute="leading" secondItem="d8O-Ha-rrS" secondAttribute="trailing" constant="8" symbolic="YES" id="KYs-Ia-SVl"/> <constraint firstItem="338" firstAttribute="leading" secondItem="d8O-Ha-rrS" secondAttribute="trailing" constant="8" symbolic="YES" id="KYs-Ia-SVl"/>
<constraint firstItem="2pb-ZG-spA" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="1" secondAttribute="leading" constant="20" symbolic="YES" id="SUS-76-os4"/> <constraint firstItem="Hs8-Tc-ezo" firstAttribute="leading" secondItem="d8O-Ha-rrS" secondAttribute="leading" id="MO7-cs-9KQ"/>
<constraint firstItem="d8O-Ha-rrS" firstAttribute="top" secondItem="Hs8-Tc-ezo" secondAttribute="bottom" constant="17" id="Rhp-Gn-AaI"/>
<constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="tck-n8-s0U" secondAttribute="bottom" constant="20" symbolic="YES" id="Sny-FR-cY1"/>
<constraint firstItem="tck-n8-s0U" firstAttribute="trailing" secondItem="486" secondAttribute="trailing" id="UtJ-18-p5u"/>
<constraint firstItem="Hs8-Tc-ezo" firstAttribute="firstBaseline" secondItem="268" secondAttribute="firstBaseline" constant="20" id="e94-Kz-Ohn"/>
<constraint firstItem="d8O-Ha-rrS" firstAttribute="centerY" secondItem="338" secondAttribute="centerY" id="kgB-jV-OGy"/> <constraint firstItem="d8O-Ha-rrS" firstAttribute="centerY" secondItem="338" secondAttribute="centerY" id="kgB-jV-OGy"/>
<constraint firstItem="2" firstAttribute="top" secondItem="486" secondAttribute="bottom" constant="20" symbolic="YES" id="v1K-wm-EeB"/> <constraint firstItem="txI-yI-5nE" firstAttribute="top" secondItem="241" secondAttribute="bottom" constant="8" symbolic="YES" id="lfg-eB-T2O"/>
<constraint firstItem="txI-yI-5nE" firstAttribute="leading" secondItem="241" secondAttribute="leading" id="nGY-6Q-Vwy"/>
<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"/>
</constraints> </constraints>
<point key="canvasLocation" x="-217" y="-96"/> <point key="canvasLocation" x="-127" y="-46"/>
</customView> </customView>
</objects> </objects>
<resources> <resources>
<image name="02_MessageBoxWarningTemplate" width="16" height="16"/> <image name="02_MessageBoxWarningTemplate" width="16" height="16"/>
<image name="NSQuickLookTemplate" width="19" height="12"/> <image name="NSQuickLookTemplate" width="21" height="13"/>
<image name="NSStopProgressTemplate" width="11" height="11"/> <image name="NSStopProgressTemplate" width="14" height="13"/>
</resources> </resources>
</document> </document>

View File

@@ -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>

View File

@@ -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="15705" 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="15705"/>
<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="224" width="333" height="16"/>
<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" 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" ambiguous="YES" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnSelection="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="35" usesAutomaticRowHeights="YES" 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"/>
@@ -99,12 +100,12 @@
</textFieldCell> </textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/> <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews> <prototypeCellViews>
<tableCellView id="vVt-P3-yLp" customClass="MPPluginTabelCellView"> <tableCellView misplaced="YES" id="vVt-P3-yLp" customClass="MPExtendedTableCellView">
<rect key="frame" x="1" y="1" width="145" height="35"/> <rect key="frame" x="1" y="1" width="145" height="35"/>
<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="16"/>
<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" 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>

View File

@@ -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>

View File

@@ -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="15702" 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="15702"/>
<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>
@@ -18,11 +18,11 @@
<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 id="c22-O7-iKe"> <customView id="c22-O7-iKe">
<rect key="frame" x="0.0" y="0.0" width="205" height="215"/> <rect key="frame" x="0.0" y="0.0" width="207" height="213"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews> <subviews>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IZP-Gd-jdU"> <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IZP-Gd-jdU">
<rect key="frame" x="13" y="152" width="82" height="25"/> <rect key="frame" x="13" y="151" width="83" height="23"/>
<popUpButtonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="KPf-xE-gde"> <popUpButtonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="KPf-xE-gde">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/> <font key="font" metaFont="menu"/>
@@ -37,7 +37,7 @@
</connections> </connections>
</popUpButton> </popUpButton>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IFf-vC-3vk" customClass="HNHUITextField"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IFf-vC-3vk" customClass="HNHUITextField">
<rect key="frame" x="13" y="102" width="172" height="22"/> <rect key="frame" x="13" y="101" width="174" height="21"/>
<constraints> <constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="100" id="Seu-01-P53"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="100" id="Seu-01-P53"/>
</constraints> </constraints>
@@ -48,14 +48,14 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="T2o-aJ-JmD"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="T2o-aJ-JmD">
<rect key="frame" x="147" y="18" width="38" height="25"/> <rect key="frame" x="149" y="19" width="38" height="23"/>
<buttonCell key="cell" type="roundTextured" title="Use" bezelStyle="texturedRounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Kqx-qm-nMG"> <buttonCell key="cell" type="roundTextured" title="Use" bezelStyle="texturedRounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Kqx-qm-nMG">
<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>
</button> </button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="VR5-Rx-ueN"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="VR5-Rx-ueN">
<rect key="frame" x="101" y="184" width="24" height="14"/> <rect key="frame" x="102" y="182" width="24" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Key" id="K1t-OZ-ACe"> <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Key" id="K1t-OZ-ACe">
<font key="font" metaFont="smallSystem"/> <font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
@@ -63,7 +63,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="sZo-ie-Asw"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="sZo-ie-Asw">
<rect key="frame" x="11" y="184" width="58" height="14"/> <rect key="frame" x="11" y="182" width="58" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Reference" id="r1V-VE-ngy"> <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Reference" id="r1V-VE-ngy">
<font key="font" metaFont="smallSystem"/> <font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
@@ -71,10 +71,10 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<popUpButton horizontalHuggingPriority="249" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="b4e-k2-WPS"> <popUpButton horizontalHuggingPriority="249" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="b4e-k2-WPS">
<rect key="frame" x="103" y="152" width="82" height="25"/> <rect key="frame" x="104" y="151" width="83" height="23"/>
<popUpButtonCell key="cell" type="roundTextured" title="Matching" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" selectedItem="yT1-XL-k6a" id="Aob-tW-bUP"> <popUpButtonCell key="cell" type="roundTextured" title="Matching" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" selectedItem="yT1-XL-k6a" id="Aob-tW-bUP">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/> <font key="font" metaFont="system"/>
<menu key="menu" id="j2A-qj-k7L"> <menu key="menu" id="j2A-qj-k7L">
<items> <items>
<menuItem title="Matching" state="on" id="yT1-XL-k6a"> <menuItem title="Matching" state="on" id="yT1-XL-k6a">
@@ -88,7 +88,7 @@
</connections> </connections>
</popUpButton> </popUpButton>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="WTJ-he-uTu"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="WTJ-he-uTu">
<rect key="frame" x="11" y="132" width="37" height="14"/> <rect key="frame" x="11" y="130" width="37" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Match" id="9ce-da-syF"> <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Match" id="9ce-da-syF">
<font key="font" metaFont="smallSystem"/> <font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
@@ -96,7 +96,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="mcC-bG-cCz"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="mcC-bG-cCz">
<rect key="frame" x="11" y="80" width="92" height="14"/> <rect key="frame" x="11" y="79" width="92" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Reference String" id="gik-Ha-hRd"> <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Reference String" id="gik-Ha-hRd">
<font key="font" metaFont="smallSystem"/> <font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
@@ -104,7 +104,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="b36-T7-1tO" customClass="HNHUITextField"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="b36-T7-1tO" customClass="HNHUITextField">
<rect key="frame" x="13" y="50" width="172" height="22"/> <rect key="frame" x="13" y="50" width="174" height="21"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="Reference" drawsBackground="YES" id="dr9-x8-kKk"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" placeholderString="Reference" drawsBackground="YES" id="dr9-x8-kKk">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>

View File

@@ -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="15702" 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="15702"/>
<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,11 +28,11 @@
<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="system"/>
<menu key="menu" title="OtherViews" id="RKd-H8-eCF"> <menu key="menu" title="OtherViews" id="RKd-H8-eCF">
<items> <items>
<menuItem title="every Hour" tag="3600" id="DjF-1I-6Nq"/> <menuItem title="every Hour" tag="3600" id="DjF-1I-6Nq"/>
@@ -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="23" width="118" height="16"/>
<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>

View File

@@ -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="16097.2" 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="16097.2"/>
<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>
@@ -15,17 +15,17 @@
<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"/>
<view id="9Nv-Zl-Z9p"> <view id="9Nv-Zl-Z9p">
<rect key="frame" x="0.0" y="0.0" width="571" height="320"/> <rect key="frame" x="0.0" y="0.0" width="600" height="302"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<stackView orientation="horizontal" alignment="centerY" spacing="2" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="ITj-5P-sn9"> <customView translatesAutoresizingMaskIntoConstraints="NO" id="JV1-lh-OtN" userLabel="Side Buttons Holder">
<rect key="frame" x="20" y="0.0" width="551" height="320"/> <rect key="frame" x="0.0" y="0.0" width="401" height="302"/>
<middleViews> <subviews>
<stackView orientation="vertical" alignment="centerX" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="jd3-xw-cZP"> <stackView orientation="vertical" alignment="centerX" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" translatesAutoresizingMaskIntoConstraints="NO" id="jd3-xw-cZP">
<rect key="frame" x="165" y="0.0" width="222" height="320"/> <rect key="frame" x="90" y="40" width="222" height="222"/>
<middleViews> <middleViews>
<imageView misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="VWi-da-LGh"> <imageView translatesAutoresizingMaskIntoConstraints="NO" id="VWi-da-LGh">
<rect key="frame" x="47" y="115" width="128" height="128"/> <rect key="frame" x="47" y="94" width="128" height="128"/>
<constraints> <constraints>
<constraint firstAttribute="height" constant="128" id="T0d-gp-edr"/> <constraint firstAttribute="height" constant="128" id="T0d-gp-edr"/>
<constraint firstAttribute="width" constant="128" id="Xdf-jE-D9H"/> <constraint firstAttribute="width" constant="128" id="Xdf-jE-D9H"/>
@@ -33,15 +33,13 @@
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="MacPassAppIcon" id="9f2-Co-St2"/> <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="MacPassAppIcon" id="9f2-Co-St2"/>
</imageView> </imageView>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="EEg-rH-sPx"> <textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="EEg-rH-sPx">
<rect key="frame" x="-2" y="78" width="226" height="29"/> <rect key="frame" x="-2" y="58" width="226" height="28"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Welcome to MacPass" id="zdv-z8-khG"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Welcome to MacPass" id="zdv-z8-khG">
<font key="font" metaFont="system" size="24"/> <font key="font" metaFont="system" size="24"/>
<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>
</middleViews>
<endViews>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="MmF-PL-dgZ"> <button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="MmF-PL-dgZ">
<rect key="frame" x="39" y="22" width="144" height="32"/> <rect key="frame" x="39" y="22" width="144" height="32"/>
<buttonCell key="cell" type="push" title="Open Database…" bezelStyle="rounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Jj3-zy-gaz"> <buttonCell key="cell" type="push" title="Open Database…" bezelStyle="rounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Jj3-zy-gaz">
@@ -54,7 +52,7 @@
</button> </button>
<button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="IRO-Hz-Zjp"> <button verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="IRO-Hz-Zjp">
<rect key="frame" x="26" y="-7" width="170" height="32"/> <rect key="frame" x="26" y="-7" width="170" height="32"/>
<buttonCell key="cell" type="push" title="Create new Database" bezelStyle="rounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Vxx-Ql-eI5"> <buttonCell key="cell" type="push" title="Create Database" bezelStyle="rounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Vxx-Ql-eI5">
<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>
@@ -62,10 +60,7 @@
<action selector="createNewDatabase:" target="-1" id="hbV-Rz-x5g"/> <action selector="createNewDatabase:" target="-1" id="hbV-Rz-x5g"/>
</connections> </connections>
</button> </button>
</endViews> </middleViews>
<constraints>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="300" id="f86-vL-FmV"/>
</constraints>
<visibilityPriorities> <visibilityPriorities>
<integer value="1000"/> <integer value="1000"/>
<integer value="1000"/> <integer value="1000"/>
@@ -79,115 +74,105 @@
<real value="3.4028234663852886e+38"/> <real value="3.4028234663852886e+38"/>
</customSpacing> </customSpacing>
</stackView> </stackView>
</middleViews> </subviews>
<endViews>
<scrollView misplaced="YES" autohidesScrollers="YES" horizontalLineScroll="40" horizontalPageScroll="10" verticalLineScroll="40" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eUA-6g-T1O">
<rect key="frame" x="389" y="0.0" width="162" height="320"/>
<clipView key="contentView" id="0Kf-Fq-by2">
<rect key="frame" x="1" y="1" width="160" height="318"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="38" rowSizeStyle="automatic" viewBased="YES" id="51b-Ql-3gM">
<rect key="frame" x="0.0" y="0.0" width="160" height="318"/>
<autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn width="157" minWidth="40" maxWidth="1000" id="oLj-wZ-syY">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="Fbl-HT-XIu">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView id="6UF-Gr-4nf">
<rect key="frame" x="1" y="1" width="157" height="38"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Kko-1G-JNn">
<rect key="frame" x="2" y="3" width="32" height="32"/>
<constraints>
<constraint firstAttribute="width" secondItem="Kko-1G-JNn" secondAttribute="height" multiplier="1:1" id="DCx-UU-29t"/>
<constraint firstAttribute="height" constant="32" id="tUG-uX-FuQ"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSActionTemplate" id="9TF-9t-7gd"/>
</imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsExpansionToolTips="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Kso-jb-pRH">
<rect key="frame" x="39" y="11" width="118" height="17"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="vzM-ly-CYn">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="Kso-jb-pRH" firstAttribute="centerY" secondItem="6UF-Gr-4nf" secondAttribute="centerY" id="EFe-Eu-cwW"/>
<constraint firstItem="Kso-jb-pRH" firstAttribute="leading" secondItem="Kko-1G-JNn" secondAttribute="trailing" constant="7" id="Jlp-gO-6rv"/>
<constraint firstItem="Kko-1G-JNn" firstAttribute="leading" secondItem="6UF-Gr-4nf" secondAttribute="leading" constant="2" id="RV0-o5-iyA"/>
<constraint firstItem="Kko-1G-JNn" firstAttribute="centerY" secondItem="6UF-Gr-4nf" secondAttribute="centerY" id="oFg-c1-o9M"/>
<constraint firstAttribute="trailing" secondItem="Kso-jb-pRH" secondAttribute="trailing" constant="2" id="ptI-vC-fK9"/>
</constraints>
<connections>
<outlet property="imageView" destination="Kko-1G-JNn" id="AvW-EL-9Rw"/>
<outlet property="textField" destination="Kso-jb-pRH" id="yWg-4p-sFp"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
<connections>
<action trigger="doubleAction" selector="openRecentURL:" target="-2" id="kTu-60-aYp"/>
<outlet property="dataSource" destination="-2" id="pLD-5Q-GVH"/>
<outlet property="delegate" destination="-2" id="hO0-G9-RVy"/>
</connections>
</tableView>
</subviews>
</clipView>
<constraints>
<constraint firstAttribute="width" constant="200" id="R0Z-La-Y3C"/>
</constraints>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="bRy-ef-e76">
<rect key="frame" x="1" y="303" width="135" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="2e9-uR-dY7">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
</endViews>
<constraints> <constraints>
<constraint firstAttribute="bottom" secondItem="jd3-xw-cZP" secondAttribute="bottom" constant="20" id="581-be-EbR"/> <constraint firstItem="jd3-xw-cZP" firstAttribute="centerX" secondItem="JV1-lh-OtN" secondAttribute="centerX" id="8C8-ZW-58v"/>
<constraint firstItem="jd3-xw-cZP" firstAttribute="top" secondItem="ITj-5P-sn9" secondAttribute="top" constant="20" id="9he-mz-Ciw"/> <constraint firstItem="jd3-xw-cZP" firstAttribute="centerY" secondItem="JV1-lh-OtN" secondAttribute="centerY" id="HeM-vT-DHO"/>
<constraint firstAttribute="bottom" secondItem="eUA-6g-T1O" secondAttribute="bottom" constant="-1" id="Ejt-qZ-puH"/> <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="300" id="LaQ-Zq-f9E"/>
<constraint firstAttribute="trailing" secondItem="eUA-6g-T1O" secondAttribute="trailing" constant="-1" id="PEw-In-uMJ"/>
<constraint firstItem="eUA-6g-T1O" firstAttribute="top" secondItem="ITj-5P-sn9" secondAttribute="top" constant="-1" id="piI-8Q-zsE"/>
</constraints> </constraints>
<visibilityPriorities> </customView>
<integer value="1000"/> <scrollView autohidesScrollers="YES" horizontalLineScroll="40" horizontalPageScroll="10" verticalLineScroll="40" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eUA-6g-T1O">
<integer value="1000"/> <rect key="frame" x="401" y="-1" width="200" height="304"/>
</visibilityPriorities> <clipView key="contentView" id="0Kf-Fq-by2">
<customSpacing> <rect key="frame" x="1" y="1" width="198" height="302"/>
<real value="3.4028234663852886e+38"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<real value="3.4028234663852886e+38"/> <subviews>
</customSpacing> <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="38" rowSizeStyle="automatic" viewBased="YES" id="51b-Ql-3gM">
</stackView> <rect key="frame" x="0.0" y="0.0" width="198" height="302"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn width="195" minWidth="40" maxWidth="1000" id="oLj-wZ-syY">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="Fbl-HT-XIu">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView id="6UF-Gr-4nf">
<rect key="frame" x="1" y="1" width="195" height="38"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Kko-1G-JNn">
<rect key="frame" x="2" y="3" width="32" height="32"/>
<constraints>
<constraint firstAttribute="width" secondItem="Kko-1G-JNn" secondAttribute="height" multiplier="1:1" id="DCx-UU-29t"/>
<constraint firstAttribute="height" constant="32" id="tUG-uX-FuQ"/>
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSActionTemplate" id="9TF-9t-7gd"/>
</imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsExpansionToolTips="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Kso-jb-pRH">
<rect key="frame" x="39" y="11" width="156" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="vzM-ly-CYn">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="Kso-jb-pRH" firstAttribute="centerY" secondItem="6UF-Gr-4nf" secondAttribute="centerY" id="EFe-Eu-cwW"/>
<constraint firstItem="Kso-jb-pRH" firstAttribute="leading" secondItem="Kko-1G-JNn" secondAttribute="trailing" constant="7" id="Jlp-gO-6rv"/>
<constraint firstItem="Kko-1G-JNn" firstAttribute="leading" secondItem="6UF-Gr-4nf" secondAttribute="leading" constant="2" id="RV0-o5-iyA"/>
<constraint firstItem="Kko-1G-JNn" firstAttribute="centerY" secondItem="6UF-Gr-4nf" secondAttribute="centerY" id="oFg-c1-o9M"/>
<constraint firstAttribute="trailing" secondItem="Kso-jb-pRH" secondAttribute="trailing" constant="2" id="ptI-vC-fK9"/>
</constraints>
<connections>
<outlet property="imageView" destination="Kko-1G-JNn" id="AvW-EL-9Rw"/>
<outlet property="textField" destination="Kso-jb-pRH" id="yWg-4p-sFp"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
</tableColumns>
<connections>
<action trigger="doubleAction" selector="openRecentURL:" target="-2" id="kTu-60-aYp"/>
<outlet property="dataSource" destination="-2" id="pLD-5Q-GVH"/>
<outlet property="delegate" destination="-2" id="hO0-G9-RVy"/>
</connections>
</tableView>
</subviews>
</clipView>
<constraints>
<constraint firstAttribute="width" constant="200" id="R0Z-La-Y3C"/>
</constraints>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="bRy-ef-e76">
<rect key="frame" x="1" y="287" width="198" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="2e9-uR-dY7">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstAttribute="trailing" secondItem="ITj-5P-sn9" secondAttribute="trailing" id="7Bo-Jl-7Zu"/> <constraint firstAttribute="bottom" secondItem="eUA-6g-T1O" secondAttribute="bottom" constant="-1" id="6ri-AE-xpC"/>
<constraint firstItem="ITj-5P-sn9" firstAttribute="top" secondItem="9Nv-Zl-Z9p" secondAttribute="top" id="lrE-f8-tD5"/> <constraint firstItem="eUA-6g-T1O" firstAttribute="top" secondItem="9Nv-Zl-Z9p" secondAttribute="top" constant="-1" id="D5N-Fq-0LP"/>
<constraint firstItem="ITj-5P-sn9" firstAttribute="leading" secondItem="9Nv-Zl-Z9p" secondAttribute="leading" constant="20" id="oWL-PJ-VCT"/> <constraint firstItem="JV1-lh-OtN" firstAttribute="top" secondItem="9Nv-Zl-Z9p" secondAttribute="top" id="RPE-bR-zfc"/>
<constraint firstAttribute="bottom" secondItem="ITj-5P-sn9" secondAttribute="bottom" id="syW-TO-uwv"/> <constraint firstAttribute="trailing" secondItem="eUA-6g-T1O" secondAttribute="trailing" constant="-1" id="VMx-Ef-cEG"/>
<constraint firstItem="JV1-lh-OtN" firstAttribute="leading" secondItem="9Nv-Zl-Z9p" secondAttribute="leading" id="W2e-Nw-pfi"/>
<constraint firstItem="eUA-6g-T1O" firstAttribute="leading" secondItem="JV1-lh-OtN" secondAttribute="trailing" id="Z02-i4-6Jm"/>
<constraint firstAttribute="bottom" secondItem="JV1-lh-OtN" secondAttribute="bottom" id="ow6-hF-qkt"/>
</constraints> </constraints>
<point key="canvasLocation" x="-378" y="-552"/> <point key="canvasLocation" x="-714" y="-522"/>
</view> </view>
</objects> </objects>
<resources> <resources>

View File

@@ -1,16 +1,18 @@
<?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="17701" 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="17701"/>
<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="generatePasswordOnEntriesCheckButton" destination="yxq-YK-61i" id="0SK-CT-Wdn"/>
<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 +20,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="449" height="338"/>
<subviews> <subviews>
<box autoresizesSubviews="NO" verticalHuggingPriority="500" title="Entry Table" borderType="line" translatesAutoresizingMaskIntoConstraints="NO" id="2"> <box autoresizesSubviews="NO" horizontalHuggingPriority="249" 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="194" width="415" height="96"/>
<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="409" height="78"/>
<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="51" width="134" height="16"/>
<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 +37,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="155" y="44" width="110" 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 +50,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="21" width="134" height="16"/>
<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 +58,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="155" y="16" width="140" height="23"/>
<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 +71,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="112" y="294" width="136" 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,22 +105,29 @@
</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="301" width="91" height="16"/>
<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 horizontalHuggingPriority="249" borderType="line" title="New Entries" translatesAutoresizingMaskIntoConstraints="NO" id="Xvt-tP-TbR">
<rect key="frame" x="17" y="16" width="366" height="70"/> <rect key="frame" x="17" y="94" width="415" height="96"/>
<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="409" height="78"/>
<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="41" width="354" 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="Generate password for entries created from templates" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="RaM-t2-DVR">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="yxq-YK-61i">
<rect key="frame" x="18" y="19" width="238" height="18"/>
<buttonCell key="cell" type="check" title="Generate password for new entries" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="iCq-mG-p81">
<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>
@@ -123,33 +135,56 @@
</subviews> </subviews>
<constraints> <constraints>
<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="yxq-YK-61i" firstAttribute="leading" secondItem="LPY-sM-hjS" secondAttribute="leading" id="LfJ-z5-Q3P"/>
<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="trailing" relation="greaterThanOrEqual" secondItem="yxq-YK-61i" secondAttribute="trailing" constant="20" symbolic="YES" id="WHR-l8-6ce"/>
<constraint firstAttribute="trailing" secondItem="LPY-sM-hjS" secondAttribute="trailing" constant="20" symbolic="YES" id="wyU-eZ-BSC"/> <constraint firstAttribute="bottom" secondItem="yxq-YK-61i" secondAttribute="bottom" constant="20" symbolic="YES" id="rNE-sZ-z2e"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="LPY-sM-hjS" secondAttribute="trailing" constant="20" symbolic="YES" id="wyU-eZ-BSC"/>
<constraint firstItem="yxq-YK-61i" firstAttribute="top" secondItem="LPY-sM-hjS" secondAttribute="bottom" constant="6" symbolic="YES" id="yNh-4f-kMr"/>
</constraints>
</view>
</box>
<box horizontalHuggingPriority="249" title="Clipboard" translatesAutoresizingMaskIntoConstraints="NO" id="Kff-Xp-hAT">
<rect key="frame" x="17" y="16" width="415" height="74"/>
<view key="contentView" id="Ntf-zj-VZL">
<rect key="frame" x="3" y="3" width="409" height="56"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="vT4-wF-ned">
<rect key="frame" x="18" y="19" width="284" 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 firstItem="Kff-Xp-hAT" firstAttribute="top" secondItem="Xvt-tP-TbR" secondAttribute="bottom" constant="8" symbolic="YES" id="3RL-tm-4wu"/>
<constraint firstItem="Xvt-tP-TbR" firstAttribute="leading" secondItem="1" secondAttribute="leading" constant="20" id="BH4-4y-uma"/> <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="2" secondAttribute="bottom" constant="8" symbolic="YES" 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"/>
</constraints> </constraints>
<point key="canvasLocation" x="435" y="649"/> <point key="canvasLocation" x="-752" y="-257"/>
</customView> </customView>
</objects> </objects>
</document> </document>

View File

@@ -29,12 +29,10 @@
@implementation DDHotKey (MPKeydata) @implementation DDHotKey (MPKeydata)
+ (NSData *)hotKeyDataWithKeyCode:(unsigned short)keyCode modifierFlags:(NSUInteger)flags { + (NSData *)hotKeyDataWithKeyCode:(unsigned short)keyCode modifierFlags:(NSUInteger)flags {
NSMutableData *data = [[NSMutableData alloc] init]; NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initRequiringSecureCoding:YES];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeInt:keyCode forKey:NSStringFromSelector(@selector(keyCode))]; [archiver encodeInt:keyCode forKey:NSStringFromSelector(@selector(keyCode))];
[archiver encodeInteger:flags forKey:NSStringFromSelector(@selector(modifierFlags))]; [archiver encodeInteger:flags forKey:NSStringFromSelector(@selector(modifierFlags))];
[archiver finishEncoding]; return [archiver.encodedData copy];
return [data copy];
} }
+ (NSData *)defaultHotKeyData { + (NSData *)defaultHotKeyData {
@@ -73,7 +71,13 @@
if(keyCode == NULL || modifierFlags == NULL || data == nil) { if(keyCode == NULL || modifierFlags == NULL || data == nil) {
return NO; return NO;
} }
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
NSError *error;
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingFromData:data error:&error];
if(error) {
NSLog(@"Error while trying to decode DDHotKey %@", error.localizedDescription);
return NO;
}
*keyCode = [unarchiver decodeIntForKey:NSStringFromSelector(@selector(keyCode))]; *keyCode = [unarchiver decodeIntForKey:NSStringFromSelector(@selector(keyCode))];
*modifierFlags = [unarchiver decodeIntegerForKey:NSStringFromSelector(@selector(modifierFlags))]; *modifierFlags = [unarchiver decodeIntegerForKey:NSStringFromSelector(@selector(modifierFlags))];
return YES; return YES;
@@ -86,19 +90,19 @@
NSEventModifierFlags flags = 0; NSEventModifierFlags flags = 0;
switch(self.keyCode) { switch(self.keyCode) {
case kVK_Command: case kVK_Command:
flags = NSCommandKeyMask; flags = NSEventModifierFlagCommand;
break; break;
case kVK_Shift: case kVK_Shift:
case kVK_RightShift: case kVK_RightShift:
flags = NSShiftKeyMask; flags = NSEventModifierFlagShift;
break; break;
case kVK_Option: case kVK_Option:
case kVK_RightOption: case kVK_RightOption:
flags = NSAlternateKeyMask; flags = NSEventModifierFlagOption;
break; break;
case kVK_Control: case kVK_Control:
case kVK_RightControl: case kVK_RightControl:
flags = NSControlKeyMask; flags = NSEventModifierFlagControl;
break; break;
} }
BOOL missingModifier = self.modifierFlags == 0; BOOL missingModifier = self.modifierFlags == 0;

View File

@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="17701" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17701"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="MPDocumentSplitViewController">
<connections>
<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 translatesAutoresizingMaskIntoConstraints="NO" id="Hz6-mo-xeY">
<rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
<point key="canvasLocation" x="141" y="154"/>
</customView>
</objects>
</document>

View File

@@ -1,32 +1,28 @@
<?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="13771" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15705" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="13771"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15705"/>
<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="MPDocumentWindowController"> <customObject id="-2" userLabel="File's Owner" customClass="MPDocumentWindowController">
<connections> <connections>
<outlet property="splitView" destination="697" id="700"/>
<outlet property="window" destination="1" id="501"/> <outlet property="window" destination="1" id="501"/>
</connections> </connections>
</customObject> </customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/> <customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="DatabaseWindow" animationBehavior="default" tabbingMode="preferred" id="1"> <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="DatabaseWindow" animationBehavior="default" tabbingMode="preferred" id="1">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/> <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<windowCollectionBehavior key="collectionBehavior" fullScreenPrimary="YES"/> <windowCollectionBehavior key="collectionBehavior" fullScreenPrimary="YES"/>
<rect key="contentRect" x="196" y="240" width="700" height="500"/> <rect key="contentRect" x="196" y="240" width="700" height="500"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/> <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="700" height="500"/> <rect key="frame" x="0.0" y="0.0" width="700" height="500"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</view> </view>
<point key="canvasLocation" x="54" y="51"/> <point key="canvasLocation" x="256" y="42"/>
</window> </window>
<splitView autosaveName="" dividerStyle="thin" vertical="YES" translatesAutoresizingMaskIntoConstraints="NO" id="697">
<rect key="frame" x="0.0" y="0.0" width="560" height="194"/>
</splitView>
</objects> </objects>
</document> </document>

View File

@@ -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="17701" 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="17701"/>
<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>
@@ -15,25 +15,24 @@
</customObject> </customObject>
<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="336"> <customView misplaced="YES" translatesAutoresizingMaskIntoConstraints="NO" id="336">
<rect key="frame" x="0.0" y="0.0" width="694" height="594"/> <rect key="frame" x="0.0" y="0.0" width="695" height="523"/>
<subviews> <subviews>
<scrollView focusRingType="none" borderType="none" autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="54"> <scrollView focusRingType="none" borderType="none" autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="54">
<rect key="frame" x="0.0" y="0.0" width="694" height="595"/> <rect key="frame" x="0.0" y="0.0" width="695" height="524"/>
<clipView key="contentView" id="4tt-2K-SPF"> <clipView key="contentView" id="4tt-2K-SPF">
<rect key="frame" x="0.0" y="0.0" width="694" height="595"/> <rect key="frame" x="0.0" y="0.0" width="695" height="524"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" rowSizeStyle="automatic" headerView="676" viewBased="YES" id="55" customClass="MPTableView"> <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" rowSizeStyle="automatic" headerView="676" viewBased="YES" id="55" customClass="MPTableView">
<rect key="frame" x="0.0" y="0.0" width="694" height="572"/> <rect key="frame" x="0.0" y="0.0" width="695" height="501"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<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"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/> <color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns> <tableColumns>
<tableColumn identifier="Group Column" width="104.609375" minWidth="40" maxWidth="3.4028234663852886e+38" id="117"> <tableColumn identifier="Group Column" width="104.609375" minWidth="40" maxWidth="3.4028234663852886e+38" id="117">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left"> <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell> </tableHeaderCell>
@@ -49,7 +48,7 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="270"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="270">
<rect key="frame" x="1" y="0.0" width="103" height="17"/> <rect key="frame" x="1" y="1" width="103" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="271"> <textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="271">
<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"/>
@@ -70,7 +69,6 @@
</tableColumn> </tableColumn>
<tableColumn identifier="Title Column" width="144.1171875" minWidth="40" maxWidth="3.4028234663852886e+38" id="119"> <tableColumn identifier="Title Column" width="144.1171875" minWidth="40" maxWidth="3.4028234663852886e+38" id="119">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left"> <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell> </tableHeaderCell>
@@ -119,7 +117,6 @@
</tableColumn> </tableColumn>
<tableColumn identifier="Password Column" width="118.73046875" minWidth="10" maxWidth="3.4028234663852886e+38" id="232"> <tableColumn identifier="Password Column" width="118.73046875" minWidth="10" maxWidth="3.4028234663852886e+38" id="232">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left"> <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell> </tableHeaderCell>
@@ -135,7 +132,7 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="429" customClass="NSSecureTextField"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="429" customClass="NSSecureTextField">
<rect key="frame" x="1" y="0.0" width="116" height="17"/> <rect key="frame" x="1" y="1" width="116" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="430"> <textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="430">
<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"/>
@@ -156,7 +153,6 @@
</tableColumn> </tableColumn>
<tableColumn identifier="URL Column" width="113.18359375" minWidth="10" maxWidth="3.4028234663852886e+38" id="419"> <tableColumn identifier="URL Column" width="113.18359375" minWidth="10" maxWidth="3.4028234663852886e+38" id="419">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left"> <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell> </tableHeaderCell>
@@ -172,7 +168,7 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="422"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="422">
<rect key="frame" x="1" y="0.0" width="111" height="17"/> <rect key="frame" x="1" y="1" width="111" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="423"> <textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="423">
<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"/>
@@ -191,9 +187,8 @@
</tableCellView> </tableCellView>
</prototypeCellViews> </prototypeCellViews>
</tableColumn> </tableColumn>
<tableColumn width="199" minWidth="10" maxWidth="3.4028234663852886e+38" id="614"> <tableColumn width="200" minWidth="10" maxWidth="3.4028234663852886e+38" id="614">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left"> <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell> </tableHeaderCell>
@@ -205,11 +200,11 @@
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/> <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews> <prototypeCellViews>
<tableCellView id="616"> <tableCellView id="616">
<rect key="frame" x="493" y="1" width="199" height="17"/> <rect key="frame" x="493" y="1" width="200" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="617"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="617">
<rect key="frame" x="1" y="0.0" width="197" height="17"/> <rect key="frame" x="1" y="1" width="198" height="16"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="618"> <textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="618">
<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"/>
@@ -241,7 +236,7 @@
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
</scroller> </scroller>
<tableHeaderView key="headerView" id="676"> <tableHeaderView key="headerView" id="676">
<rect key="frame" x="0.0" y="0.0" width="694" height="23"/> <rect key="frame" x="0.0" y="0.0" width="695" height="23"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
</tableHeaderView> </tableHeaderView>
</scrollView> </scrollView>

View File

@@ -0,0 +1,17 @@
//
// KPKBinary+MacPassAddtions.h
// MacPass
//
// Created by Michael Starke on 09.11.20.
// Copyright © 2020 HicknHack Software GmbH. All rights reserved.
//
#import <KeePassKit/KeePassKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface KPKBinary (MacPassAddtions) <NSFilePromiseProviderDelegate>
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,23 @@
//
// KPKBinary+MacPassAddtions.m
// MacPass
//
// Created by Michael Starke on 09.11.20.
// Copyright © 2020 HicknHack Software GmbH. All rights reserved.
//
#import "KPKBinary+MacPassAddtions.h"
@implementation KPKBinary (MacPassAddtions)
- (NSString *)filePromiseProvider:(NSFilePromiseProvider *)filePromiseProvider fileNameForType:(NSString *)fileType {
return self.name;
}
- (void)filePromiseProvider:(NSFilePromiseProvider *)filePromiseProvider writePromiseToURL:(NSURL *)url completionHandler:(void (^)(NSError * _Nullable))completionHandler {
NSError *error;
[self saveToLocation:url error:&error];
completionHandler(error);
}
@end

View File

@@ -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];

22
MacPass/KPKEntry+MPTags.h Normal file
View File

@@ -0,0 +1,22 @@
//
// KPKEntry+MPTags.h
// MacPass
//
// Created by Michael Starke on 20.03.20.
// Copyright © 2020 HicknHack Software GmbH. All rights reserved.
//
#import <AppKit/AppKit.h>
#import <KeePassKit/KeePassKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface KPKEntry (MPTags)
@property (readonly, copy) NSString *tagsString;
@end
NS_ASSUME_NONNULL_END

24
MacPass/KPKEntry+MPTags.m Normal file
View File

@@ -0,0 +1,24 @@
//
// KPKEntry+MPTags.m
// MacPass
//
// Created by Michael Starke on 20.03.20.
// Copyright © 2020 HicknHack Software GmbH. All rights reserved.
//
#import "KPKEntry+MPTags.h"
#import <AppKit/AppKit.h>
@implementation KPKEntry (MPTags)
+ (NSSet<NSString *> *)keyPathsForValuesAffectingTagsString {
return [NSSet setWithObject:NSStringFromSelector(@selector(tags))];
}
- (NSString *)tagsString {
return [self.tags componentsJoinedByString:@" "];
}
@end

View File

@@ -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
}; };

View File

@@ -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:))
}; };

View File

@@ -23,17 +23,16 @@
#import "MPAddCustomFieldContextMenuDelegate.h" #import "MPAddCustomFieldContextMenuDelegate.h"
#import "KeePassKit/KeePassKit.h" #import "KeePassKit/KeePassKit.h"
NSString *const MPHMACOTPSeedAttributeKey = @"HMACOTP-Seed"; #import "MPEntryInspectorViewController.h"
NSString *const MPHMACOTPConfigAttributeKey = @"HMACOTP-Config";
/* /*
HmacOtp-Secret (the UTF-8 representation of the value is the secret), HmacOtp-Secret (the UTF-8 representation of the value is the secret),
HmacOtp-Secret-Hex (secret as hex string), HmacOtp-Secret-Hex (secret as hex string),
HmacOtp-Secret-Base32 (secret as Base32 string) HmacOtp-Secret-Base32 (secret as Base32 string)
HmacOtp-Secret-Base64 (secret as Base64 string) HmacOtp-Secret-Base64 (secret as Base64 string)
HmacOtp-Counter field. HmacOtp-Counter field.
*/ */
@interface MPAddCustomFieldContextMenuDelegate () @interface MPAddCustomFieldContextMenuDelegate ()
@property (readonly, nonatomic) KPKEntry *entry; @property (readonly, nonatomic) KPKEntry *entry;
@@ -51,30 +50,29 @@ HmacOtp-Counter field.
- (void)menuNeedsUpdate:(NSMenu *)menu { - (void)menuNeedsUpdate:(NSMenu *)menu {
[menu removeAllItems]; [menu removeAllItems];
//[self _setupHOTPMenuItemsToMenu:menu]; [self _setupHOTPMenuItemsToMenu:menu];
[self _setupTOTPMenuItemsToMenu:menu];
} }
/* HMAC OTP */
- (void)_setupHOTPMenuItemsToMenu:(NSMenu *)menu { - (void)_setupHOTPMenuItemsToMenu:(NSMenu *)menu {
BOOL hasConfigAttribute = nil != [self.entry customAttributeWithKey:MPHMACOTPConfigAttributeKey];
if(!hasConfigAttribute) { }
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"ADD_CUSTOM_ATTRIBUTE_HMACOTP_CONFIG", @"Menu item title for adding an hmacotp config attribute") action:@selector(_addHMACConfig:) keyEquivalent:@""]; - (IBAction)_setupHMACConfig:(id)sender {
item.target = self;
[menu addItem:item]; }
} - (IBAction)_delteHMACConfig:(id)sender {
BOOL hasSeedAttribute = nil != [self.entry customAttributeWithKey:MPHMACOTPSeedAttributeKey];
if(!hasSeedAttribute) {
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"ADD_CUSTOM_ATTRIBUTE_HMACOTP_SEED", @"Menu item title for adding an hmacotp seed attribute") action:@selector(_addHMACSeed:) keyEquivalent:@""];
item.target = self;
[menu addItem:item];
}
} }
- (IBAction)_addHMACConfig:(id)sender { /* Time OPT*/
[self.entry addCustomAttribute:[[KPKAttribute alloc] initWithKey:MPHMACOTPConfigAttributeKey value:@"<config>"]]; - (void)_setupTOTPMenuItemsToMenu:(NSMenu *)menu {
NSMenuItem *setupItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SETUP_TOTP_SETTINGS", @"Menu item title editing TOTP settings") action:@selector(showOTPSetup:) keyEquivalent:@""];
setupItem.target = self.viewController;
[menu addItem:setupItem];
} }
- (IBAction)_addHMACSeed:(id)sender { - (IBAction)_setupTOTPSettings:(id)sender {}
[self.entry addCustomAttribute:[[KPKAttribute alloc] initWithKey:MPHMACOTPSeedAttributeKey value:@"<seed>"]]; - (IBAction)_deleteTOTPSettings:(id)sender {}
}
@end @end

View File

@@ -24,6 +24,7 @@
#import "MPDocument.h" #import "MPDocument.h"
#import "MPDocumentWindowController.h" #import "MPDocumentWindowController.h"
#import "MPActionHelper.h" #import "MPActionHelper.h"
#import "KPKNode+IconImage.h"
#import "KeePassKit/KeePassKit.h" #import "KeePassKit/KeePassKit.h"
@@ -47,6 +48,8 @@
NSMenuItem *templateItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithFormat:templateMask, entry.title] NSMenuItem *templateItem = [[NSMenuItem alloc] initWithTitle:[NSString stringWithFormat:templateMask, entry.title]
action:@selector(createEntryFromTemplate:) action:@selector(createEntryFromTemplate:)
keyEquivalent:@""]; keyEquivalent:@""];
templateItem.image = [entry.iconImage copy];
templateItem.image.size = NSMakeSize(14, 14);
templateItem.representedObject = entry.uuid; templateItem.representedObject = entry.uuid;
[menu addItem:templateItem]; [menu addItem:templateItem];
} }

View File

@@ -33,6 +33,7 @@ APPKIT_EXTERN NSString *const MPDidChangeStoredKeyFilesSettings;
@property (strong) IBOutlet NSMenuItem *fileNewMenuItem; @property (strong) IBOutlet NSMenuItem *fileNewMenuItem;
@property (strong) IBOutlet NSMenu *itemMenu; @property (strong) IBOutlet NSMenu *itemMenu;
@property (strong) IBOutlet NSMenu *importMenu; @property (strong) IBOutlet NSMenu *importMenu;
@property (strong) IBOutlet NSMenu *exportMenu;
@property (strong, readonly) MPEntryContextMenuDelegate *itemActionMenuDelegate; @property (strong, readonly) MPEntryContextMenuDelegate *itemActionMenuDelegate;
@@ -42,6 +43,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;

View File

@@ -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,17 @@ 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 ignored "-Wunused-variable"
MPDocumentController *documentController = [[MPDocumentController alloc] init]; MPDocumentController *documentController = [[MPDocumentController alloc] init];
#pragma clang diagnostic pop NSAssert(documentController, @"Custom document controller cannot be nil");
} }
return self; return self;
} }
@@ -109,6 +124,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 +153,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 +180,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 +217,9 @@ 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.
NSApplication.sharedApplication.automaticCustomizeTouchBarMenuItemEnabled = YES;
} }
#pragma mark - #pragma mark -
@@ -208,23 +227,40 @@ NSString *const MPDidChangeStoredKeyFilesSettings = @"com.hicknhack.macpass.MPDi
- (void)menuNeedsUpdate:(NSMenu *)menu { - (void)menuNeedsUpdate:(NSMenu *)menu {
if(menu == self.saveMenuItem.menu) { if(menu == self.saveMenuItem.menu) {
MPDocument *document = NSDocumentController.sharedDocumentController.currentDocument; MPDocument *document = NSDocumentController.sharedDocumentController.currentDocument;
BOOL displayDots = (document.fileURL == nil || !document.compositeKey.hasPasswordOrKeyFile); BOOL displayDots = (document.fileURL == nil || !document.compositeKey.hasKeys);
NSString *saveTitle = displayDots ? NSLocalizedString(@"SAVE_WITH_DOTS", "Save file menu item title when save will prompt for a location to save or ask for a password/key") : NSLocalizedString(@"SAVE", "Save file menu item title when save will just save the file"); NSString *saveTitle = displayDots ? NSLocalizedString(@"SAVE_WITH_DOTS", "Save file menu item title when save will prompt for a location to save or ask for a password/key") : NSLocalizedString(@"SAVE", "Save file menu item title when save will just save the file");
self.saveMenuItem.title = saveTitle; self.saveMenuItem.title = saveTitle;
} }
if(menu == self.fixAutotypeMenuItem.menu) { else if(menu == self.fixAutotypeMenuItem.menu) {
self.fixAutotypeMenuItem.hidden = !(NSEvent.modifierFlags & NSAlternateKeyMask); self.fixAutotypeMenuItem.hidden = !(NSEvent.modifierFlags & NSEventModifierFlagOption);
} }
if(menu == self.importMenu) { else if(menu == self.importMenu) {
NSMenuItem *exportXML = menu.itemArray.firstObject; NSMenuItem *exportXML = menu.itemArray.firstObject;
[menu removeAllItems]; [menu removeAllItems];
[menu addItem:exportXML];
for(MPPlugin<MPImportPlugin> * plugin in MPPluginHost.sharedHost.importPlugins) { for(MPPlugin<MPImportPlugin> * plugin in MPPluginHost.sharedHost.importPlugins) {
NSMenuItem *importItem = [[NSMenuItem alloc] init]; NSMenuItem *importItem = [[NSMenuItem alloc] init];
[plugin prepareImportMenuItem:importItem]; [plugin prepareImportMenuItem:importItem];
importItem.submenu = nil; // kill any potential submenu!
importItem.representedObject = plugin.identifier;
importItem.target = nil; importItem.target = nil;
importItem.action = @selector(importFromPlugin:); importItem.action = @selector(importWithPlugin:);
[menu addItem:importItem];
}
}
else if(menu == self.exportMenu) {
NSMenuItem *importXML = menu.itemArray.firstObject;
[menu removeAllItems];
[menu addItem:importXML];
for(MPPlugin<MPExportPlugin> * plugin in MPPluginHost.sharedHost.exportPlugins) {
NSMenuItem *exportItem = [[NSMenuItem alloc] init];
[plugin prepareExportMenuItem:exportItem];
exportItem.submenu = nil; // kill any potential submenu!
exportItem.representedObject = plugin.identifier;
exportItem.target = nil;
exportItem.action = @selector(exportWithPlugin:);
[menu addItem:exportItem];
} }
[menu insertItem:exportXML atIndex:0];
} }
} }
@@ -290,6 +326,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 +350,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 +369,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 +383,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

View File

@@ -21,6 +21,7 @@
// //
#import "MPAttachmentTableDataSource.h" #import "MPAttachmentTableDataSource.h"
#import "KPKBinary+MacPassAddtions.h"
#import "MPDocument.h" #import "MPDocument.h"
@implementation MPAttachmentTableDataSource @implementation MPAttachmentTableDataSource
@@ -63,59 +64,16 @@
return YES; return YES;
} }
- (BOOL)tableView:(NSTableView *)tableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard { - (id<NSPasteboardWriting>)tableView:(NSTableView *)tableView pasteboardWriterForRow:(NSInteger)row {
[pboard declareTypes:@[NSFilesPromisePboardType] owner:nil];
MPDocument *document = tableView.window.windowController.document; MPDocument *document = tableView.window.windowController.document;
KPKEntry *entry = document.selectedEntries.count == 1 ? document.selectedEntries.lastObject : nil; KPKEntry *entry = document.selectedEntries.count == 1 ? document.selectedEntries.lastObject : nil;
NSMutableArray *fileNames = [[NSMutableArray alloc] init];
for(KPKBinary *binary in [entry.binaries objectsAtIndexes:rowIndexes]) {
if(binary.name) {
[fileNames addObject:binary.name];
}
}
[pboard setPropertyList:fileNames forType:NSFilesPromisePboardType];
return YES;
}
- (NSArray<NSString *> *)tableView:(NSTableView *)tableView namesOfPromisedFilesDroppedAtDestination:(NSURL *)dropDestination forDraggedRowsWithIndexes:(NSIndexSet *)indexSet {
MPDocument *document = tableView.window.windowController.document;
KPKEntry *entry = document.selectedEntries.count == 1 ? document.selectedEntries.lastObject : nil;
NSMutableArray<NSString *> *fileNames = [[NSMutableArray alloc] init];
NSArray<KPKBinary *> *draggedBinaries = [entry.binaries objectsAtIndexes:indexSet];
for(KPKBinary *binary in draggedBinaries) {
if(binary.name) {
[fileNames addObject:binary.name];
dispatch_queue_t queue = dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0);
dispatch_async(queue, ^{
NSError *error;
NSURL *saveLocation = [dropDestination URLByAppendingPathComponent:binary.name];
BOOL success = [binary saveToLocation:saveLocation error:&error];
if(!success && error) {
dispatch_async(dispatch_get_main_queue(), ^{
[NSApp presentError:error];
});
}
});
}
}
return [fileNames copy];
}
/*
- (id<NSPasteboardWriting>)tableView:(NSTableView *)tableView pasteboardWriterForRow:(NSInteger)row {
MPDocument *document = tableView.window.windowController.document;
KPKEntry *entry = document.selectedEntries.count == 1 ? document.selectedEntries.lastObject : nil;
if(!entry) { if(!entry) {
return nil; return nil;
} }
if (@available(macOS 10.12, *)) { KPKBinary *binary = entry.binaries[row];
KPKBinary *binary = entry.binaries[row]; NSFilePromiseProvider *provider = [[NSFilePromiseProvider alloc] initWithFileType:(NSString *)kUTTypeData delegate:binary];
NSFilePromiseProvider *provider = [[NSFilePromiseProvider alloc] initWithFileType:(NSString *)kUTTypeXML delegate:binary]; return provider;
return provider;
}
return nil;
} }
*/
@end @end

View File

@@ -22,12 +22,19 @@
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>
NS_ASSUME_NONNULL_BEGIN
@class MPAutotypeEnvironment;
@class MPAutotypeContext;
@interface MPAutotypeCandidateSelectionViewController : NSViewController @interface MPAutotypeCandidateSelectionViewController : NSViewController
@property (copy) NSArray *candidates; @property (strong) MPAutotypeEnvironment *environment;
@property (copy) NSArray<MPAutotypeContext *> *candidates;
- (IBAction)selectAutotypeContext:(id)sender; - (IBAction)selectAutotypeContext:(id)sender;
- (IBAction)cancelSelection:(id)sender; - (IBAction)cancelSelection:(id)sender;
@end @end
NS_ASSUME_NONNULL_END

View File

@@ -22,15 +22,18 @@
#import "MPAutotypeCandidateSelectionViewController.h" #import "MPAutotypeCandidateSelectionViewController.h"
#import "MPAutotypeContext.h" #import "MPAutotypeContext.h"
#import "MPAutotypeDaemon.h" #import "MPAutotypeDaemon.h"
#import "MPAutotypeEnvironment.h"
#import "MPExtendedTableCellView.h"
#import "KPKNode+IconImage.h" #import "KPKNode+IconImage.h"
#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;
@property (strong) IBOutlet NSImageView *targetApplicationImageView;
@end @end
@implementation MPAutotypeCandidateSelectionViewController @implementation MPAutotypeCandidateSelectionViewController
@@ -41,7 +44,27 @@
- (void)viewDidLoad { - (void)viewDidLoad {
[super viewDidLoad]; [super viewDidLoad];
self.selectAutotypeContextButton.enabled = NO; self.selectAutotypeContextButton.enabled = NO;
NSRunningApplication *targetApplication = [NSRunningApplication runningApplicationWithProcessIdentifier:self.environment.pid];
if(nil != targetApplication) {
self.targetApplicationImageView.image = [self _composeInfoImage];
}
NSString *template = @"";
if(self.candidates.count > 1) {
template = NSLocalizedString(@"AUTOTYPE_CANDIDATE_SELECTION_WINDOW_MESSAGE_%@_%@", "Message text in the autotype selection window. Placeholder is %1 - applicationName, %2 windowTitle");
self.messageTextField.stringValue = [NSString stringWithFormat:template, targetApplication.localizedName, self.environment.windowTitle];
NSInteger rows = MIN(self.candidates.count, 5);
[self.contextTableView.enclosingScrollView.heightAnchor constraintGreaterThanOrEqualToConstant:39 * rows].active = YES;
}
else {
template = NSLocalizedString(@"AUTOTYPE_CANDIDATE_CONFIRMATION_WINDOW_MESSAGE_%@_%@", "Message text in the autotype confirmation window. Placeholder is %1 - applicationName, %2 windowTitle");
self.messageTextField.stringValue = [NSString stringWithFormat:template, targetApplication.localizedName, self.environment.windowTitle];
[self.contextTableView.enclosingScrollView.heightAnchor constraintEqualToConstant:39].active = YES;
}
NSNotification *notification = [NSNotification notificationWithName:NSTableViewSelectionDidChangeNotification object:self.contextTableView]; NSNotification *notification = [NSNotification notificationWithName:NSTableViewSelectionDidChangeNotification object:self.contextTableView];
[self tableViewSelectionDidChange:notification]; [self tableViewSelectionDidChange:notification];
} }
@@ -55,12 +78,10 @@
#pragma mark NSTableViewDelegate #pragma mark NSTableViewDelegate
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
NSTableCellView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self]; MPExtendedTableCellView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:self];
MPAutotypeContext *context = self.candidates[row]; MPAutotypeContext *context = self.candidates[row];
NSString *maskedEvaluatedCommand = context.maskedEvaluatedCommand; view.addionalTextField.stringValue = context.maskedEvaluatedCommand;
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@\n%@", context.entry.title, maskedEvaluatedCommand]]; view.textField.stringValue = context.entry.title;
[string setAttributes:@{NSForegroundColorAttributeName: NSColor.disabledControlTextColor} range:NSMakeRange((string.length - maskedEvaluatedCommand.length), maskedEvaluatedCommand.length)];
view.textField.attributedStringValue = string;
view.imageView.image = context.entry.iconImage; view.imageView.image = context.entry.iconImage;
return view; return view;
} }
@@ -77,7 +98,7 @@
- (void)selectAutotypeContext:(id)sender { - (void)selectAutotypeContext:(id)sender {
NSInteger selectedRow = self.contextTableView.selectedRow; NSInteger selectedRow = self.contextTableView.selectedRow;
if(selectedRow >= 0 && selectedRow < self.candidates.count) { if(selectedRow >= 0 && selectedRow < self.candidates.count) {
[MPAutotypeDaemon.defaultDaemon selectAutotypeCandiate:self.candidates[selectedRow]]; [MPAutotypeDaemon.defaultDaemon selectAutotypeContext:self.candidates[selectedRow] forEnvironment:self.environment];
} }
else { else {
[self cancelSelection:sender]; // cancel since the selection was invalid! [self cancelSelection:sender]; // cancel since the selection was invalid!
@@ -85,8 +106,44 @@
} }
- (void)cancelSelection:(id)sender { - (void)cancelSelection:(id)sender {
[[MPAutotypeDaemon defaultDaemon] cancelAutotypeCandidateSelection]; [MPAutotypeDaemon.defaultDaemon cancelAutotypeContextSelectionForEnvironment:self.environment];
} }
- (NSImage *)_composeInfoImage {
static const uint32_t iconSize = 64;
uint32_t imageWidth = 256;
uint32_t imageHeight = 256;
NSRunningApplication *targetApplication = [NSRunningApplication runningApplicationWithProcessIdentifier:self.environment.pid];
CGImageRef windowGrab = CGWindowListCreateImage(CGRectNull, kCGWindowListOptionIncludingWindow, self.environment.windowId, kCGWindowImageDefault | kCGWindowImageBestResolution);
NSImage *windowImage = [[NSImage alloc] initWithCGImage:windowGrab size:NSZeroSize];
CFRelease(windowGrab);
if(windowImage.size.width > windowImage.size.height) {
imageHeight = imageWidth * (windowImage.size.height / windowImage.size.width);
}
else {
imageWidth = imageWidth * (windowImage.size.width / windowImage.size.height);
}
if(!targetApplication.icon) {
return windowImage;
}
NSImage *composite = [[NSImage alloc] initWithSize:NSMakeSize(MAX(imageWidth, iconSize), MAX(imageHeight, iconSize))];
[composite lockFocus];
/* draw the image at the top left */
[windowImage drawInRect:NSMakeRect(composite.size.width - imageWidth, composite.size.height - imageHeight, imageWidth, imageHeight)
fromRect:NSZeroRect
operation:NSCompositingOperationSourceOver
fraction:1];
/* draw the app icon at the bottom left */
[targetApplication.icon drawInRect:NSMakeRect(0, 0, iconSize, iconSize)
fromRect:NSZeroRect
operation:NSCompositingOperationSourceOver
fraction:1];
[composite unlockFocus];
return composite;
}
@end @end

View File

@@ -25,7 +25,7 @@
@class DDHotKey; @class DDHotKey;
@class KPKEntry; @class KPKEntry;
@class MPAutotypeContext; @class MPAutotypeContext;
@class MPAutotypeExecutionContext; @class MPAutotypeEnvironment;
/** /**
* The autotype daemon is responsible for registering the global hotkey and to perform any autotype actions * The autotype daemon is responsible for registering the global hotkey and to perform any autotype actions
*/ */
@@ -35,16 +35,12 @@
@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)selectAutotypeContext:(MPAutotypeContext *)context forEnvironment:(MPAutotypeEnvironment *)environment;
- (void)cancelAutotypeCandidateSelection; - (void)cancelAutotypeContextSelectionForEnvironment:(MPAutotypeEnvironment *)environment;
@end @end

View File

@@ -25,11 +25,17 @@
#import "MPDocumentWindowController.h" #import "MPDocumentWindowController.h"
#import "MPAutotypeCommand.h" #import "MPAutotypeCommand.h"
#import "MPAutotypeContext.h" #import "MPAutotypeContext.h"
#import "MPAutotypeEnvironment.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"
@@ -40,25 +46,20 @@
#import "KeePassKit/KeePassKit.h" #import "KeePassKit/KeePassKit.h"
#import <Carbon/Carbon.h> #import <Carbon/Carbon.h>
NSString *const kMPWindowTitleKey = @"kMPWindowTitleKey";
NSString *const kMPProcessIdentifierKey = @"kMPProcessIdentifierKey";
@interface MPAutotypeDaemon () @interface MPAutotypeDaemon ()
@property (nonatomic, assign) BOOL enabled; @property (nonatomic, assign) BOOL enabled;
@property (nonatomic, copy) NSData *hotKeyData; @property (nonatomic, copy) NSData *hotKeyData;
@property (strong) DDHotKey *registredHotKey; @property (strong) DDHotKey *registredHotKey;
@property (assign) pid_t targetPID; // The pid of the process we want to sent commands to
@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
@@ -81,7 +82,6 @@ static MPAutotypeDaemon *_sharedInstance;
self = [super init]; self = [super init];
if (self) { if (self) {
_enabled = NO; _enabled = NO;
_targetPID = -1;
_userActionRequested = NSDate.distantPast.timeIntervalSinceReferenceDate; _userActionRequested = NSDate.distantPast.timeIntervalSinceReferenceDate;
[self bind:NSStringFromSelector(@selector(enabled)) [self bind:NSStringFromSelector(@selector(enabled))
toObject:NSUserDefaultsController.sharedUserDefaultsController toObject:NSUserDefaultsController.sharedUserDefaultsController
@@ -104,19 +104,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 +131,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 -
@@ -181,51 +140,69 @@ static MPAutotypeDaemon *_sharedInstance;
- (void)performAutotypeForEntry:(KPKEntry *)entry { - (void)performAutotypeForEntry:(KPKEntry *)entry {
[self performAutotypeForEntry:entry overrideSequence:nil]; [self performAutotypeForEntry:entry overrideSequence:nil];
} }
- (void)performAutotypeForEntry:(KPKEntry *)entry overrideSequence:(NSString *)sequence { - (void)performAutotypeForEntry:(KPKEntry *)entry overrideSequence:(NSString *)sequence {
if(entry) { if(entry) {
[self _updateTargeInformationForApplication:self.previousApplication]; MPAutotypeEnvironment *env = [MPAutotypeEnvironment environmentWithTargetApplication:self.previousApplication entry:entry overrideSequence:sequence];
[self _performAutotypeForEntry:entry]; [self _runAutotypeWithEnvironment:env];
} }
} }
- (void)_didPressHotKey { - (void)_didPressHotKey {
[self _updateTargetInformationForFrontMostApplication]; MPAutotypeEnvironment *env = [MPAutotypeEnvironment environmentWithTargetApplication:NSWorkspace.sharedWorkspace.frontmostApplication entry:nil overrideSequence:nil];
[self _performAutotypeForEntry:nil]; [self _runAutotypeWithEnvironment:env];
}
#pragma mark -
#pragma mark Actions
- (void)selectAutotypeCandiate:(MPAutotypeContext *)context {
[self.matchSelectionWindow orderOut:self];
self.matchSelectionWindow = nil;
[self _performAutotypeForContext:context];
}
- (void)cancelAutotypeCandidateSelection {
[self.matchSelectionWindow orderOut:self];
self.matchSelectionWindow = nil;
if(self.targetPID) {
[self _orderApplicationToFront:self.targetPID];
}
} }
#pragma mark - #pragma mark -
#pragma mark Autotype Execution #pragma mark Autotype Execution
- (void)selectAutotypeContext:(MPAutotypeContext *)context forEnvironment:(MPAutotypeEnvironment *)environment {
[self.matchSelectionWindow orderOut:self];
self.matchSelectionWindow = nil;
[self _runAutotypeWithEnvironment:environment forContext:context];
if(environment.hidden) {
[NSApplication.sharedApplication hide:nil];
}
}
- (void)_performAutotypeForEntry:(KPKEntry *)entryOrNil { - (void)cancelAutotypeContextSelectionForEnvironment:(MPAutotypeEnvironment *)environment {
/*if(!self.autotypeSupported) { [self.matchSelectionWindow orderOut:self];
NSUserNotification *notification = [[NSUserNotification alloc] init]; self.matchSelectionWindow = nil;
notification.title = NSApp.applicationName; if(environment.hidden) {
notification.informativeText = NSLocalizedString(@"AUTOTYPE_NOTIFICATION_MACPASS_HAS_NO_ACCESSIBILTY_PERMISSIONS", "Notification: Autotype failed, MacPass has no permission to send key strokes"); [NSApplication.sharedApplication hide:nil];
notification.actionButtonTitle = NSLocalizedString(@"OPEN_PREFERENCES", "Action button in Notification to show the Accessibilty preferences"); }
notification.userInfo = @{ MPUserNotificationTypeKey: MPUserNotificationTypeShowAccessibiltyPreferences }; if(environment.pid) {
notification.showsButtons = YES; [self _orderApplicationToFront:environment.pid completionHandler:nil];
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification]; }
return; }
}*/
NSInteger pid = NSProcessInfo.processInfo.processIdentifier; - (void)_runAutotypeAfterDatabaseUnlockWithEnvironment:(MPAutotypeEnvironment *)environment requestedAt:(NSTimeInterval)requestTime {
if(self.targetPID == pid) { NSTimeInterval now = NSDate.date.timeIntervalSinceReferenceDate;
return; // We do not perform Autotype on ourselves if(now - requestTime > 30) {
NSUserNotification *notification = [[NSUserNotification alloc] init];
notification.title = NSLocalizedString(@"AUTOTYPE_NOTIFICATION_TIMED_OUT_TITLE", "Title for the notification when the Autotype operation timed out");
notification.informativeText = NSLocalizedString(@"AUTOTYPE_TIMED_OUT", "Notficication: Autotype timed out");
notification.userInfo = @{ MPUserNotificationTypeKey: MPUserNotificationTypeAutotypeFeedback };
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification];
}
else {
[self _runAutotypeWithEnvironment:environment];
}
}
- (void)_runAutotypeWithEnvironment:(MPAutotypeEnvironment *)env {
if(env.isSelfTargeting) {
return; // we do not want to target ourselves
}
if(!self.hasNecessaryAutotypePermissions) {
NSUserNotification *notification = [[NSUserNotification alloc] init];
notification.title = NSLocalizedString(@"AUTOTYPE_NOTIFICATION_PERMISSIONS_MISSING_TITLE", "Title for autotype feedback on missing permissions");
notification.informativeText = NSLocalizedString(@"AUTOTYPE_NOTIFICATION_MACPASS_IS_MISSING_PERMISSIONS", "Notification: Autotype failed, MacPass has not enough permissions to perform autotype");
notification.actionButtonTitle = NSLocalizedString(@"SHOW_AUTOTYPE_DOCTOR", "Action button in Notification to show the Autotype Doctor");
notification.userInfo = @{ MPUserNotificationTypeKey: MPUserNotificationTypeRunAutotypeDoctor };
notification.showsButtons = YES;
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification];
return;
} }
/* find autotype documents */ /* find autotype documents */
@@ -233,20 +210,30 @@ static MPAutotypeDaemon *_sharedInstance;
/* No open document, inform the user and return without any action */ /* No open document, inform the user and return without any action */
if(documents.count == 0) { if(documents.count == 0) {
NSUserNotification *notification = [[NSUserNotification alloc] init]; NSUserNotification *notification = [[NSUserNotification alloc] init];
notification.title = NSApp.applicationName; notification.title = NSLocalizedString(@"AUTOTYPE_NOTIFICATION_NO_DOCUMENTS_TITLE", "Notification: Title for autotype feedback");
notification.informativeText = NSLocalizedString(@"AUTOTYPE_OVERLAY_NO_DOCUMENTS", "Notification: Autotype failed, no documents are open"); notification.informativeText = NSLocalizedString(@"AUTOTYPE_NOTIFICATION_NO_DOCUMENTS_INFORMATIVE_TEXT", "Notification: Autotype failed, no documents are open");
notification.actionButtonTitle = NSLocalizedString(@"OPEN_DOCUMENT", "Action button in Notification to open a document"); notification.actionButtonTitle = NSLocalizedString(@"OPEN_DOCUMENT", "Action button in Notification to open a document");
notification.userInfo = @{ MPUserNotificationTypeKey: MPUserNotificationTypeAutotypeOpenDocumentRequest }; notification.userInfo = @{ MPUserNotificationTypeKey: MPUserNotificationTypeAutotypeOpenDocumentRequest };
notification.showsButtons = YES; notification.showsButtons = YES;
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification]; [NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification];
self.userActionRequested = NSDate.date.timeIntervalSinceReferenceDate; NSNotificationCenter * __weak nc = [NSNotificationCenter defaultCenter];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didUnlockDatabase:) name:MPDocumentDidUnlockDatabaseNotification object:nil]; MPAutotypeDaemon * __weak welf = self;
NSTimeInterval requestTime = NSDate.date.timeIntervalSinceReferenceDate;
id __block unlockToken = [nc addObserverForName:MPDocumentDidUnlockDatabaseNotification
object:nil
queue:NSOperationQueue.mainQueue
usingBlock:^(NSNotification *notification) {
[welf _runAutotypeAfterDatabaseUnlockWithEnvironment:env requestedAt:requestTime];
[nc removeObserver:unlockToken];
}];
return; // Unlock should trigger autotype return; // Unlock should trigger autotype
} }
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) {
@@ -257,68 +244,108 @@ static MPAutotypeDaemon *_sharedInstance;
[document showWindows]; [document showWindows];
MPDocumentWindowController *wc = document.windowControllers.firstObject; MPDocumentWindowController *wc = document.windowControllers.firstObject;
[wc showPasswordInputWithMessage:NSLocalizedString(@"AUTOTYPE_MESSAGE_UNLOCK_DATABASE", @"Message displayed to the user to unlock the database to perform global autotype")]; [wc showPasswordInputWithMessage:NSLocalizedString(@"AUTOTYPE_MESSAGE_UNLOCK_DATABASE", @"Message displayed to the user to unlock the database to perform global autotype")];
self.userActionRequested = NSDate.date.timeIntervalSinceReferenceDate; NSNotificationCenter * __weak nc = [NSNotificationCenter defaultCenter];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didUnlockDatabase:) name:MPDocumentDidUnlockDatabaseNotification object:nil]; MPAutotypeDaemon * __weak welf = self;
NSTimeInterval requestTime = NSDate.date.timeIntervalSinceReferenceDate;
id __block unlockToken = [nc addObserverForName:MPDocumentDidUnlockDatabaseNotification
object:nil
queue:NSOperationQueue.mainQueue
usingBlock:^(NSNotification *notification) {
[welf _runAutotypeAfterDatabaseUnlockWithEnvironment:env requestedAt:requestTime];
[nc removeObserver:unlockToken];
}];
return; // wait for the unlock to happen return; // wait for the unlock to happen
} }
MPAutotypeContext *context = [self _autotypeContextForDocuments:documents forWindowTitle:self.targetWindowTitle preferredEntry:entryOrNil]; MPAutotypeContext *context = [self _autotypeContextForDocuments:documents withEnvironment:env];
/* TODO: that's popping up if the mulit 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
} }
if(!entryOrNil) { if(!env.preferredEntry) {
NSUserNotification *notification = [[NSUserNotification alloc] init]; NSUserNotification *notification = [[NSUserNotification alloc] init];
notification.title = NSApp.applicationName; notification.title = NSLocalizedString(@"AUTOTYPE_NOTIFICATION_MATCH_TITLE", "Notification: Title for autotype feedback");
notification.userInfo = @{ MPUserNotificationTypeKey: MPUserNotificationTypeAutotypeFeedback }; notification.userInfo = @{ MPUserNotificationTypeKey: MPUserNotificationTypeAutotypeFeedback };
if(context) { if(context) {
notification.informativeText = [NSString stringWithFormat:NSLocalizedString(@"AUTOTYPE_OVERLAY_SINGLE_MATCH_FOR_%@", "Notification: Autotype found a single match for %@ (string placeholder)."), self.targetWindowTitle]; notification.informativeText = [NSString stringWithFormat:NSLocalizedString(@"AUTOTYPE_NOTIFICATION_SINGLE_MATCH_FOR_%@", "Notification: Autotype found a single match for %@ (string placeholder)."), env.windowTitle];
} }
else { else {
notification.informativeText = [NSString stringWithFormat:NSLocalizedString(@"AUTOTYPE_OVERLAY_NO_MATCH_FOR_%@", "Noticiation: Autotype failed to find a match for %@ (string placeholder)"), self.targetWindowTitle]; notification.informativeText = [NSString stringWithFormat:NSLocalizedString(@"AUTOTYPE_NOTIFICATION_NO_MATCH_FOR_%@", "Noticiation: Autotype failed to find a match for %@ (string placeholder)"), env.windowTitle];
} }
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification]; [NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification];
} }
[self _performAutotypeForContext:context]; [self _runAutotypeWithEnvironment:env forContext:context];
} }
- (MPAutotypeContext *)_autotypeContextForDocuments:(NSArray<MPDocument *> *)documents forWindowTitle:(NSString *)windowTitle preferredEntry:(KPKEntry *)entry { - (MPAutotypeContext *)_autotypeContextForDocuments:(NSArray<MPDocument *> *)documents withEnvironment:(MPAutotypeEnvironment *)environment {
/*
Query the document to generate a autotype command list for the window title
We do not care where this came form, just get the autotype commands
*/
NSMutableArray *autotypeCandidates = [[NSMutableArray alloc] init]; NSMutableArray *autotypeCandidates = [[NSMutableArray alloc] init];
for(MPDocument *document in documents) { for(MPDocument *document in documents) {
NSArray *contexts = [document autotypContextsForWindowTitle:windowTitle preferredEntry:entry]; NSArray *contexts = [document autotypContextsForWindowTitle:environment.windowTitle preferredEntry:environment.preferredEntry];
if(contexts ) { if(contexts ) {
[autotypeCandidates addObjectsFromArray:contexts]; [autotypeCandidates addObjectsFromArray:contexts];
} }
} }
NSUInteger candidates = autotypeCandidates.count;
if(candidates == 0) { if(autotypeCandidates.count == 0) {
return nil; // we do not have found anything
}
/* present selection and return if more than one hit */
if(autotypeCandidates.count > 1) {
[self _presentCandiadates:autotypeCandidates forEnvironment:environment];
return nil; return nil;
} }
if(candidates == 1 ) {
return autotypeCandidates.lastObject; BOOL isGlobalAutotype = (environment.preferredEntry == nil);
BOOL alwaysShowCandidateSelection = [NSUserDefaults.standardUserDefaults boolForKey:kMPSettingsKeyGloablAutotypeAlwaysShowCandidateSelection];
/* present confirmation if set on global autotype */
if(isGlobalAutotype && alwaysShowCandidateSelection) {
[self _presentCandiadates:autotypeCandidates forEnvironment:environment];
return nil;
} }
[self _presentSelectionWindow:autotypeCandidates]; /* return single hit */
return nil; // Nothing to do, we get called back by the window return autotypeCandidates.firstObject;
} }
- (void)_performAutotypeForContext:(MPAutotypeContext *)context { - (void)_runAutotypeWithEnvironment:(MPAutotypeEnvironment *)environment forContext:(MPAutotypeContext *)context {
if(nil == environment) {
return; // no environment to work in
}
if(nil == context) { if(nil == context) {
return; // No context to work with return; // No context to work with
} }
__weak MPAutotypeDaemon *welf = self;
if([self _orderApplicationToFront:self.targetPID]) { BOOL appIsFrontmost = [self _orderApplicationToFront:environment.pid completionHandler:^{
/* Sleep a bit after the app was activated */ [welf _runAutotypeWithEnvironment:environment forContext:context];
/* 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); if(!appIsFrontmost) {
return; // We will get called back when the application is in front
} }
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];
/* re-hide after every command since this might have put us back up front */
if(environment.hidden) {
[NSApplication.sharedApplication hide:nil];
}
}); });
} }
} }
@@ -343,42 +370,16 @@ static MPAutotypeDaemon *_sharedInstance;
} }
} }
- (NSDictionary *)_infoDictionaryForApplication:(NSRunningApplication *)application { - (void)_presentCandiadates:(NSArray *)candidates forEnvironment:(MPAutotypeEnvironment *)environment {
NSArray *currentWindows = CFBridgingRelease(CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID));
NSArray *windowNumbers = [NSWindow windowNumbersWithOptions:NSWindowNumberListAllApplications];
NSUInteger minZIndex = NSNotFound;
NSDictionary *infoDict = nil;
for(NSDictionary *windowDict in currentWindows) {
NSString *windowTitle = windowDict[(NSString *)kCGWindowName];
if(windowTitle.length <= 0) {
continue;
}
NSNumber *processId = windowDict[(NSString *)kCGWindowOwnerPID];
if(processId && [processId isEqualToNumber:@(application.processIdentifier)]) {
NSNumber *number = (NSNumber *)windowDict[(NSString *)kCGWindowNumber];
NSUInteger zIndex = [windowNumbers indexOfObject:number];
if(zIndex < minZIndex) {
minZIndex = zIndex;
infoDict = @{
kMPWindowTitleKey: windowTitle,
kMPProcessIdentifierKey : processId
};
}
}
}
return infoDict;
}
- (void)_presentSelectionWindow:(NSArray *)candidates {
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:NSWindowStyleMaskResizable|NSWindowStyleMaskNonactivatingPanel|NSWindowStyleMaskTitled
backing:NSBackingStoreRetained backing:NSBackingStoreBuffered
defer:YES]; defer:YES];
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.environment = environment;
self.matchSelectionWindow.collectionBehavior |= (NSWindowCollectionBehaviorFullScreenAuxiliary | self.matchSelectionWindow.collectionBehavior |= (NSWindowCollectionBehaviorFullScreenAuxiliary |
NSWindowCollectionBehaviorMoveToActiveSpace | NSWindowCollectionBehaviorMoveToActiveSpace |
NSWindowCollectionBehaviorTransient ); NSWindowCollectionBehaviorTransient );
@@ -389,24 +390,6 @@ static MPAutotypeDaemon *_sharedInstance;
[self.matchSelectionWindow makeKeyAndOrderFront:self]; [self.matchSelectionWindow makeKeyAndOrderFront:self];
} }
#pragma mark -
#pragma mark MPDocument Notifications
- (void)_didUnlockDatabase:(NSNotification *)notification {
/* Remove ourselves and call again to search matches */
[NSNotificationCenter.defaultCenter removeObserver:self name:MPDocumentDidUnlockDatabaseNotification object:nil];
NSTimeInterval now = NSDate.date.timeIntervalSinceReferenceDate;
if(now - self.userActionRequested > 30) {
NSUserNotification *notification = [[NSUserNotification alloc] init];
notification.title = NSApp.applicationName;
notification.informativeText = NSLocalizedString(@"AUTOTYPE_TIMED_OUT", "Notficication: Autotype timed out");
notification.userInfo = @{ MPUserNotificationTypeKey: MPUserNotificationTypeAutotypeFeedback };
[NSUserNotificationCenter.defaultUserNotificationCenter deliverNotification:notification];
}
else {
[self _performAutotypeForEntry:nil];
}
}
#pragma mark - #pragma mark -
#pragma mark NSApplication Notifications #pragma mark NSApplication Notifications
- (void)_didDeactivateApplication:(NSNotification *)notification { - (void)_didDeactivateApplication:(NSNotification *)notification {
@@ -416,29 +399,25 @@ 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 inEnvironment:(MPAutotypeEnvironment *) environment {
- (BOOL)_orderApplicationToFront:(pid_t)processIdentifier completionHandler:(void (^_Nullable)(void))completionHandler {
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; return YES;
} }
NSNotificationCenter * __weak nc = NSWorkspace.sharedWorkspace.notificationCenter;
id __block didActivateToken = [nc addObserverForName:NSWorkspaceDidActivateApplicationNotification
object:nil
queue:NSOperationQueue.mainQueue
usingBlock:^(NSNotification *notification) {
[nc removeObserver:didActivateToken];
if(completionHandler) {
completionHandler();
}
}];
[runingApplication activateWithOptions:NSApplicationActivateIgnoringOtherApps]; [runingApplication activateWithOptions:NSApplicationActivateIgnoringOtherApps];
return YES; return NO;
} }
- (void)_updateTargetInformationForFrontMostApplication {
[self _updateTargeInformationForApplication:NSWorkspace.sharedWorkspace.frontmostApplication];
}
- (void)_updateTargeInformationForApplication:(NSRunningApplication *)application {
if(!application) {
self.targetPID = -1;
self.targetWindowTitle = @"";
}
else {
NSDictionary *frontApplicationInfoDict = [self _infoDictionaryForApplication:application];
self.targetPID = [frontApplicationInfoDict[kMPProcessIdentifierKey] intValue];
self.targetWindowTitle = frontApplicationInfoDict[kMPWindowTitleKey];
}
}
@end @end

View File

@@ -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

View File

@@ -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

View 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

172
MacPass/MPAutotypeDoctor.m Normal file
View File

@@ -0,0 +1,172 @@
//
// 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 */
/*
Solution is heavily inspired by Craig Hockenberry's
https://stackoverflow.com/questions/56597221/detecting-screen-recording-settings-on-macos-catalina/58985069#58985069
*/
if(@available(macOS 10.15, *)) {
CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
NSUInteger numberOfWindows = CFArrayGetCount(windowList);
BOOL canRecordScreen = NO;
for(int idx = 0; idx < numberOfWindows; idx++) {
NSDictionary *windowInfo = (NSDictionary *)CFArrayGetValueAtIndex(windowList, idx);
NSNumber *ownerPid = windowInfo[(id)kCGWindowOwnerPID];
/*
Skip over our own windows
*/
if(ownerPid.intValue == NSProcessInfo.processInfo.processIdentifier) {
continue;
}
/*
Skip applications we aren't allowed to access anyway
*/
NSRunningApplication *ownerApp = [NSRunningApplication runningApplicationWithProcessIdentifier:ownerPid.intValue];
if(!ownerApp) {
continue;
}
NSString *windowName = windowInfo[(id)kCGWindowName];
if(windowName) {
if([ownerApp.executableURL.lastPathComponent isEqualToString:@"Dock"]) {
continue;
}
canRecordScreen = YES;
break;
}
}
CFRelease(windowList);
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_ACCESSIBILITY_PERMISSIONS", "Error description for missing accessibility 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

View 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

View 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

View File

@@ -0,0 +1,36 @@
//
// MPAutotypeEnvironment.h
// MacPass
//
// Created by Michael Starke on 15.01.20.
// Copyright © 2020 HicknHack Software GmbH. All rights reserved.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@class KPKEntry;
@class MPAutotypeContext;
@interface MPAutotypeEnvironment : NSObject
/**
The selected entry, if Autotype is run only for a single entry.
If autotype should search for entries, set this to nil.
*/
@property (readonly, weak, nullable) KPKEntry *preferredEntry;
@property (readonly) pid_t pid; // the PID of the target application to which the key strokes should be sent
@property (readonly) CGWindowID windowId; // the windowID of the target window of the target application
@property (readonly, copy) NSString *windowTitle; /// The title of the target window of the target application.
@property (readonly) BOOL hidden; /// If set to YES, MacPass was hidden when autotype was initiated
@property (readonly) BOOL isSelfTargeting; /// If MacPass should autotype to itself, YES, otherwise NO
@property (readonly) NSString *overrideSequence; /// If set, this sequence is used for running the command regardless of the matched one
+ (instancetype)environmentWithTargetApplication:(NSRunningApplication *)targetApplication entry:(KPKEntry * _Nullable)entry overrideSequence:(NSString * _Nullable)overrideSequence;
- (instancetype)initWithTargetApplication:(NSRunningApplication *)targetApplication entry:(KPKEntry * _Nullable)entry overrideSequence:(NSString * _Nullable)overrdieSequence NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,88 @@
//
// MPAutotypeEnvironment.m
// MacPass
//
// Created by Michael Starke on 15.01.20.
// Copyright © 2020 HicknHack Software GmbH. All rights reserved.
//
#import "MPAutotypeEnvironment.h"
#import "NSRunningApplication+MPAdditions.h"
#import "MPPluginHost.h"
#import "MPPlugin.h"
@implementation MPAutotypeEnvironment
+ (instancetype)environmentWithTargetApplication:(NSRunningApplication *)targetApplication entry:(KPKEntry *)entry overrideSequence:(NSString *)overrideSequence {
return [[MPAutotypeEnvironment alloc] initWithTargetApplication:targetApplication entry:entry overrideSequence:overrideSequence];
}
- (instancetype)initWithTargetApplication:(NSRunningApplication *)targetApplication entry:(KPKEntry *)entry overrideSequence:(NSString *)overrdieSequence {
self = [super init];
if(self) {
_preferredEntry = entry;
_hidden = NSRunningApplication.currentApplication.isHidden;
_overrideSequence = [overrdieSequence copy];
if(!targetApplication) {
_pid = -1;
_windowTitle = @"";
_windowId = -1;
}
else {
NSDictionary *frontApplicationInfoDict = targetApplication.mp_infoDictionary;
_pid = [frontApplicationInfoDict[MPProcessIdentifierKey] intValue];
_windowTitle = frontApplicationInfoDict[MPWindowTitleKey];
_windowId = (CGWindowID)[frontApplicationInfoDict[MPWindowIDKey] integerValue];
/* if we have any resolvers, let them provide the window title */
NSArray *resolvers = [MPPluginHost.sharedHost windowTitleResolverForRunningApplication:targetApplication];
for(MPPlugin<MPAutotypeWindowTitleResolverPlugin> *resolver in resolvers) {
NSString *windowTitle = [resolver windowTitleForRunningApplication:targetApplication];
if(windowTitle.length > 0) {
_windowTitle = windowTitle;
break;
}
}
}
}
return self;
}
- (BOOL)isSelfTargeting {
return NSRunningApplication.currentApplication.processIdentifier == _pid;
}
- (NSDictionary *)_infoDictionaryForApplication:(NSRunningApplication *)application {
NSArray *currentWindows = CFBridgingRelease(CGWindowListCopyWindowInfo(kCGWindowListExcludeDesktopElements, kCGNullWindowID));
NSArray *windowNumbers = [NSWindow windowNumbersWithOptions:NSWindowNumberListAllApplications];
NSUInteger minZIndex = NSNotFound;
NSDictionary *infoDict = nil;
for(NSDictionary *windowDict in currentWindows) {
NSString *windowTitle = windowDict[(NSString *)kCGWindowName];
if(windowTitle.length <= 0) {
continue;
}
NSNumber *processId = windowDict[(NSString *)kCGWindowOwnerPID];
if(processId && [processId isEqualToNumber:@(application.processIdentifier)]) {
NSNumber *number = (NSNumber *)windowDict[(NSString *)kCGWindowNumber];
NSUInteger zIndex = [windowNumbers indexOfObject:number];
if(zIndex < minZIndex) {
minZIndex = zIndex;
infoDict = @{
MPWindowTitleKey: windowTitle,
MPProcessIdentifierKey : processId
};
}
}
}
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;
}
@end

View File

@@ -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
} }
[self.mutableCommands addObject:[[MPAutotypeDelay alloc] initWithDelay:value]]; if([assignOrNot isEqualToString:@"="]) {
[self.mutableCommands addObject:[[MPAutotypeDelay alloc] initWithGlobalDelay:value]];
}
else {
[self.mutableCommands addObject:[[MPAutotypeDelay alloc] initWithDelay:value]];
}
return; // Done return; // Done
} }
else if([kKPKAutotypeVirtualKey isEqualToString:uppercaseCommand]) { else if([kKPKAutotypeVirtualKey isEqualToString:uppercaseCommand]) {

View File

@@ -51,9 +51,9 @@
} }
- (void)execute { - (void)execute {
if([self.pasteData length] > 0) { if(self.pasteData.length > 0) {
[MPPasteBoardController.defaultController stashObjects]; [MPPasteBoardController.defaultController stashObjects];
[MPPasteBoardController.defaultController copyObjectsWithoutTimeout:@[self.pasteData]]; [MPPasteBoardController.defaultController copyObjectWithoutTimeout:self.pasteData];
[MPKeyTyper sendPaste]; [MPKeyTyper sendPaste];
usleep(0.2 * NSEC_PER_MSEC); // on 10.10 we need to wait a bit before restoring the pasteboard contents usleep(0.2 * NSEC_PER_MSEC); // on 10.10 we need to wait a bit before restoring the pasteboard contents
[MPPasteBoardController.defaultController restoreObjects]; [MPPasteBoardController.defaultController restoreObjects];

View File

@@ -40,4 +40,11 @@ FOUNDATION_EXPORT NSString *const MPPluginUTI;
FOUNDATION_EXPORT NSString *const MPBundleHelpURLKey; FOUNDATION_EXPORT NSString *const MPBundleHelpURLKey;
FOUNDATION_EXPORT NSString *const MPBundlePluginRepositoryURLKey; FOUNDATION_EXPORT NSString *const MPBundlePluginRepositoryURLKey;
FOUNDATION_EXPORT NSString *const MPPluginCompatibilityURLKey; FOUNDATION_EXPORT NSString *const MPPluginCompatibilityURLKey;
/**
Keychain Keys
*/
extern NSString *const TouchIdUnlockPublicKeyTag;
extern NSString *const TouchIdUnlockPrivateKeyTag;
#endif #endif

View File

@@ -31,3 +31,6 @@ NSString *const MPBundleHelpURLKey = @"MPHelpURL";
NSString *const MPBundlePluginRepositoryURLKey = @"MPPluginRepositoryURL"; NSString *const MPBundlePluginRepositoryURLKey = @"MPPluginRepositoryURL";
NSString *const MPPluginCompatibilityURLKey = @"MPPluginCompatibilityURLKey"; NSString *const MPPluginCompatibilityURLKey = @"MPPluginCompatibilityURLKey";
NSString *const TouchIdUnlockPublicKeyTag = @"com.hicknhacksoftware.macpass.publickey";
NSString *const TouchIdUnlockPrivateKeyTag = @"com.hicknhacksoftware.macpass.privatekey";

View File

@@ -24,8 +24,13 @@
@interface MPContextButton : NSSegmentedControl @interface MPContextButton : NSSegmentedControl
@property (nonatomic, strong) NSMenu *contextMenu; typedef NS_ENUM(NSUInteger, MPContextButtonSegment) {
MPContextButtonSegmentButton,
MPContextButtonSegmentContextButton,
MPContextButtonSegmentCount // do not use
};
- (void)setImage:(NSImage *)image; @property (nonatomic, strong) NSMenu *contextMenu;
@property (nonatomic, strong) NSImage *image;
@end @end

View File

@@ -53,14 +53,14 @@
self.focusRingType = NSFocusRingTypeNone; self.focusRingType = NSFocusRingTypeNone;
self.segmentStyle = NSSegmentStyleTexturedSquare; self.segmentStyle = NSSegmentStyleTexturedSquare;
self.segmentCount = 2; self.segmentCount = MPContextButtonSegmentCount;
cell.trackingMode = NSSegmentSwitchTrackingMomentary; cell.trackingMode = NSSegmentSwitchTrackingMomentary;
[cell setWidth:31 forSegment:0]; [cell setWidth:31 forSegment:MPContextButtonSegmentButton];
[cell setWidth:17 forSegment:1]; [cell setWidth:17 forSegment:MPContextButtonSegmentContextButton];
cell.trackingMode = NSSegmentSwitchTrackingMomentary; cell.trackingMode = NSSegmentSwitchTrackingMomentary;
NSImage *contextTriangle = [NSBundle.mainBundle imageForResource:@"contextTriangleTemplate"]; NSImage *contextTriangle = [NSBundle.mainBundle imageForResource:@"contextTriangleTemplate"];
[self setImage:contextTriangle forSegment:1]; [self setImage:contextTriangle forSegment:MPContextButtonSegmentContextButton];
cell.contextMenuAction = @selector(showContextMenu:); cell.contextMenuAction = @selector(showContextMenu:);
cell.contextMenuTarget = self; cell.contextMenuTarget = self;
@@ -76,42 +76,46 @@
Block the segment setter to prevent accidental settings Block the segment setter to prevent accidental settings
*/ */
- (void)setImage:(NSImage *)image forSegment:(NSInteger)segment { - (void)setImage:(NSImage *)image forSegment:(NSInteger)segment {
if(segment < 2) { if(segment < MPContextButtonSegmentCount) {
[super setImage:image forSegment:segment]; [super setImage:image forSegment:segment];
} }
} }
- (void)setSegmentCount:(NSInteger)count { - (void)setSegmentCount:(NSInteger)count {
if(count == 2) { if(count == MPContextButtonSegmentCount) {
super.segmentCount = count; super.segmentCount = count;
} }
} }
- (void)setImage:(NSImage *)image { - (void)setImage:(NSImage *)image {
[self setImage:image forSegment:0]; [self setImage:image forSegment:MPContextButtonSegmentButton];
}
- (NSImage *)image {
return [self imageForSegment:MPContextButtonSegmentButton];
} }
- (void)showContextMenu:(id)sender { - (void)showContextMenu:(id)sender {
NSPoint point = self.frame.origin; NSPoint point = self.frame.origin;
point.x = [self.cell widthForSegment:0]; point.x = [self.cell widthForSegment:MPContextButtonSegmentButton];
point.y = NSHeight(self.frame) + 3; point.y = NSHeight(self.frame) + 3;
[_contextMenu popUpMenuPositioningItem:nil atLocation:point inView:self]; [_contextMenu popUpMenuPositioningItem:nil atLocation:point inView:self];
} }
- (void)setControlSize:(NSControlSize)controlSize { - (void)setControlSize:(NSControlSize)controlSize {
NSImageRep *rep = [[self imageForSegment:0] bestRepresentationForRect:NSMakeRect(0, 0, 100, 100) context:nil hints:nil]; NSImageRep *rep = [[self imageForSegment:MPContextButtonSegmentButton] bestRepresentationForRect:NSMakeRect(0, 0, 100, 100) context:nil hints:nil];
CGFloat scale = rep.size.width / rep.size.height; CGFloat scale = rep.size.width / rep.size.height;
switch (controlSize) { switch (controlSize) {
case NSRegularControlSize: case NSControlSizeRegular:
[self imageForSegment:0].size = NSMakeSize(16 * scale, 16); [self imageForSegment:MPContextButtonSegmentButton].size = NSMakeSize(16 * scale, 16);
break; break;
case NSSmallControlSize: case NSControlSizeSmall:
[self imageForSegment:0].size = NSMakeSize(14 * scale, 14); [self imageForSegment:MPContextButtonSegmentButton].size = NSMakeSize(14 * scale, 14);
break; break;
case NSMiniControlSize: case NSControlSizeMini:
[self imageForSegment:0].size = NSMakeSize(8 * scale, 8); [self imageForSegment:MPContextButtonSegmentButton].size = NSMakeSize(8 * scale, 8);
default: default:
break; break;
@@ -123,4 +127,9 @@
return super.controlSize; return super.controlSize;
} }
- (void)_updateContextButtonState {
BOOL hasContextMenu = (self.contextMenu != nil);
[self setEnabled:hasContextMenu forSegment:MPContextButtonSegmentContextButton];
}
@end @end

View File

@@ -23,16 +23,17 @@
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>
typedef NS_OPTIONS(NSUInteger, MPContextMenuItemsFlags) { typedef NS_OPTIONS(NSUInteger, MPContextMenuItemsFlags) {
MPContextMenuCreate = 1 << 0, MPContextMenuCreate = 1 << 0,
MPContextMenuDelete = 1 << 1, MPContextMenuDelete = 1 << 1,
MPContextMenuCopy = 1 << 2, MPContextMenuCopy = 1 << 2,
MPContextMenuTrash = 1 << 3, MPContextMenuTrash = 1 << 3,
MPContextMenuDuplicate = 1 << 4, MPContextMenuDuplicate = 1 << 4,
MPContextMenuAutotype = 1 << 5, MPContextMenuAutotype = 1 << 5,
MPContextMenuHistory = 1 << 6, MPContextMenuHistory = 1 << 6,
MPContextMenuMinimal = MPContextMenuCreate | MPContextMenuDelete, MPContextMenuShowGroupInOutline = 1 << 7,
MPContextMenuFull = MPContextMenuMinimal | MPContextMenuCopy | MPContextMenuDuplicate | MPContextMenuAutotype | MPContextMenuHistory, MPContextMenuMinimal = MPContextMenuCreate | MPContextMenuDelete | MPContextMenuDuplicate,
MPContextMenuExtended = MPContextMenuFull | MPContextMenuTrash MPContextMenuFull = MPContextMenuMinimal | MPContextMenuCopy | MPContextMenuDuplicate | MPContextMenuAutotype | MPContextMenuHistory,
MPContextMenuExtended = MPContextMenuFull | MPContextMenuTrash
}; };
@interface MPContextMenuHelper : NSTableCellView @interface MPContextMenuHelper : NSTableCellView

View File

@@ -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")
[items addObjectsFromArray:@[ duplicateEntry, duplicateEntyWithOptions ]]; action:[MPActionHelper actionOfType:MPActionDuplicateGroup]
keyEquivalent:@""];
[items addObjectsFromArray:@[ duplicateEntry, duplicateEntyWithOptions, duplicateGroup ]];
} }
if(insertDelete || insertTrash) { if(insertDelete || insertTrash) {
@@ -80,7 +84,7 @@ static void MPContextmenuHelperBeginSection(NSMutableArray *items) {
NSMenuItem *emptyTrash = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"EMPTY_TRASH", @"Menu item to empty the trash") NSMenuItem *emptyTrash = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"EMPTY_TRASH", @"Menu item to empty the trash")
action:[MPActionHelper actionOfType:MPActionEmptyTrash] action:[MPActionHelper actionOfType:MPActionEmptyTrash]
keyEquivalent:@""]; keyEquivalent:@""];
emptyTrash.keyEquivalentModifierMask = (NSShiftKeyMask | NSCommandKeyMask); emptyTrash.keyEquivalentModifierMask = (NSEventModifierFlagShift | NSEventModifierFlagCommand);
unichar backSpace = NSBackspaceCharacter; unichar backSpace = NSBackspaceCharacter;
emptyTrash.keyEquivalent = [NSString stringWithCharacters:&backSpace length:1]; emptyTrash.keyEquivalent = [NSString stringWithCharacters:&backSpace length:1];
[items addObject:emptyTrash]; [items addObject:emptyTrash];
@@ -95,7 +99,7 @@ static void MPContextmenuHelperBeginSection(NSMutableArray *items) {
NSMenuItem *copyPassword = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"COPY_PASSWORD", @"Menu item to copy the password of an entry") NSMenuItem *copyPassword = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"COPY_PASSWORD", @"Menu item to copy the password of an entry")
action:[MPActionHelper actionOfType:MPActionCopyPassword] action:[MPActionHelper actionOfType:MPActionCopyPassword]
keyEquivalent:@"c"]; keyEquivalent:@"c"];
copyPassword.keyEquivalentModifierMask = (copyPassword.keyEquivalentModifierMask | NSAlternateKeyMask); copyPassword.keyEquivalentModifierMask = (copyPassword.keyEquivalentModifierMask | NSEventModifierFlagOption);
NSMenu *urlMenu = [[NSMenu alloc] init]; NSMenu *urlMenu = [[NSMenu alloc] init];
NSMenuItem *urlItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"URL", @"Submenu with options what to do with the URL of an entry") NSMenuItem *urlItem = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"URL", @"Submenu with options what to do with the URL of an entry")
action:0 action:0
@@ -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")
@@ -125,9 +129,15 @@ static void MPContextmenuHelperBeginSection(NSMutableArray *items) {
NSMenuItem *showHistory = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SHOW_HISTORY", @"Menu item to show the history of the selected entry") NSMenuItem *showHistory = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SHOW_HISTORY", @"Menu item to show the history of the selected entry")
action:[MPActionHelper actionOfType:MPActionShowEntryHistory] action:[MPActionHelper actionOfType:MPActionShowEntryHistory]
keyEquivalent:@"h"]; keyEquivalent:@"h"];
showHistory.keyEquivalentModifierMask = (showHistory.keyEquivalentModifierMask | NSCommandKeyMask | NSControlKeyMask); showHistory.keyEquivalentModifierMask = (showHistory.keyEquivalentModifierMask | NSEventModifierFlagCommand | NSEventModifierFlagControl);
[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;

View File

@@ -1,27 +0,0 @@
//
// MPCustomFieldTableView.h
// MacPass
//
// Created by Michael Starke on 11.09.18.
// Copyright © 2018 HicknHack Software GmbH. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
//
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
#import <Cocoa/Cocoa.h>
@interface MPCustomFieldTableView : NSTableView
@end

View File

@@ -1,40 +0,0 @@
//
// MPCustomFieldTableView.m
// MacPass
//
// Created by Michael Starke on 11.09.18.
// Copyright © 2018 HicknHack Software GmbH. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
//
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
#import "MPCustomFieldTableView.h"
@implementation MPCustomFieldTableView
/*
on macOS 10.11 and lower, the height is not calculated correctly
*/
- (NSSize)intrinsicContentSize {
if(@available(macOS 10.12, *)) {
return [super intrinsicContentSize];
}
if(self.numberOfRows > 0) {
return NSMakeSize(-1, self.numberOfRows * self.rowHeight);
}
return NSMakeSize(-1, -1);
}
@end

View File

@@ -38,25 +38,6 @@ NSInteger MPCustomFieldTagFromIndex(NSInteger index) {
@implementation MPCustomFieldTableViewDelegate @implementation MPCustomFieldTableViewDelegate
- (void)tableView:(NSTableView *)tableView didRemoveRowView:(NSTableRowView *)rowView forRow:(NSInteger)row {
if(@available(macOS 10.12, *)) {
// 10.12 and higher are working correctly
}
else {
[tableView invalidateIntrinsicContentSize];
}
}
- (void)tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row {
if(@available(macOS 10.12, *)) {
// 10.12 and higher are working correctly
}
else {
[tableView invalidateIntrinsicContentSize];
}
}
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
MPCustomFieldTableCellView *view = [tableView makeViewWithIdentifier:@"SelectedCell" owner:tableView]; MPCustomFieldTableCellView *view = [tableView makeViewWithIdentifier:@"SelectedCell" owner:tableView];

View File

@@ -92,7 +92,8 @@
} }
self.cipherPopupButton.menu = cipherMenu; self.cipherPopupButton.menu = cipherMenu;
self.keyDerivationSettingsTabView.tabViewItems[0].identifier = [KPKAESKeyDerivation uuid]; self.keyDerivationSettingsTabView.tabViewItems[0].identifier = [KPKAESKeyDerivation uuid];
self.keyDerivationSettingsTabView.tabViewItems[1].identifier = [KPKArgon2KeyDerivation uuid]; self.keyDerivationSettingsTabView.tabViewItems[1].identifier = [KPKArgon2DKeyDerivation uuid];
self.keyDerivationSettingsTabView.tabViewItems[2].identifier = [KPKArgon2IDKeyDerivation uuid];
} }
#pragma mark Actions #pragma mark Actions
@@ -164,7 +165,8 @@
metaData.cipherUUID = self.cipherPopupButton.selectedItem.representedObject; metaData.cipherUUID = self.cipherPopupButton.selectedItem.representedObject;
KPKAESKeyDerivation *aesKdf = [[KPKAESKeyDerivation alloc] initWithParameters:[KPKAESKeyDerivation defaultParameters]]; KPKAESKeyDerivation *aesKdf = [[KPKAESKeyDerivation alloc] initWithParameters:[KPKAESKeyDerivation defaultParameters]];
KPKArgon2KeyDerivation *argon2Kdf = [[KPKArgon2KeyDerivation alloc] initWithParameters:[KPKArgon2KeyDerivation defaultParameters]]; KPKArgon2DKeyDerivation *argon2Kdf = [[KPKArgon2DKeyDerivation alloc] initWithParameters:[KPKArgon2DKeyDerivation defaultParameters]];
// FIXME: add Argon2id support!
NSUUID *selectedKdfUUID = self.keyDerivationSettingsTabView.selectedTabViewItem.identifier; NSUUID *selectedKdfUUID = self.keyDerivationSettingsTabView.selectedTabViewItem.identifier;
@@ -273,19 +275,21 @@
[self.keyDerivationPopupButton selectItemAtIndex:kdfIndex]; [self.keyDerivationPopupButton selectItemAtIndex:kdfIndex];
[self.keyDerivationSettingsTabView selectTabViewItemWithIdentifier:keyDerivation.uuid]; [self.keyDerivationSettingsTabView selectTabViewItemWithIdentifier:keyDerivation.uuid];
if([keyDerivation isKindOfClass:[KPKAESKeyDerivation class]]) { if([keyDerivation isMemberOfClass:KPKAESKeyDerivation.class]) {
/* set to database values */
KPKAESKeyDerivation *aesKdf = (KPKAESKeyDerivation *)keyDerivation; KPKAESKeyDerivation *aesKdf = (KPKAESKeyDerivation *)keyDerivation;
self.aesEncryptionRoundsTextField.integerValue = aesKdf.rounds; self.aesEncryptionRoundsTextField.integerValue = aesKdf.rounds;
self.createKeyDerivationParametersButton.enabled = YES; self.createKeyDerivationParametersButton.enabled = YES;
/* fill defaults for Argon2 */ /* fill defaults for Argon2 */
KPKArgon2KeyDerivation *argon2Kdf = [[KPKArgon2KeyDerivation alloc] initWithParameters:[KPKArgon2KeyDerivation defaultParameters]]; KPKArgon2DKeyDerivation *argon2Kdf = [[KPKArgon2DKeyDerivation alloc] initWithParameters:[KPKArgon2DKeyDerivation defaultParameters]];
self.argon2IterationsTextField.integerValue = argon2Kdf.iterations; self.argon2IterationsTextField.integerValue = argon2Kdf.iterations;
self.argon2Memory = argon2Kdf.memory; self.argon2Memory = argon2Kdf.memory;
self.argon2ThreadsTextField.integerValue = argon2Kdf.threads; self.argon2ThreadsTextField.integerValue = argon2Kdf.threads;
} }
else if([keyDerivation isKindOfClass:[KPKArgon2KeyDerivation class]]) { else if([keyDerivation isMemberOfClass:KPKArgon2DKeyDerivation.class]) {
KPKArgon2KeyDerivation *argon2Kdf = (KPKArgon2KeyDerivation *)keyDerivation; /* set to database value */
KPKArgon2DKeyDerivation *argon2Kdf = (KPKArgon2DKeyDerivation *)keyDerivation;
self.argon2Memory = argon2Kdf.memory; self.argon2Memory = argon2Kdf.memory;
self.argon2ThreadsTextField.integerValue = argon2Kdf.threads; self.argon2ThreadsTextField.integerValue = argon2Kdf.threads;
self.argon2IterationsTextField.integerValue = argon2Kdf.iterations; self.argon2IterationsTextField.integerValue = argon2Kdf.iterations;
@@ -294,6 +298,9 @@
KPKAESKeyDerivation *aesKdf = [[KPKAESKeyDerivation alloc] initWithParameters:[KPKAESKeyDerivation defaultParameters]]; KPKAESKeyDerivation *aesKdf = [[KPKAESKeyDerivation alloc] initWithParameters:[KPKAESKeyDerivation defaultParameters]];
self.aesEncryptionRoundsTextField.integerValue = aesKdf.rounds; self.aesEncryptionRoundsTextField.integerValue = aesKdf.rounds;
} }
else if([keyDerivation isMemberOfClass:KPKArgon2IDKeyDerivation.class]) {
// TODO: implement setup!
}
else { else {
NSAssert(NO, @"Unkown key derivation"); NSAssert(NO, @"Unkown key derivation");
} }

View File

@@ -115,7 +115,7 @@ typedef NS_ENUM(NSUInteger, MPDatePreset) {
default: default:
return; // Nothing to do; return; // Nothing to do;
} }
self.datePicker.dateValue = [gregorian dateByAddingComponents:offsetComponents toDate:[NSDate date] options:0]; self.datePicker.dateValue = [gregorian dateByAddingComponents:offsetComponents toDate:NSDate.date options:0];
} }
@end @end

View File

@@ -53,7 +53,7 @@ NSString *const MPDocumentHideEntryHistoryNotification = @"MPDocumentHideEntryH
- (void)revertEntry:(KPKEntry *)entry toEntry:(KPKEntry *)historyEntry { - (void)revertEntry:(KPKEntry *)entry toEntry:(KPKEntry *)historyEntry {
[entry pushHistory]; [entry pushHistory];
[entry revertToEntry:historyEntry]; [entry revertToEntry:historyEntry];
[self.undoManager setActionName:NSLocalizedString(@"RESTORE_HISTORY_ENTRY", "Action to restore and Entry to a previous state of it's history")]; [self.undoManager setActionName:NSLocalizedString(@"RESTORE_HISTORY_ENTRY", "Action to restore an Entry to its previous state of it's history")];
} }
@end @end

View File

@@ -44,7 +44,9 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul
self.searchContext = context; self.searchContext = context;
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(updateSearch:) name:NSUndoManagerDidRedoChangeNotification object:self.undoManager]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(updateSearch:) name:NSUndoManagerDidRedoChangeNotification object:self.undoManager];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(updateSearch:) name:NSUndoManagerDidUndoChangeNotification object:self.undoManager]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(updateSearch:) name:NSUndoManagerDidUndoChangeNotification object:self.undoManager];
//[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(updateSearch:) name:NSUndoManagerDidCloseUndoGroupNotification object:self.undoManager]; /* Do not do this since it seems to break the undo/redo grouping completly!
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(updateSearch:) name:NSUndoManagerDidCloseUndoGroupNotification object:self.undoManager];
*/
[NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidEnterSearchNotification object:self]; [NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidEnterSearchNotification object:self];
[self updateSearch:self]; [self updateSearch:self];
} }
@@ -64,7 +66,7 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul
MPDocument __weak *weakSelf = self; MPDocument __weak *weakSelf = self;
dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(backgroundQueue, ^{ dispatch_async(backgroundQueue, ^{
NSArray *results = [weakSelf _findEntriesMatchingCurrentSearch]; NSArray *results = [weakSelf _findEntriesMatchingSearch:weakSelf.searchContext];
dispatch_sync(dispatch_get_main_queue(), ^{ dispatch_sync(dispatch_get_main_queue(), ^{
[NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidChangeSearchResults object:weakSelf userInfo:@{ kMPDocumentSearchResultsKey: results }]; [NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidChangeSearchResults object:weakSelf userInfo:@{ kMPDocumentSearchResultsKey: results }];
}); });
@@ -74,7 +76,9 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul
- (void)exitSearch:(id)sender { - (void)exitSearch:(id)sender {
[NSNotificationCenter.defaultCenter removeObserver:self name:NSUndoManagerDidUndoChangeNotification object:self.undoManager]; [NSNotificationCenter.defaultCenter removeObserver:self name:NSUndoManagerDidUndoChangeNotification object:self.undoManager];
[NSNotificationCenter.defaultCenter removeObserver:self name:NSUndoManagerDidRedoChangeNotification object:self.undoManager]; [NSNotificationCenter.defaultCenter removeObserver:self name:NSUndoManagerDidRedoChangeNotification object:self.undoManager];
//[NSNotificationCenter.defaultCenter removeObserver:self name:NSUndoManagerDidCloseUndoGroupNotification object:self.undoManager]; /* No need to do this since we did not register in the first place see [MPDocument enterSearchWithContext:]
[NSNotificationCenter.defaultCenter removeObserver:self name:NSUndoManagerDidCloseUndoGroupNotification object:self.undoManager];
*/
self.searchContext = nil; self.searchContext = nil;
[NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidExitSearchNotification object:self]; [NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidExitSearchNotification object:self];
} }
@@ -98,15 +102,15 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul
NSAssert([sender isKindOfClass:NSMenuItem.class], @"Internal inconsitency. Did expect NSMenuItem expected, but got %@", [sender class]); NSAssert([sender isKindOfClass:NSMenuItem.class], @"Internal inconsitency. Did expect NSMenuItem expected, but got %@", [sender class]);
state = ((NSMenuItem *)sender).state; state = ((NSMenuItem *)sender).state;
/* Manually toggle the state since the popupbuttoncell doesn't do it like we want it to */ /* Manually toggle the state since the popupbuttoncell doesn't do it like we want it to */
state = state == NSOnState ? NSOffState : NSOnState; state = state == NSControlStateValueOn ? NSControlStateValueOff : NSControlStateValueOn;
} }
switch(state) { switch(state) {
case NSOffState: case NSControlStateValueOff:
toggleFlag ^= MPEntrySearchAllCombineableFlags; toggleFlag ^= MPEntrySearchAllCombineableFlags;
newFlags = isSingleFlag ? MPEntrySearchNone : (self.searchContext.searchFlags & toggleFlag); newFlags = isSingleFlag ? MPEntrySearchNone : (self.searchContext.searchFlags & toggleFlag);
break; break;
case NSOnState: case NSControlStateValueOn:
if(isSingleFlag ) { if(isSingleFlag ) {
newFlags = toggleFlag; // This has to be either expired or double passwords newFlags = toggleFlag; // This has to be either expired or double passwords
} }
@@ -128,9 +132,9 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul
} }
#pragma mark Search #pragma mark Search
- (NSArray *)_findEntriesMatchingCurrentSearch { - (NSArray *)_findEntriesMatchingSearch:(MPEntrySearchContext *)context {
/* Filter double passwords */ /* Filter double passwords */
if(MPIsFlagSetInOptions(MPEntrySearchDoublePasswords, self.searchContext.searchFlags)) { if(MPIsFlagSetInOptions(MPEntrySearchDoublePasswords, context.searchFlags)) {
NSMutableDictionary *passwordToEntryMap = [[NSMutableDictionary alloc] initWithCapacity:100]; NSMutableDictionary *passwordToEntryMap = [[NSMutableDictionary alloc] initWithCapacity:100];
/* Build up a usage map */ /* Build up a usage map */
for(KPKEntry *entry in self.root.searchableChildEntries) { for(KPKEntry *entry in self.root.searchableChildEntries) {
@@ -155,7 +159,7 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul
} }
return doublePasswords; return doublePasswords;
} }
if(MPIsFlagSetInOptions(MPEntrySearchExpiredEntries, self.searchContext.searchFlags)) { if(MPIsFlagSetInOptions(MPEntrySearchExpiredEntries, context.searchFlags)) {
NSPredicate *expiredPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { NSPredicate *expiredPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
KPKNode *node = evaluatedObject; KPKNode *node = evaluatedObject;
return node.timeInfo.isExpired; return node.timeInfo.isExpired;
@@ -163,7 +167,7 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul
return [[self.root searchableChildEntries] filteredArrayUsingPredicate:expiredPredicate]; return [[self.root searchableChildEntries] filteredArrayUsingPredicate:expiredPredicate];
} }
/* Filter using predicates */ /* Filter using predicates */
NSArray *predicates = [self _filterPredicatesWithString:self.searchContext.searchString]; NSArray *predicates = [self _filterPredicatesWithString:context.searchString];
if(predicates) { if(predicates) {
NSPredicate *fullFilter = [NSCompoundPredicate orPredicateWithSubpredicates:predicates]; NSPredicate *fullFilter = [NSCompoundPredicate orPredicateWithSubpredicates:predicates];
return [[self.root searchableChildEntries] filteredArrayUsingPredicate:fullFilter]; return [[self.root searchableChildEntries] filteredArrayUsingPredicate:fullFilter];
@@ -194,7 +198,7 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul
[prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.notes CONTAINS[cd] %@", string]]; [prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.notes CONTAINS[cd] %@", string]];
} }
if(searchInAllAttributes) { if(searchInAllAttributes) {
[prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.tags CONTAINS[cd] %@", string]]; [prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.tagsString CONTAINS[cd] %@", string]];
[prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.uuid.UUIDString CONTAINS[cd] %@", string]]; [prediactes addObject:[NSPredicate predicateWithFormat:@"SELF.uuid.UUIDString CONTAINS[cd] %@", string]];
NSPredicate *allAttributesPredicate = [NSPredicate predicateWithBlock:^BOOL(id _Nullable evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) { NSPredicate *allAttributesPredicate = [NSPredicate predicateWithBlock:^BOOL(id _Nullable evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {

View File

@@ -39,7 +39,7 @@ FOUNDATION_EXPORT NSString *const MPDocumentDidAddGroupNotification;
* The userInfo dictionary contains the added entry at MPDocumentEntryKey * The userInfo dictionary contains the added entry at MPDocumentEntryKey
*/ */
FOUNDATION_EXPORT NSString *const MPDocumentDidAddEntryNotification; FOUNDATION_EXPORT NSString *const MPDocumentDidAddEntryNotification;
FOUNDATION_EXPORT NSString *const MPDocumentDidRevertNotifiation; FOUNDATION_EXPORT NSString *const MPDocumentDidRevertNotification;
FOUNDATION_EXPORT NSString *const MPDocumentDidLockDatabaseNotification; FOUNDATION_EXPORT NSString *const MPDocumentDidLockDatabaseNotification;
FOUNDATION_EXPORT NSString *const MPDocumentDidUnlockDatabaseNotification; FOUNDATION_EXPORT NSString *const MPDocumentDidUnlockDatabaseNotification;
@@ -108,13 +108,13 @@ FOUNDATION_EXPORT NSString *const MPDocumentGroupKey;
/** /**
* Decrypts the database with the given password and keyfile * Decrypts the database with the given password and keyfile
* *
* @param password The password to unlock the db with, can be nil. This is not the same as an empty string @"" * @param compositeKey The CompositeKey to unlock the db.
* @param keyFileURL URL for the keyfile to use, can be nil * @param keyFileURL URL for the keyfile that was used to create the compositeKey. Can be nil.
* @param error Pointer to an NSError pointer of error reporting. * @param error Pointer to an NSError pointer of error reporting.
* *
* @return YES if the document was unlocked sucessfully, NO otherwise. Consult the error object for details * @return YES if the document was unlocked sucessfully, NO otherwise. Consult the error object for details
*/ */
- (BOOL)unlockWithPassword:(NSString *)password keyFileURL:(NSURL *)keyFileURL error:(NSError *__autoreleasing*)error; - (BOOL)unlockWithPassword:(KPKCompositeKey *)compositeKey keyFileURL:(NSURL *)keyFileURL error:(NSError *__autoreleasing*)error;
/** /**
* Changes the password of the database. Some sanity checks are applied and the change is aborted if the new values aren't valid * Changes the password of the database. Some sanity checks are applied and the change is aborted if the new values aren't valid
* *
@@ -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

View File

@@ -45,7 +45,7 @@
NSString *const MPDocumentDidAddGroupNotification = @"com.hicknhack.macpass.MPDocumentDidAddGroupNotification"; NSString *const MPDocumentDidAddGroupNotification = @"com.hicknhack.macpass.MPDocumentDidAddGroupNotification";
NSString *const MPDocumentDidAddEntryNotification = @"com.hicknhack.macpass.MPDocumentDidAddEntryNotification"; NSString *const MPDocumentDidAddEntryNotification = @"com.hicknhack.macpass.MPDocumentDidAddEntryNotification";
NSString *const MPDocumentDidRevertNotifiation = @"com.hicknhack.macpass.MPDocumentDidRevertNotifiation"; NSString *const MPDocumentDidRevertNotification = @"com.hicknhack.macpass.MPDocumentDidRevertNotification";
NSString *const MPDocumentDidLockDatabaseNotification = @"com.hicknhack.macpass.MPDocumentDidLockDatabaseNotification"; NSString *const MPDocumentDidLockDatabaseNotification = @"com.hicknhack.macpass.MPDocumentDidLockDatabaseNotification";
NSString *const MPDocumentDidUnlockDatabaseNotification = @"com.hicknhack.macpass.MPDocumentDidUnlockDatabaseNotification"; NSString *const MPDocumentDidUnlockDatabaseNotification = @"com.hicknhack.macpass.MPDocumentDidUnlockDatabaseNotification";
@@ -147,6 +147,10 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
[self addWindowController:windowController]; [self addWindowController:windowController];
} }
- (BOOL)canAsynchronouslyWriteToURL:(NSURL *)url ofType:(NSString *)typeName forSaveOperation:(NSSaveOperationType)saveOperation {
return YES;
}
- (BOOL)checkAutosavingSafetyAndReturnError:(NSError **)outError { - (BOOL)checkAutosavingSafetyAndReturnError:(NSError **)outError {
if(![super checkAutosavingSafetyAndReturnError:outError]) { if(![super checkAutosavingSafetyAndReturnError:outError]) {
return NO; // default checking has found an error! return NO; // default checking has found an error!
@@ -155,7 +159,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
if(self.encryptedData) { if(self.encryptedData) {
return YES; return YES;
} }
if(self.compositeKey.hasPasswordOrKeyFile) { if(self.compositeKey.hasKeys) {
return YES; // key is set, so autosave should be save return YES; // key is set, so autosave should be save
} }
@@ -168,20 +172,28 @@ 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;
}
return self.fileURL.pathExtension;
}
- (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));
return self.encryptedData; return self.encryptedData;
} }
if(!self.compositeKey.hasPasswordOrKeyFile) { if(!self.compositeKey.hasKeys) {
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,11 +202,19 @@ 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!
} }
return [self.tree encryptWithKey:self.compositeKey format:format error:outError]; // create a copy to allow for unblocking user interaction
NSLog(@"Copying tree to save…");
KPKTree *copy = [self.tree copy];
NSLog(@"Created copy…");
[self unblockUserInteraction];
NSLog(@"Starting encryption…");
NSData *data = [copy encryptWithKey:self.compositeKey format:format error:outError];
NSLog(@"Finished encryption…");
return data;
} }
- (BOOL)readFromURL:(NSURL *)url ofType:(NSString *)typeName error:(NSError **)outError { - (BOOL)readFromURL:(NSURL *)url ofType:(NSString *)typeName error:(NSError **)outError {
@@ -208,7 +228,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
- (BOOL)revertToContentsOfURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError { - (BOOL)revertToContentsOfURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError {
if([super revertToContentsOfURL:absoluteURL ofType:typeName error:outError]) { if([super revertToContentsOfURL:absoluteURL ofType:typeName error:outError]) {
[[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentDidRevertNotifiation object:self]; [[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentDidRevertNotification object:self];
return YES; return YES;
} }
return NO; return NO;
@@ -287,7 +307,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
return; return;
} }
NSAlert *alert = [[NSAlert alloc] init]; NSAlert *alert = [[NSAlert alloc] init];
alert.alertStyle = NSWarningAlertStyle; alert.alertStyle = NSAlertStyleWarning;
alert.messageText = NSLocalizedString(@"FILE_CHANGED_BY_OTHERS_MESSAGE_TEXT", @"Message displayed when an open file was changed from another application"); alert.messageText = NSLocalizedString(@"FILE_CHANGED_BY_OTHERS_MESSAGE_TEXT", @"Message displayed when an open file was changed from another application");
alert.informativeText = NSLocalizedString(@"FILE_CHANGED_BY_OTHERS_INFO_TEXT", @"Informative text displayed when the file was change from another application"); alert.informativeText = NSLocalizedString(@"FILE_CHANGED_BY_OTHERS_INFO_TEXT", @"Informative text displayed when the file was change from another application");
alert.showsSuppressionButton = YES; alert.showsSuppressionButton = YES;
@@ -361,7 +381,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
if(mergeKDB) { if(mergeKDB) {
NSAlert *alert = [[NSAlert alloc] init]; NSAlert *alert = [[NSAlert alloc] init];
alert.alertStyle = NSWarningAlertStyle; alert.alertStyle = NSAlertStyleWarning;
alert.messageText = NSLocalizedString(@"ALERT_MERGE_KDB_FILE_MESSAGE", @"Alert message warning user about KDB file merge"); alert.messageText = NSLocalizedString(@"ALERT_MERGE_KDB_FILE_MESSAGE", @"Alert message warning user about KDB file merge");
alert.informativeText = NSLocalizedString(@"ALERT_MERGE_KDB_FILE_INFO_TEXT", @"Informative text displayed when merging KDB files"); alert.informativeText = NSLocalizedString(@"ALERT_MERGE_KDB_FILE_INFO_TEXT", @"Informative text displayed when merging KDB files");
[alert addButtonWithTitle:NSLocalizedString(@"ALERT_MERGE_CONTINUE", @"Button in dialog to merge KDB changes into file!")]; [alert addButtonWithTitle:NSLocalizedString(@"ALERT_MERGE_CONTINUE", @"Button in dialog to merge KDB changes into file!")];
@@ -409,11 +429,9 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
MPPasswordInputController *passwordInputController = [[MPPasswordInputController alloc] init]; MPPasswordInputController *passwordInputController = [[MPPasswordInputController alloc] init];
[passwordInputController requestPasswordWithMessage:NSLocalizedString(@"EXTERN_CHANGE_OF_MASTERKEY", @"The master key was changed by an external program!") [passwordInputController requestPasswordWithMessage:NSLocalizedString(@"EXTERN_CHANGE_OF_MASTERKEY", @"The master key was changed by an external program!")
cancelLabel:NSLocalizedString(@"ABORT_MERGE_KEEP_MINE", @"Button label to abort a merge on a file with changed master key!") cancelLabel:NSLocalizedString(@"ABORT_MERGE_KEEP_MINE", @"Button label to abort a merge on a file with changed master key!")
completionHandler:^BOOL(NSString *password, NSURL *keyURL, BOOL didCancel, NSError *__autoreleasing *error) { completionHandler:^BOOL(KPKCompositeKey *compositeKey, NSURL* keyURL, BOOL didCancel, NSError *__autoreleasing *error) {
[self.windowForSheet endSheet:sheet returnCode:(didCancel ? NSModalResponseCancel : NSModalResponseOK)]; [self.windowForSheet endSheet:sheet returnCode:(didCancel ? NSModalResponseCancel : NSModalResponseOK)];
if(!didCancel) { if(!didCancel) {
NSData *keyFileData = keyURL ? [NSData dataWithContentsOfURL:keyURL] : nil;
KPKCompositeKey *compositeKey = [[KPKCompositeKey alloc] initWithPassword:password keyFileData:keyFileData];
[self _mergeWithContentsFromURL:url key:compositeKey options:options]; [self _mergeWithContentsFromURL:url key:compositeKey options:options];
} }
// just return yes regardless since we will display the sheet again if needed! // just return yes regardless since we will display the sheet again if needed!
@@ -479,10 +497,9 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
} }
- (BOOL)unlockWithPassword:(NSString *)password keyFileURL:(NSURL *)keyFileURL error:(NSError *__autoreleasing*)error{ - (BOOL)unlockWithPassword:(KPKCompositeKey *)compositeKey keyFileURL:(NSURL *)keyFileURL error:(NSError *__autoreleasing*)error{
// TODO: Make this API asynchronous // TODO: Make this API asynchronous
NSData *keyFileData = keyFileURL ? [NSData dataWithContentsOfURL:keyFileURL] : nil; self.compositeKey = compositeKey;
self.compositeKey = [[KPKCompositeKey alloc] initWithPassword:password keyFileData:keyFileData];
self.tree = [[KPKTree alloc] initWithData:self.encryptedData key:self.compositeKey error:error]; self.tree = [[KPKTree alloc] initWithData:self.encryptedData key:self.compositeKey error:error];
BOOL isUnlocked = (nil != self.tree); BOOL isUnlocked = (nil != self.tree);
@@ -502,17 +519,15 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
- (BOOL)changePassword:(NSString *)password keyFileURL:(NSURL *)keyFileURL { - (BOOL)changePassword:(NSString *)password keyFileURL:(NSURL *)keyFileURL {
/* sanity check? */ /* sanity check? */
if([password length] == 0 && keyFileURL == nil) { if(password.length == 0 && keyFileURL == nil) {
return NO; return NO;
} }
NSData *keyFileData = keyFileURL ? [NSData dataWithContentsOfURL:keyFileURL] : nil; NSData *keyFileData = keyFileURL ? [NSData dataWithContentsOfURL:keyFileURL] : nil;
if(!self.compositeKey) { self.compositeKey = [[KPKCompositeKey alloc] init];
self.compositeKey = [[KPKCompositeKey alloc] initWithPassword:password keyFileData:keyFileData]; [self.compositeKey addKey:[KPKKey keyWithPassword:password]];
} [self.compositeKey addKey:[KPKKey keyWithKeyFileData:keyFileData]];
else {
[self.compositeKey setPassword:password andKeyFileData:keyFileData]; self.tree.metaData.masterKeyChanged = NSDate.date;
}
self.tree.metaData.masterKeyChanged = [NSDate date];
/* Key change is not undoable so just recored the change as done */ /* Key change is not undoable so just recored the change as done */
[self updateChangeCount:NSChangeDone]; [self updateChangeCount:NSChangeDone];
/* /*
@@ -664,9 +679,14 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
if([self.tree.metaData.defaultUserName length] > 0) { if([self.tree.metaData.defaultUserName length] > 0) {
newEntry.username = self.tree.metaData.defaultUserName; newEntry.username = self.tree.metaData.defaultUserName;
} }
NSString *defaultPassword = [NSString passwordWithDefaultSettings];
if(defaultPassword) { /* only generate passwords for new entries, if set */
newEntry.password = defaultPassword; BOOL generatePassword = [NSUserDefaults.standardUserDefaults boolForKey:kMPSettingsKeyGeneratePasswordForNewEntires];
if(generatePassword) {
NSString *defaultPassword = [NSString passwordWithDefaultSettings];
if(defaultPassword) {
newEntry.password = defaultPassword;
}
} }
/* re-enable undo/redo if we did turn it off */ /* re-enable undo/redo if we did turn it off */
if(wasUndoEnabeld) { if(wasUndoEnabeld) {
@@ -743,7 +763,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
#pragma mark Actions #pragma mark Actions
- (void)emptyTrash:(id)sender { - (void)emptyTrash:(id)sender {
NSAlert *alert = [[NSAlert alloc] init]; NSAlert *alert = [[NSAlert alloc] init];
alert.alertStyle = NSWarningAlertStyle; alert.alertStyle = NSAlertStyleWarning;
alert.messageText = NSLocalizedString(@"WARNING_ON_EMPTY_TRASH_TITLE", "Message text for the alert displayed when clearing the Trash"); alert.messageText = NSLocalizedString(@"WARNING_ON_EMPTY_TRASH_TITLE", "Message text for the alert displayed when clearing the Trash");
alert.informativeText = NSLocalizedString(@"WARNING_ON_EMPTY_TRASH_DESCRIPTION", "Informative Text displayed when clearing the Trash"); alert.informativeText = NSLocalizedString(@"WARNING_ON_EMPTY_TRASH_DESCRIPTION", "Informative Text displayed when clearing the Trash");
@@ -762,7 +782,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
KPKEntry *entry = node.asEntry; KPKEntry *entry = node.asEntry;
NSAlert *alert = [[NSAlert alloc] init]; NSAlert *alert = [[NSAlert alloc] init];
alert.alertStyle = NSWarningAlertStyle; alert.alertStyle = NSAlertStyleWarning;
alert.messageText = NSLocalizedString(@"WARNING_ON_DELETE_TRASHED_NODE_TITLE", "Message text for the alert displayed when deleting a node"); alert.messageText = NSLocalizedString(@"WARNING_ON_DELETE_TRASHED_NODE_TITLE", "Message text for the alert displayed when deleting a node");
alert.informativeText = NSLocalizedString(@"WARNING_ON_DELETE_TRASHED_NODE_DESCRIPTION", "Informative Text displayed when clearing the Trash"); alert.informativeText = NSLocalizedString(@"WARNING_ON_DELETE_TRASHED_NODE_DESCRIPTION", "Informative Text displayed when clearing the Trash");
@@ -824,11 +844,27 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
} }
- (void)duplicateEntryWithOptions:(KPKCopyOptions)options { - (void)duplicateEntryWithOptions:(KPKCopyOptions)options {
KPKEntry *duplicate;
for(KPKEntry *entry in self.selectedEntries) { for(KPKEntry *entry in self.selectedEntries) {
KPKEntry *duplicate = [entry copyWithTitle:nil options:options]; 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]];
if(duplicate) {
[NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidAddEntryNotification
object:self
userInfo:@{ MPDocumentEntryKey: duplicate }];
}
}
- (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 +922,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 +954,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;
} }
@@ -928,7 +971,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
/* user has removed the keyfile or we should not safe it so remove it */ /* user has removed the keyfile or we should not safe it so remove it */
[keysForFiles removeObjectForKey:self.fileURL.path.sha1HexDigest]; [keysForFiles removeObjectForKey:self.fileURL.path.sha1HexDigest];
} }
else if(self.compositeKey.hasPassword && self.compositeKey.hasKeyFile) { else if([self.compositeKey hasKeyOfClass:KPKPasswordKey.class] && [self.compositeKey hasKeyOfClass:KPKFileKey.class]) {
if(nil == keysForFiles) { if(nil == keysForFiles) {
keysForFiles = [[NSMutableDictionary alloc] initWithCapacity:1]; keysForFiles = [[NSMutableDictionary alloc] initWithCapacity:1];
} }

View File

@@ -105,7 +105,7 @@
NSAlert *alert = [[NSAlert alloc] init]; NSAlert *alert = [[NSAlert alloc] init];
alert.messageText = NSLocalizedString(@"FILE_OPEN_ERROR", "Error while reopening last known documents"); alert.messageText = NSLocalizedString(@"FILE_OPEN_ERROR", "Error while reopening last known documents");
alert.informativeText = error.localizedDescription; alert.informativeText = error.localizedDescription;
alert.alertStyle = NSCriticalAlertStyle; alert.alertStyle = NSAlertStyleCritical;
[alert runModal]; [alert runModal];
} }

View File

@@ -0,0 +1,30 @@
//
// MPDocumentSplitViewController.h
// MacPass
//
// Created by Michael Starke on 31.01.20.
// Copyright © 2020 HicknHack Software GmbH. All rights reserved.
//
#import <Cocoa/Cocoa.h>
NS_ASSUME_NONNULL_BEGIN
@class MPEntryViewController;
@class MPInspectorViewController;
@class MPOutlineViewController;
@class MPDocument;
@interface MPDocumentSplitViewController : NSSplitViewController
@property (readonly, strong) MPEntryViewController *entryViewController;
@property (readonly, strong) MPOutlineViewController *outlineViewController;
@property (readonly, strong) MPInspectorViewController *inspectorViewController;
- (void)registerNotificationsForDocument:(MPDocument *)document;
- (IBAction)toggleInspector:(id)sender;
- (void)showOutline;
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,109 @@
//
// MPDocumentSplitViewController.m
// MacPass
//
// Created by Michael Starke on 31.01.20.
// Copyright © 2020 HicknHack Software GmbH. All rights reserved.
//
#import "MPDocumentSplitViewController.h"
#import "MPOutlineViewController.h"
#import "MPEntryViewController.h"
#import "MPInspectorViewController.h"
#import "MPSettingsHelper.h"
@interface MPDocumentSplitViewController ()
@property (strong) MPEntryViewController *entryViewController;
@property (strong) MPOutlineViewController *outlineViewController;
@property (strong) MPInspectorViewController *inspectorViewController;
@end
@implementation MPDocumentSplitViewController
- (NSNibName)nibName {
return @"DocumentSplitView";
}
- (instancetype)initWithNibName:(NSNibName)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if(self) {
_outlineViewController = [[MPOutlineViewController alloc] init];
_entryViewController = [[MPEntryViewController alloc] init];
_inspectorViewController = [[MPInspectorViewController alloc] init];
}
return self;
}
- (void)viewWillLayout {
self.splitView.autosaveName = @"SplitView";
[super viewWillLayout];
}
/*- (void)updateViewConstraints {
[super updateViewConstraints];
if(self.inspectorTopEdgeConstraint) {
if(!self.inspectorTopEdgeConstraint.isActive) {
self.inspectorTopEdgeConstraint.active = YES;
}
return; // everything is set up.
}
// setup the constraint if needed
NSWindow *window = self.view.window;
if(!window) {
return;
}
NSSplitViewItem *inspector = [self splitViewItemForViewController:self.inspectorViewController];
NSSplitViewItem *entries = [self splitViewItemForViewController:self.entryViewController];
NSSplitViewItem *outline = [self splitViewItemForViewController:self.outlineViewController];
[inspector.viewController.view.topAnchor constraintEqualToAnchor:[window.contentLayoutGuide topAnchor]].active = YES;
[entries.viewController.view.topAnchor constraintEqualToAnchor:[window.contentLayoutGuide topAnchor]].active = YES;
[outline.viewController.view.topAnchor constraintEqualToAnchor:[window.contentLayoutGuide topAnchor]].active = YES;
}*/
- (void)viewDidLoad {
[super viewDidLoad];
self.splitView.translatesAutoresizingMaskIntoConstraints = NO;
NSSplitViewItem *outlineItem = [NSSplitViewItem sidebarWithViewController:self.outlineViewController];
outlineItem.holdingPriority = NSLayoutPriorityDefaultLow + 2;
outlineItem.canCollapse = NO;
outlineItem.minimumThickness = 150;
NSSplitViewItem *entries = [NSSplitViewItem splitViewItemWithViewController:self.entryViewController];
entries.canCollapse = NO;
entries.minimumThickness = 150;
NSSplitViewItem *inspector = [NSSplitViewItem splitViewItemWithViewController:self.inspectorViewController];
inspector.canCollapse = YES;
inspector.minimumThickness = 200;
inspector.holdingPriority = NSLayoutPriorityDefaultLow + 1;
[self addSplitViewItem:outlineItem];
[self addSplitViewItem:entries];
[self addSplitViewItem:inspector];
BOOL showInspector = [NSUserDefaults.standardUserDefaults boolForKey:kMPSettingsKeyShowInspector];
inspector.collapsed = !showInspector;
}
- (void)registerNotificationsForDocument:(MPDocument *)document {
[self.entryViewController registerNotificationsForDocument:document];
[self.outlineViewController registerNotificationsForDocument:document];
[self.inspectorViewController registerNotificationsForDocument:document];
}
- (void)showOutline {
// FIXME: do not require this to be called directly
[self.outlineViewController showOutline];
}
- (void)toggleInspector:(id)sender {
NSSplitViewItem *inspector = [self splitViewItemForViewController:self.inspectorViewController];
inspector.collapsed = !inspector.collapsed;
[NSUserDefaults.standardUserDefaults setBool:!inspector.collapsed forKey:kMPSettingsKeyShowInspector];
}
@end

View File

@@ -31,16 +31,12 @@
@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) MPOutlineViewController *outlineViewController;
@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;
@@ -59,7 +55,8 @@
- (IBAction)exportAsXML:(id)sender; - (IBAction)exportAsXML:(id)sender;
- (IBAction)mergeWithOther:(id)sender; - (IBAction)mergeWithOther:(id)sender;
- (IBAction)importFromXML:(id)sender; - (IBAction)importFromXML:(id)sender;
- (IBAction)importFromPlugin:(id)sender; - (IBAction)importWithPlugin:(id)sender;
- (IBAction)exportWithPlugin:(id)sender;
- (IBAction)lock:(id)sender; - (IBAction)lock:(id)sender;
- (IBAction)createGroup:(id)sender; - (IBAction)createGroup:(id)sender;
@@ -67,11 +64,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;

View File

@@ -29,6 +29,7 @@
#import "MPDatabaseSettingsWindowController.h" #import "MPDatabaseSettingsWindowController.h"
#import "MPDocument.h" #import "MPDocument.h"
#import "MPDocumentWindowDelegate.h" #import "MPDocumentWindowDelegate.h"
#import "MPDocumentSplitViewController.h"
#import "MPDuplicateEntryOptionsWindowController.h" #import "MPDuplicateEntryOptionsWindowController.h"
#import "MPEntryViewController.h" #import "MPEntryViewController.h"
#import "MPFixAutotypeWindowController.h" #import "MPFixAutotypeWindowController.h"
@@ -39,6 +40,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"
@@ -56,14 +59,11 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
id _firstResponder; id _firstResponder;
} }
@property (strong) IBOutlet NSSplitView *splitView;
@property (strong) NSToolbar *toolbar; @property (strong) NSToolbar *toolbar;
@property (strong) MPPasswordInputController *passwordInputController; @property (strong) MPPasswordInputController *passwordInputController;
@property (strong) MPEntryViewController *entryViewController; @property (strong) MPDocumentSplitViewController *splitViewController;
@property (strong) MPOutlineViewController *outlineViewController;
@property (strong) MPInspectorViewController *inspectorViewController;
@property (strong) MPDatabaseSettingsWindowController *documentSettingsWindowController; @property (strong) MPDatabaseSettingsWindowController *documentSettingsWindowController;
@property (strong) MPDocumentWindowDelegate *documentWindowDelegate; @property (strong) MPDocumentWindowDelegate *documentWindowDelegate;
@property (strong) MPPasswordEditWindowController *passwordEditWindowController; @property (strong) MPPasswordEditWindowController *passwordEditWindowController;
@@ -85,9 +85,7 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
if( self ) { if( self ) {
_firstResponder = nil; _firstResponder = nil;
_toolbarDelegate = [[MPToolbarDelegate alloc] init]; _toolbarDelegate = [[MPToolbarDelegate alloc] init];
_outlineViewController = [[MPOutlineViewController alloc] init]; _splitViewController = [[MPDocumentSplitViewController alloc] init];
_entryViewController = [[MPEntryViewController alloc] init];
_inspectorViewController = [[MPInspectorViewController alloc] init];
_documentWindowDelegate = [[MPDocumentWindowDelegate alloc] init]; _documentWindowDelegate = [[MPDocumentWindowDelegate alloc] init];
} }
return self; return self;
@@ -102,45 +100,36 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
[super windowDidLoad]; [super windowDidLoad];
self.window.delegate = self.documentWindowDelegate; self.window.delegate = self.documentWindowDelegate;
//self.window.styleMask |= NSWindowStyleMaskFullSizeContentView;
if (@available(macOS 11.0, *)) {
self.window.toolbarStyle = NSWindowToolbarStyleExpanded;
}
[self.window registerForDraggedTypes:@[NSURLPboardType]]; [self.window registerForDraggedTypes:@[NSURLPboardType]];
MPDocument *document = self.document; MPDocument *document = self.document;
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didRevertDocument:) name:MPDocumentDidRevertNotifiation object:document]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didRevertDocument:) name:MPDocumentDidRevertNotification object:document];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didUnlockDatabase:) name:MPDocumentDidUnlockDatabaseNotification object:document]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didUnlockDatabase:) name:MPDocumentDidUnlockDatabaseNotification object:document];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didAddEntry:) name:MPDocumentDidAddEntryNotification object:document]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didAddEntry:) name:MPDocumentDidAddEntryNotification object:document];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didAddGroup:) name:MPDocumentDidAddGroupNotification object:document]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didAddGroup:) name:MPDocumentDidAddGroupNotification object:document];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didLockDatabase:) name:MPDocumentDidLockDatabaseNotification object:document]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didLockDatabase:) name:MPDocumentDidLockDatabaseNotification object:document];
[self.entryViewController registerNotificationsForDocument:document]; [self.splitViewController registerNotificationsForDocument:document];
[self.inspectorViewController registerNotificationsForDocument:document];
[self.outlineViewController registerNotificationsForDocument:document];
[self.toolbarDelegate registerNotificationsForDocument:document]; [self.toolbarDelegate registerNotificationsForDocument:document];
self.toolbar = [[NSToolbar alloc] initWithIdentifier:@"MainWindowToolbar"]; self.toolbar = [[NSToolbar alloc] initWithIdentifier:@"MainWindowToolbar"];
self.toolbar.autosavesConfiguration = YES; self.toolbar.autosavesConfiguration = YES;
self.toolbar.allowsUserCustomization = YES; self.toolbar.allowsUserCustomization = YES;
/* center search in toolbar */
if (@available(macOS 10.14, *)) {
self.toolbar.centeredItemIdentifier = MPToolbarItemIdentifierSearch;
} else {
// to not do any magic here
}
self.toolbar.delegate = self.toolbarDelegate; self.toolbar.delegate = self.toolbarDelegate;
self.window.toolbar = self.toolbar; self.window.toolbar = self.toolbar;
self.toolbarDelegate.toolbar = self.toolbar; self.toolbarDelegate.toolbar = self.toolbar;
self.splitView.translatesAutoresizingMaskIntoConstraints = NO;
NSView *outlineView = self.outlineViewController.view;
NSView *inspectorView = self.inspectorViewController.view;
NSView *entryView = self.entryViewController.view;
[self.splitView addSubview:outlineView];
[self.splitView addSubview:entryView];
[self.splitView addSubview:inspectorView];
[self.splitView setHoldingPriority:NSLayoutPriorityDefaultLow+2 forSubviewAtIndex:0];
[self.splitView setHoldingPriority:NSLayoutPriorityDefaultLow+1 forSubviewAtIndex:2];
BOOL showInspector = [NSUserDefaults.standardUserDefaults boolForKey:kMPSettingsKeyShowInspector];
if(!showInspector) {
[inspectorView removeFromSuperview];
}
if(document.encrypted) { if(document.encrypted) {
[self showPasswordInput]; [self showPasswordInput];
} }
@@ -148,8 +137,6 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
[self showEntries]; [self showEntries];
} }
self.splitView.autosaveName = @"SplitView";
/* /*
TODO: Add display for database color? TODO: Add display for database color?
NSTitlebarAccessoryViewController *tbc = [[MPTitlebarColorAccessoryViewController alloc] init]; NSTitlebarAccessoryViewController *tbc = [[MPTitlebarColorAccessoryViewController alloc] init];
@@ -162,40 +149,21 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
return self.toolbarDelegate.searchField; return self.toolbarDelegate.searchField;
} }
- (void)_setContentViewController:(MPViewController *)viewController { - (void)setContentViewController:(NSViewController *)contentViewController {
contentViewController.view.frame = self.window.contentView.frame;
NSView *newContentView = nil; [super setContentViewController:contentViewController];
if(viewController && viewController.view) { if([contentViewController isKindOfClass:MPViewController.class]) {
newContentView = viewController.view; /* enqueue async into main to catch some cases, where the UI would not set the responder correctly */
MPDocumentWindowController * __weak welf = self;
dispatch_async(dispatch_get_main_queue(), ^{
NSResponder *responder = ((MPViewController *)contentViewController).reconmendedFirstResponder;
[welf.window makeFirstResponder:responder];
});
} }
NSView *contentView = self.window.contentView;
NSView *oldSubView = nil;
if(contentView.subviews.count == 1) {
oldSubView = contentView.subviews.firstObject;
}
if(oldSubView == newContentView) {
return; // View is already present
}
[oldSubView removeFromSuperviewWithoutNeedingDisplay];
[contentView addSubview:newContentView];
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[newContentView]|"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(newContentView)]];
NSNumber *border = @([[self window] contentBorderThicknessForEdge:NSMinYEdge]);
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[newContentView]-border-|"
options:0
metrics:NSDictionaryOfVariableBindings(border)
views:NSDictionaryOfVariableBindings(newContentView)]];
[contentView layout];
[self.window makeFirstResponder:viewController.reconmendedFirstResponder];
} }
#pragma mark MPDocument notifications #pragma mark MPDocument notifications
- (void)_didRevertDocument:(NSNotification *)notification { - (void)_didRevertDocument:(NSNotification *)notification {
[self.outlineViewController clearSelection];
[self showPasswordInput]; [self showPasswordInput];
} }
@@ -254,7 +222,7 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
savePanel.allowedFileTypes = @[(id)kUTTypeXML]; savePanel.allowedFileTypes = @[(id)kUTTypeXML];
savePanel.canSelectHiddenExtension = YES; savePanel.canSelectHiddenExtension = YES;
[savePanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) { [savePanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) {
if(result == NSFileHandlingPanelOKButton) { if(result == NSModalResponseOK) {
[document writeXMLToURL:savePanel.URL]; [document writeXMLToURL:savePanel.URL];
} }
}]; }];
@@ -270,19 +238,19 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
openPanel.prompt = NSLocalizedString(@"OPEN_BUTTON_IMPORT_XML_OPEN_PANEL", "Open button in the open panel to import an XML file"); openPanel.prompt = NSLocalizedString(@"OPEN_BUTTON_IMPORT_XML_OPEN_PANEL", "Open button in the open panel to import an XML file");
openPanel.message = NSLocalizedString(@"MESSAGE_XML_OPEN_PANEL", "Message in the open panel to import an XML file"); openPanel.message = NSLocalizedString(@"MESSAGE_XML_OPEN_PANEL", "Message in the open panel to import an XML file");
[openPanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) { [openPanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) {
if(result == NSFileHandlingPanelOKButton) { if(result == NSModalResponseOK) {
[document readXMLfromURL:openPanel.URL]; [document readXMLfromURL:openPanel.URL];
[self.outlineViewController showOutline]; [self.splitViewController showOutline];
} }
}]; }];
} }
- (void)importFromPlugin:(id)sender { - (void)importWithPlugin:(id)sender {
if(![sender isKindOfClass:NSMenuItem.class]) { if(![sender isKindOfClass:NSMenuItem.class]) {
return; return;
} }
NSMenuItem *menuItem = sender; NSMenuItem *menuItem = sender;
if(![menuItem.representedObject isKindOfClass:NSDictionary.class]) { if(![menuItem.representedObject isKindOfClass:NSString.class]) {
return; return;
} }
@@ -290,12 +258,39 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
if(!sheetWindow) { if(!sheetWindow) {
return; return;
} }
MPPlugin<MPImportPlugin> *importPlugin; NSString *bundleIdentifier = menuItem.representedObject;
MPPlugin<MPImportPlugin> *importPlugin = (MPPlugin<MPImportPlugin> *)[MPPluginHost.sharedHost pluginWithBundleIdentifier:bundleIdentifier];
NSOpenPanel *openPanel = NSOpenPanel.openPanel; NSOpenPanel *openPanel = NSOpenPanel.openPanel;
[importPlugin prepareOpenPanel:openPanel]; [importPlugin prepareOpenPanel:openPanel];
[openPanel beginSheetModalForWindow:sheetWindow completionHandler:^(NSModalResponse result) { [openPanel beginSheetModalForWindow:sheetWindow completionHandler:^(NSModalResponse result) {
KPKTree *importedTree = [importPlugin treeForRunningOpenPanel:openPanel withResponse:result]; if(result == NSModalResponseOK) {
[self.document importTree:importedTree]; KPKTree *importedTree = [importPlugin treeForRunningOpenPanel:openPanel];
[self.document importTree:importedTree];
}
}];
}
- (void)exportWithPlugin:(id)sender {
if(![sender isKindOfClass:NSMenuItem.class]) {
return;
}
NSMenuItem *menuItem = sender;
if(![menuItem.representedObject isKindOfClass:NSString.class]) {
return;
}
NSWindow *sheetWindow = ((MPDocument *)self.document).windowForSheet;
if(!sheetWindow) {
return;
}
NSString *bundleIdentifier = menuItem.representedObject;
MPPlugin<MPExportPlugin> *exportPlugin = (MPPlugin<MPExportPlugin> *)[MPPluginHost.sharedHost pluginWithBundleIdentifier:bundleIdentifier];
NSSavePanel *savePanel = NSSavePanel.savePanel;
[exportPlugin prepareSavePanel:savePanel];
[savePanel beginSheetModalForWindow:sheetWindow completionHandler:^(NSModalResponse result) {
if(result == NSModalResponseOK) {
[exportPlugin exportTree:((MPDocument *)self.document).tree forRunningSavePanel:savePanel];
}
}]; }];
} }
@@ -308,7 +303,7 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
openPanel.message = NSLocalizedString(@"SELECT_FILE_TO_MERGE", @"Message for the dialog to open a file for merge"); openPanel.message = NSLocalizedString(@"SELECT_FILE_TO_MERGE", @"Message for the dialog to open a file for merge");
//openPanel.allowedFileTypes = @[(id)kUTTypeXML]; //openPanel.allowedFileTypes = @[(id)kUTTypeXML];
[openPanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) { [openPanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) {
if(result == NSFileHandlingPanelOKButton) { if(result == NSModalResponseOK) {
[document mergeWithContentsFromURL:openPanel.URL key:document.compositeKey]; [document mergeWithContentsFromURL:openPanel.URL key:document.compositeKey];
} }
}]; }];
@@ -329,13 +324,12 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
if(!self.passwordInputController) { if(!self.passwordInputController) {
self.passwordInputController = [[MPPasswordInputController alloc] init]; self.passwordInputController = [[MPPasswordInputController alloc] init];
} }
[self _setContentViewController:self.passwordInputController]; self.contentViewController = self.passwordInputController;
[self.passwordInputController requestPasswordWithMessage:message cancelLabel:nil completionHandler:^BOOL(NSString *password, NSURL *keyURL, BOOL didCancel, NSError *__autoreleasing *error) { [self.passwordInputController requestPasswordWithMessage:message cancelLabel:nil completionHandler:^BOOL(KPKCompositeKey* compositeKey, NSURL* keyURL, BOOL didCancel, NSError *__autoreleasing *error) {
if(didCancel) { if(didCancel) {
return NO; return NO;
} }
return [((MPDocument *)self.document) unlockWithPassword:password keyFileURL:keyURL error:error]; return [((MPDocument *)self.document) unlockWithPassword:compositeKey keyFileURL:keyURL error:error ];
}]; }];
} }
@@ -435,34 +429,24 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
} }
- (void)pickExpiryDate:(id)sender { - (void)pickExpiryDate:(id)sender {
[self.inspectorViewController pickExpiryDate:sender]; // FIXME: use propert responder chain
[self.splitViewController.inspectorViewController pickExpiryDate:sender];
} }
- (void)showPluginData:(id)sender { - (void)showPluginData:(id)sender {
[self.inspectorViewController showPluginData:sender]; // FIXME: use propert responder chain
[self.splitViewController.inspectorViewController showPluginData:sender];
} }
- (void)toggleInspector:(id)sender { - (void)toggleInspector:(id)sender {
NSView *inspectorView = self.inspectorViewController.view; [self.splitViewController toggleInspector:sender];
BOOL inspectorWasVisible = [self _isInspectorVisible];
if(inspectorWasVisible) {
[inspectorView removeFromSuperview];
}
else {
[self.splitView addSubview:inspectorView];
[self.splitView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[inspectorView(>=200)]"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(inspectorView)]];
}
[[NSUserDefaults standardUserDefaults] setBool:!inspectorWasVisible forKey:kMPSettingsKeyShowInspector];
} }
- (void)performAutotypeForEntry:(id)sender { - (void)performAutotypeForEntry:(id)sender {
id<MPTargetNodeResolving> entryResolver = [NSApp targetForAction:@selector(currentTargetEntries)]; id<MPTargetNodeResolving> entryResolver = [NSApp targetForAction:@selector(currentTargetEntries)];
NSArray *entries = entryResolver.currentTargetEntries; NSArray *entries = entryResolver.currentTargetEntries;
if(entries.count == 1) { if(entries.count == 1) {
[[MPAutotypeDaemon defaultDaemon] performAutotypeForEntry:entries.firstObject]; [MPAutotypeDaemon.defaultDaemon performAutotypeForEntry:entries.firstObject];
} }
} }
@@ -473,100 +457,58 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
} }
- (void)focusEntries:(id)sender { - (void)focusEntries:(id)sender {
[self.window makeFirstResponder:[self.entryViewController reconmendedFirstResponder]]; // FIXME: use propert responder chain
[self.window makeFirstResponder:[self.splitViewController.entryViewController reconmendedFirstResponder]];
} }
- (void)focusGroups:(id)sender { - (void)focusGroups:(id)sender {
[self.window makeFirstResponder:[self.outlineViewController reconmendedFirstResponder]]; // FIXME: use propert responder chain
[self.window makeFirstResponder:[self.splitViewController.outlineViewController reconmendedFirstResponder]];
} }
- (void)focusInspector:(id)sender { - (void)focusInspector:(id)sender {
[self.window makeFirstResponder:[self.inspectorViewController reconmendedFirstResponder]]; // FIXME: use propert responder chain
[self.window makeFirstResponder:[self.splitViewController.inspectorViewController reconmendedFirstResponder]];
} }
- (void)showEntries { - (void)showEntries {
NSView *contentView = self.window.contentView; self.contentViewController = self.splitViewController;
if(self.splitView == contentView) { [self.splitViewController showOutline];
return; // We are displaying the entries already
}
- (void)showGroupInOutline:(id)sender {
NSArray<KPKEntry *> *targetEntries = self.splitViewController.entryViewController.currentTargetEntries;
if(targetEntries.count != 1) {
return;
} }
if(contentView.subviews.count == 1) { [self.splitViewController.outlineViewController selectGroup:targetEntries.lastObject.parent];
[contentView.subviews.firstObject removeFromSuperviewWithoutNeedingDisplay];
}
[contentView addSubview:self.splitView];
NSView *outlineView = self.outlineViewController.view;
NSView *inspectorView = self.inspectorViewController.view;
NSView *entryView = self.entryViewController.view;
/*
The current easy way to prevent layout hiccups is to add the inspector
Add all needed constraints an then remove it again, if it was hidden
*/
BOOL removeInspector = NO;
if(!inspectorView.superview) {
[self.splitView addSubview:inspectorView];
removeInspector = YES;
}
/* Maybe we should consider not double adding constraints */
NSDictionary *views = NSDictionaryOfVariableBindings(outlineView, inspectorView, entryView, _splitView);
[self.splitView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[outlineView(>=150)]-1-[entryView(>=150)]-1-[inspectorView(>=200)]|"
options:0
metrics:nil
views:views]];
[self.splitView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[outlineView]|"
options:0
metrics:nil
views:views]];
[self.splitView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[entryView(>=200)]|"
options:0
metrics:nil
views:views]];
[self.splitView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[inspectorView]|"
options:0
metrics:nil
views:views]];
NSNumber *border = @([[self window] contentBorderThicknessForEdge:NSMinYEdge]);
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_splitView]-border-|"
options:0
metrics:NSDictionaryOfVariableBindings(border)
views:views]];
[contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_splitView]|"
options:0
metrics:nil
views:views]];
[self.outlineViewController showOutline];
/* Restore the State the inspector view was in before the view change */
if(removeInspector) {
[inspectorView removeFromSuperview];
}
[contentView layoutSubtreeIfNeeded];
} }
#pragma mark - #pragma mark -
#pragma mark Actions forwarded to MPEntryViewController #pragma mark Actions forwarded to MPEntryViewController
- (void)copyUsername:(id)sender { - (void)copyUsername:(id)sender {
[self.entryViewController copyUsername:sender]; [self.splitViewController.entryViewController copyUsername:sender];
} }
- (void)copyPassword:(id)sender { - (void)copyPassword:(id)sender {
[self.entryViewController copyPassword:sender]; [self.splitViewController.entryViewController copyPassword:sender];
} }
- (void)copyCustomAttribute:(id)sender { - (void)copyCustomAttribute:(id)sender {
[self.entryViewController copyCustomAttribute:sender]; [self.splitViewController.entryViewController copyCustomAttribute:sender];
} }
- (void)copyAsReference:(id)sender { - (void)copyAsReference:(id)sender {
[self.entryViewController copyAsReference:sender]; [self.splitViewController.entryViewController copyAsReference:sender];
} }
- (void)copyURL:(id)sender { - (void)copyURL:(id)sender {
[self.entryViewController copyURL:sender]; [self.splitViewController.entryViewController copyURL:sender];
} }
- (void)openURL:(id)sender { - (void)openURL:(id)sender {
[self.entryViewController openURL:sender]; [self.splitViewController.entryViewController openURL:sender];
} }
#pragma mark Validation #pragma mark Validation
@@ -580,7 +522,7 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
if(document.shouldEnforcePasswordChange) { if(document.shouldEnforcePasswordChange) {
NSAlert *alert = [[NSAlert alloc] init]; NSAlert *alert = [[NSAlert alloc] init];
alert.alertStyle = NSCriticalAlertStyle; alert.alertStyle = NSAlertStyleCritical;
alert.messageText = NSLocalizedString(@"ENFORCE_PASSWORD_CHANGE_ALERT_TITLE", "Message text for the enforce password change alert"); alert.messageText = NSLocalizedString(@"ENFORCE_PASSWORD_CHANGE_ALERT_TITLE", "Message text for the enforce password change alert");
alert.informativeText = NSLocalizedString(@"ENFORCE_PASSWORD_CHANGE_ALERT_DESCRIPTION", "Informative text for the enforce password change alert"); alert.informativeText = NSLocalizedString(@"ENFORCE_PASSWORD_CHANGE_ALERT_DESCRIPTION", "Informative text for the enforce password change alert");
@@ -611,7 +553,7 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
else if(document.shouldRecommendPasswordChange) { else if(document.shouldRecommendPasswordChange) {
NSAlert *alert = [[NSAlert alloc] init]; NSAlert *alert = [[NSAlert alloc] init];
alert.alertStyle = NSInformationalAlertStyle; alert.alertStyle = NSAlertStyleInformational;
alert.messageText = NSLocalizedString(@"RECOMMEND_PASSWORD_CHANGE_ALERT_TITLE", "Message text for the recommend password change alert"); alert.messageText = NSLocalizedString(@"RECOMMEND_PASSWORD_CHANGE_ALERT_TITLE", "Message text for the recommend password change alert");
alert.informativeText = NSLocalizedString(@"RECOMMEND_PASSWORD_CHANGE_ALERT_DESCRIPTION", "Informative text for the recommend password change alert"); alert.informativeText = NSLocalizedString(@"RECOMMEND_PASSWORD_CHANGE_ALERT_DESCRIPTION", "Informative text for the recommend password change alert");
@@ -648,8 +590,101 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
#pragma mark UI Helper #pragma mark UI Helper
- (BOOL)_isInspectorVisible { - (BOOL)_isInspectorVisible {
NSView *inspectorView = self.inspectorViewController.view; NSSplitViewItem *item = [self.splitViewController splitViewItemForViewController:self.splitViewController.inspectorViewController];
return (nil != inspectorView.superview); return !item.isCollapsed;
}
- (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

View File

@@ -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>

View File

@@ -47,9 +47,8 @@
@property (weak) IBOutlet NSTokenField *tagsTokenField; @property (weak) IBOutlet NSTokenField *tagsTokenField;
@property (weak) IBOutlet NSTextField *uuidTextField; @property (weak) IBOutlet NSTextField *uuidTextField;
@property (weak) IBOutlet NSTextField *createdTextField;
@property (weak) IBOutlet NSTextField *modifiedTextField;
@property (weak) IBOutlet MPContextButton *addCustomFieldButton; @property (weak) IBOutlet MPContextButton *addCustomFieldButton;
@property (strong) IBOutlet NSStackView *fieldsStackView;
/* Attachments */ /* Attachments */
@property (weak) IBOutlet NSButtonCell *addAttachmentButton; @property (weak) IBOutlet NSButtonCell *addAttachmentButton;
@@ -60,6 +59,11 @@
@property (strong) IBOutlet NSTableView *customFieldsTableView; @property (strong) IBOutlet NSTableView *customFieldsTableView;
@property (weak) IBOutlet NSButton *showCustomDataButton; @property (weak) IBOutlet NSButton *showCustomDataButton;
/* TOTP */
@property (strong) IBOutlet NSProgressIndicator *totpProgressIndicator;
@property (strong) IBOutlet NSTextField *totpLabelTextField;
@property (strong) IBOutlet NSTextField *totpCodeTextField;
/* Autotype */ /* Autotype */
@property (strong) IBOutlet NSView *autotypView; @property (strong) IBOutlet NSView *autotypView;
@property (weak) IBOutlet NSButton *enableAutotypeCheckButton; @property (weak) IBOutlet NSButton *enableAutotypeCheckButton;
@@ -80,6 +84,7 @@
- (IBAction)showPasswordGenerator:(id)sender; - (IBAction)showPasswordGenerator:(id)sender;
- (IBAction)showReferenceBuilder:(id)sender; - (IBAction)showReferenceBuilder:(id)sender;
- (IBAction)showAutotypeBuilder:(id)sender; - (IBAction)showAutotypeBuilder:(id)sender;
- (IBAction)showOTPSetup:(id)sender;
- (IBAction)saveAttachment:(id)sender; - (IBAction)saveAttachment:(id)sender;
- (IBAction)addAttachment:(id)sender; - (IBAction)addAttachment:(id)sender;
@@ -93,4 +98,5 @@
- (IBAction)toggleQuicklookPreview:(id)sender; - (IBAction)toggleQuicklookPreview:(id)sender;
- (IBAction)toggleExpire:(NSButton*)sender; - (IBAction)toggleExpire:(NSButton*)sender;
@end @end

View File

@@ -31,6 +31,8 @@
#import "MPTagsTokenFieldDelegate.h" #import "MPTagsTokenFieldDelegate.h"
#import "MPAutotypeBuilderViewController.h" #import "MPAutotypeBuilderViewController.h"
#import "MPReferenceBuilderViewController.h" #import "MPReferenceBuilderViewController.h"
#import "MPTOTPViewController.h"
#import "MPTOTPSetupViewController.h"
#import "MPPrettyPasswordTransformer.h" #import "MPPrettyPasswordTransformer.h"
#import "NSString+MPPasswordCreation.h" #import "NSString+MPPasswordCreation.h"
@@ -49,7 +51,6 @@
#import "MPArrayController.h" #import "MPArrayController.h"
#import "KeePassKit/KeePassKit.h" #import "KeePassKit/KeePassKit.h"
#import "HNHUi/HNHUi.h" #import "HNHUi/HNHUi.h"
typedef NS_ENUM(NSUInteger, MPEntryTab) { typedef NS_ENUM(NSUInteger, MPEntryTab) {
@@ -58,6 +59,10 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
MPEntryTabAutotype MPEntryTabAutotype
}; };
@interface NSObject (MPAppKitPrivateAPI)
- (void)_searchWithGoogleFromMenu:(id)obj;
@end
@interface MPEntryInspectorViewController () { @interface MPEntryInspectorViewController () {
@private @private
NSArrayController *_attachmentsController; NSArrayController *_attachmentsController;
@@ -75,6 +80,7 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
@property (nonatomic, assign) BOOL showPassword; @property (nonatomic, assign) BOOL showPassword;
@property (nonatomic, assign) MPEntryTab activeTab; @property (nonatomic, assign) MPEntryTab activeTab;
@property (nonatomic, readonly) KPKEntry *representedEntry; @property (nonatomic, readonly) KPKEntry *representedEntry;
@property (strong) MPTOTPViewController *totpViewController;
@property (strong) MPTemporaryFileStorage *quicklookStorage; @property (strong) MPTemporaryFileStorage *quicklookStorage;
@@ -117,6 +123,11 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
return nil; return nil;
} }
- (void)setRepresentedObject:(id)representedObject {
super.representedObject = representedObject;
self.totpViewController.representedObject = self.representedObject;
}
- (void)viewDidLoad { - (void)viewDidLoad {
[self _addScrollViewWithView:self.generalView atTab:MPEntryTabGeneral]; [self _addScrollViewWithView:self.generalView atTab:MPEntryTabGeneral];
@@ -124,8 +135,7 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
[self.infoTabControl bind:NSSelectedIndexBinding toObject:self withKeyPath:NSStringFromSelector(@selector(activeTab)) options:nil]; [self.infoTabControl bind:NSSelectedIndexBinding toObject:self withKeyPath:NSStringFromSelector(@selector(activeTab)) options:nil];
[self.tabView bind:NSSelectedIndexBinding toObject:self withKeyPath:NSStringFromSelector(@selector(activeTab)) options:nil]; [self.tabView bind:NSSelectedIndexBinding toObject:self withKeyPath:NSStringFromSelector(@selector(activeTab)) options:nil];
self.attachmentTableView.backgroundColor = NSColor.clearColor; self.attachmentTableView.backgroundColor = NSColor.clearColor;
[self.attachmentTableView bind:NSContentBinding toObject:_attachmentsController withKeyPath:NSStringFromSelector(@selector(arrangedObjects)) options:nil]; [self.attachmentTableView bind:NSContentBinding toObject:_attachmentsController withKeyPath:NSStringFromSelector(@selector(arrangedObjects)) options:nil];
self.attachmentTableView.delegate = _attachmentTableDelegate; self.attachmentTableView.delegate = _attachmentTableDelegate;
@@ -141,12 +151,12 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
[self.generalView addSubview:customFieldTableView]; [self.generalView addSubview:customFieldTableView];
NSDictionary *dict = NSDictionaryOfVariableBindings(customFieldTableView, _tagsTokenField, _addCustomFieldButton); NSDictionary *dict = NSDictionaryOfVariableBindings(customFieldTableView, _fieldsStackView, _addCustomFieldButton);
[self.generalView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-16-[customFieldTableView]-16-|" [self.generalView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-16-[customFieldTableView]-16-|"
options:0 options:0
metrics:nil metrics:nil
views:dict]]; views:dict]];
[self.generalView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_tagsTokenField]-[customFieldTableView]-[_addCustomFieldButton]" [self.generalView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_fieldsStackView]-[customFieldTableView]-[_addCustomFieldButton]"
options:0 options:0
metrics:nil metrics:nil
views:dict]]; views:dict]];
@@ -154,6 +164,10 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
self.customFieldsTableView.backgroundColor = NSColor.clearColor; self.customFieldsTableView.backgroundColor = NSColor.clearColor;
self.customFieldsTableView.usesAutomaticRowHeights = YES;
if (@available(macOS 11.0, *)) {
self.customFieldsTableView.additionalSafeAreaInsets = NSEdgeInsetsZero;
}
[self.customFieldsTableView bind:NSContentBinding toObject:_customFieldsController withKeyPath:NSStringFromSelector(@selector(arrangedObjects)) options:nil]; [self.customFieldsTableView bind:NSContentBinding toObject:_customFieldsController withKeyPath:NSStringFromSelector(@selector(arrangedObjects)) options:nil];
self.customFieldsTableView.delegate = _customFieldTableDelegate; self.customFieldsTableView.delegate = _customFieldTableDelegate;
@@ -171,8 +185,10 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
self.tagsTokenField.delegate = _tagTokenFieldDelegate; self.tagsTokenField.delegate = _tagTokenFieldDelegate;
[self _setupTOPTView];
[self _setupCustomFieldsButton]; [self _setupCustomFieldsButton];
[self _setupViewBindings]; [self _setupViewBindings];
[self _updateFieldVisibilty];
} }
- (void)registerNotificationsForDocument:(MPDocument *)document { - (void)registerNotificationsForDocument:(MPDocument *)document {
@@ -187,10 +203,6 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
object:document]; object:document];
} }
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
#pragma mark - #pragma mark -
#pragma mark Actions #pragma mark Actions
@@ -201,7 +213,7 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
} }
- (void)removeCustomField:(id)sender { - (void)removeCustomField:(id)sender {
NSInteger rowIndex = [self.customFieldsTableView rowForView:sender]; NSInteger rowIndex = [self.customFieldsTableView rowForView:sender];
NSAssert(rowIndex > 0 && rowIndex < self.representedEntry.customAttributes.count, @"Invalid custom attribute index."); NSAssert(rowIndex >= 0 && rowIndex < self.representedEntry.customAttributes.count, @"Invalid custom attribute index.");
KPKAttribute *attribute = self.representedEntry.customAttributes[rowIndex]; KPKAttribute *attribute = self.representedEntry.customAttributes[rowIndex];
[self.observer willChangeModelProperty]; [self.observer willChangeModelProperty];
[self.representedEntry removeCustomAttribute:attribute]; [self.representedEntry removeCustomAttribute:attribute];
@@ -219,7 +231,7 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
savePanel.nameFieldStringValue = binary.name; savePanel.nameFieldStringValue = binary.name;
[savePanel beginSheetModalForWindow:self.windowController.window completionHandler:^(NSInteger result) { [savePanel beginSheetModalForWindow:self.windowController.window completionHandler:^(NSInteger result) {
if(result == NSFileHandlingPanelOKButton) { if(result == NSModalResponseOK) {
NSError *error; NSError *error;
BOOL sucess = [binary saveToLocation:savePanel.URL error:&error]; BOOL sucess = [binary saveToLocation:savePanel.URL error:&error];
if(!sucess && error) { if(!sucess && error) {
@@ -237,7 +249,7 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
openPanel.prompt = NSLocalizedString(@"OPEN_BUTTON_ADD_ATTACHMENT_OPEN_PANEL", "Open button in the open panel to add attachments to an entry"); openPanel.prompt = NSLocalizedString(@"OPEN_BUTTON_ADD_ATTACHMENT_OPEN_PANEL", "Open button in the open panel to add attachments to an entry");
openPanel.message = NSLocalizedString(@"MESSAGE_ADD_ATTACHMENT_OPEN_PANEL", "Message in the open panel to add attachments to an entry"); openPanel.message = NSLocalizedString(@"MESSAGE_ADD_ATTACHMENT_OPEN_PANEL", "Message in the open panel to add attachments to an entry");
[openPanel beginSheetModalForWindow:self.windowController.window completionHandler:^(NSInteger result) { [openPanel beginSheetModalForWindow:self.windowController.window completionHandler:^(NSInteger result) {
if(result == NSFileHandlingPanelOKButton) { if(result == NSModalResponseOK) {
for (NSURL *attachmentURL in openPanel.URLs) { for (NSURL *attachmentURL in openPanel.URLs) {
KPKBinary *binary = [[KPKBinary alloc] initWithContentsOfURL:attachmentURL]; KPKBinary *binary = [[KPKBinary alloc] initWithContentsOfURL:attachmentURL];
[self.observer willChangeModelProperty]; [self.observer willChangeModelProperty];
@@ -273,8 +285,8 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
KPKWindowAssociation *association = self.representedEntry.autotype.associations[row]; KPKWindowAssociation *association = self.representedEntry.autotype.associations[row];
if(association) { if(association) {
[self.representedEntry.autotype removeAssociation:association]; [self.representedEntry.autotype removeAssociation:association];
[self.observer didChangeModelProperty];
} }
[self.observer didChangeModelProperty];
} }
} }
@@ -297,7 +309,7 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem { - (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
switch([MPActionHelper typeForAction:menuItem.action]) { switch([MPActionHelper typeForAction:menuItem.action]) {
case MPActionToggleQuicklook: { case MPActionToggleQuicklook: {
BOOL enabled = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyEnableQuicklookPreview]; BOOL enabled = [NSUserDefaults.standardUserDefaults boolForKey:kMPSettingsKeyEnableQuicklookPreview];
return enabled ? [self acceptsPreviewPanelControl:nil] : NO; return enabled ? [self acceptsPreviewPanelControl:nil] : NO;
case MPActionRemoveAttachment: case MPActionRemoveAttachment:
return !self.representedEntry.isHistory; return !self.representedEntry.isHistory;
@@ -323,16 +335,16 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
- (void)endPreviewPanelControl:(QLPreviewPanel *)panel { - (void)endPreviewPanelControl:(QLPreviewPanel *)panel {
MPTemporaryFileStorage *storage = (MPTemporaryFileStorage *)panel.dataSource; MPTemporaryFileStorage *storage = (MPTemporaryFileStorage *)panel.dataSource;
[[MPTemporaryFileStorageCenter defaultCenter] unregisterStorage:storage]; [MPTemporaryFileStorageCenter.defaultCenter unregisterStorage:storage];
} }
- (void)_updatePreviewItemForPanel:(QLPreviewPanel *)panel { - (void)_updatePreviewItemForPanel:(QLPreviewPanel *)panel {
NSInteger row = [self.attachmentTableView selectedRow]; NSInteger row = self.attachmentTableView.selectedRow;
NSAssert(row > -1, @"Row needs to be selected"); NSAssert(row > -1, @"Row needs to be selected");
KPKBinary *binary = self.representedEntry.binaries[row]; KPKBinary *binary = self.representedEntry.binaries[row];
MPTemporaryFileStorage *oldStorage = (MPTemporaryFileStorage *)panel.dataSource; MPTemporaryFileStorage *oldStorage = (MPTemporaryFileStorage *)panel.dataSource;
[[MPTemporaryFileStorageCenter defaultCenter] unregisterStorage:oldStorage]; [MPTemporaryFileStorageCenter.defaultCenter unregisterStorage:oldStorage];
panel.dataSource = [[MPTemporaryFileStorageCenter defaultCenter] storageForBinary:binary]; panel.dataSource = [MPTemporaryFileStorageCenter.defaultCenter storageForBinary:binary];
} }
#pragma mark - #pragma mark -
@@ -372,6 +384,22 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
[self _showPopopver:viewController atView:sender onEdge:NSMinYEdge]; [self _showPopopver:viewController atView:sender onEdge:NSMinYEdge];
} }
- (IBAction)showOTPSetup:(id)sender {
NSView *location;
if([sender isKindOfClass:NSView.class]) {
location = sender;
}
if([sender isKindOfClass:NSMenuItem.class]) {
if([[sender representedObject] isKindOfClass:NSView.class]) {
location = [sender representedObject];
}
}
MPTOTPSetupViewController *vc = [[MPTOTPSetupViewController alloc] init];
vc.representedObject = self.representedObject;
[self _showPopopver:vc atView:location onEdge:NSMinYEdge];
}
- (void)dismissViewController:(NSViewController *)viewController { - (void)dismissViewController:(NSViewController *)viewController {
if([viewController isKindOfClass:MPAutotypeBuilderViewController.class]) { if([viewController isKindOfClass:MPAutotypeBuilderViewController.class]) {
self.showCustomAssociationSequenceAutotypeBuilderButton.enabled = YES; self.showCustomAssociationSequenceAutotypeBuilderButton.enabled = YES;
@@ -431,7 +459,7 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
metrics:nil metrics:nil
views:views]]; views:views]];
[[self view] layoutSubtreeIfNeeded]; [self.view layoutSubtreeIfNeeded];
} }
#pragma mark - #pragma mark -
@@ -464,6 +492,8 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
/* general */ /* general */
NSDictionary *nullPlaceholderBindingOptionsDict = @{ NSNullPlaceholderBindingOption: NSLocalizedString(@"NONE", "Placeholder text for input fields if no entry or group is selected")}; NSDictionary *nullPlaceholderBindingOptionsDict = @{ NSNullPlaceholderBindingOption: NSLocalizedString(@"NONE", "Placeholder text for input fields if no entry or group is selected")};
NSDictionary *prettyPasswordBindingOptionsDict = @{ NSNullPlaceholderBindingOption: nullPlaceholderBindingOptionsDict[NSNullPlaceholderBindingOption], NSValueTransformerNameBindingOption : MPPrettyPasswordTransformerName };
[self.titleTextField bind:NSValueBinding [self.titleTextField bind:NSValueBinding
toObject:self toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(title))] withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(title))]
@@ -471,19 +501,23 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
[self.passwordTextField bind:NSValueBinding [self.passwordTextField bind:NSValueBinding
toObject:self toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(password))] withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(password))]
options:nullPlaceholderBindingOptionsDict]; options:prettyPasswordBindingOptionsDict];
[self.usernameTextField bind:NSValueBinding [self.usernameTextField bind:NSValueBinding
toObject:self toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(username))] withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(username))]
options:nullPlaceholderBindingOptionsDict]; options:nullPlaceholderBindingOptionsDict];
[self.URLTextField bind:NSValueBinding [self.URLTextField bind:NSValueBinding
toObject:self toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(url))] withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(url))]
options:nullPlaceholderBindingOptionsDict]; options:nullPlaceholderBindingOptionsDict];
[self.expiresCheckButton bind:NSTitleBinding [self.expiresCheckButton bind:NSTitleBinding
toObject:self toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(timeInfo)), NSStringFromSelector(@selector(expirationDate))] withKeyPath:[NSString stringWithFormat:@"%@.%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(timeInfo)), NSStringFromSelector(@selector(expirationDate))]
options:@{ NSValueTransformerNameBindingOption:MPExpiryDateValueTransformerName }]; options:@{ NSValueTransformerNameBindingOption:MPExpiryDateValueTransformerName }];
[self.expiresCheckButton bind:NSValueBinding [self.expiresCheckButton bind:NSValueBinding
toObject:self toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(timeInfo)), NSStringFromSelector(@selector(expires))] withKeyPath:[NSString stringWithFormat:@"%@.%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(timeInfo)), NSStringFromSelector(@selector(expires))]
@@ -500,7 +534,7 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
withKeyPath:[NSString stringWithFormat:@"%@.%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(uuid)), NSStringFromSelector(@selector(UUIDString))] withKeyPath:[NSString stringWithFormat:@"%@.%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(uuid)), NSStringFromSelector(@selector(UUIDString))]
options:@{ NSConditionallySetsEditableBindingOption: @NO }]; options:@{ NSConditionallySetsEditableBindingOption: @NO }];
self.uuidTextField.editable = NO; self.uuidTextField.editable = NO;
/* Attachments */ /* Attachments */
[_attachmentsController bind:NSContentArrayBinding [_attachmentsController bind:NSContentArrayBinding
toObject:self toObject:self
@@ -557,6 +591,20 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
NSMenu *customFieldMenu = [[NSMenu alloc] initWithTitle:NSLocalizedString(@"ADD_CUSTOM_FIELD_CONTEXT_MENU", @"Menu displayed for adding special custom keys")]; NSMenu *customFieldMenu = [[NSMenu alloc] initWithTitle:NSLocalizedString(@"ADD_CUSTOM_FIELD_CONTEXT_MENU", @"Menu displayed for adding special custom keys")];
customFieldMenu.delegate = _addCustomFieldContextMenuDelegate; customFieldMenu.delegate = _addCustomFieldContextMenuDelegate;
self.addCustomFieldButton.contextMenu = customFieldMenu; self.addCustomFieldButton.contextMenu = customFieldMenu;
//[self.addCustomFieldButton setEnabled:NO forSegment:MPContextButtonSegmentContextButton];
}
- (void)_updateFieldVisibilty {
}
- (void)_setupTOPTView {
self.totpViewController = [[MPTOTPViewController alloc] init];
NSInteger urlindex = [self.fieldsStackView.arrangedSubviews indexOfObject:self.URLTextField];
NSAssert(urlindex != NSNotFound, @"Missing reference view. This should not happen!");
[self addChildViewController:self.totpViewController];
[self.fieldsStackView insertArrangedSubview:self.totpViewController.view atIndex:urlindex - 1];
} }
#pragma mark - #pragma mark -
@@ -623,14 +671,14 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
name = [_customFieldsController.arrangedObjects[index] key]; name = [_customFieldsController.arrangedObjects[index] key];
} }
} }
[MPPasteBoardController.defaultController copyObjects:@[selectedValue] overlayInfo:info name:name atView:self.view]; [MPPasteBoardController.defaultController copyObject:selectedValue overlayInfo:info name:name atView:self.view];
return NO; return NO;
} }
return YES; return YES;
} }
- (IBAction)toggleExpire:(NSButton*)sender { - (IBAction)toggleExpire:(NSButton*)sender {
if([sender state] == NSOnState && [self.representedEntry.timeInfo.expirationDate isEqualToDate:[NSDate distantFuture]]) { if([sender state] == NSOnState && [self.representedEntry.timeInfo.expirationDate isEqualToDate:NSDate.distantFuture]) {
[NSApp sendAction:self.pickExpireDateButton.action to:nil from:self.pickExpireDateButton]; [NSApp sendAction:self.pickExpireDateButton.action to:nil from:self.pickExpireDateButton];
} }
} }
@@ -645,7 +693,12 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
- (void)_didChangeCurrentItem:(NSNotification *)notificiation { - (void)_didChangeCurrentItem:(NSNotification *)notificiation {
self.showPassword = NO; self.showPassword = NO;
//self.customFieldsTableView.needsDisplay = YES; }
#pragma mark -
#pragma mark KPKEntry Notifications
- (void)_didChangeAttribute:(NSNotification *)notification {
} }
@end @end

View File

@@ -24,17 +24,6 @@
#import "MPContextBarViewController.h" #import "MPContextBarViewController.h"
#import "MPTargetNodeResolving.h" #import "MPTargetNodeResolving.h"
APPKIT_EXTERN NSString *const MPEntryTableIndexColumnIdentifier;
APPKIT_EXTERN NSString *const MPEntryTableUserNameColumnIdentifier;
APPKIT_EXTERN NSString *const MPEntryTableTitleColumnIdentifier;
APPKIT_EXTERN NSString *const MPEntryTablePasswordColumnIdentifier;
APPKIT_EXTERN NSString *const MPEntryTableParentColumnIdentifier;
APPKIT_EXTERN NSString *const MPEntryTableURLColumnIdentifier;
APPKIT_EXTERN NSString *const MPEntryTableNotesColumnIdentifier;
APPKIT_EXTERN NSString *const MPEntryTableAttachmentColumnIdentifier;
APPKIT_EXTERN NSString *const MPEntryTableModfiedColumnIdentifier;
APPKIT_EXTERN NSString *const MPEntryTableHistoryColumnIdentifier;
typedef NS_ENUM(NSUInteger, MPDisplayMode) { typedef NS_ENUM(NSUInteger, MPDisplayMode) {
MPDisplayModeEntries, MPDisplayModeEntries,
MPDisplayModeSearchResults, MPDisplayModeSearchResults,

View File

@@ -62,6 +62,7 @@ NSString *const MPEntryTableParentColumnIdentifier = @"MPParentColumnIdentifier"
NSString *const MPEntryTableURLColumnIdentifier = @"MPEntryTableURLColumnIdentifier"; NSString *const MPEntryTableURLColumnIdentifier = @"MPEntryTableURLColumnIdentifier";
NSString *const MPEntryTableNotesColumnIdentifier = @"MPEntryTableNotesColumnIdentifier"; NSString *const MPEntryTableNotesColumnIdentifier = @"MPEntryTableNotesColumnIdentifier";
NSString *const MPEntryTableAttachmentColumnIdentifier = @"MPEntryTableAttachmentColumnIdentifier"; NSString *const MPEntryTableAttachmentColumnIdentifier = @"MPEntryTableAttachmentColumnIdentifier";
NSString *const MPEntryTableCreatedColumnIdentifier = @"MPEntryTableCreatedColumnIdentifier";
NSString *const MPEntryTableModfiedColumnIdentifier = @"MPEntryTableModfiedColumnIdentifier"; NSString *const MPEntryTableModfiedColumnIdentifier = @"MPEntryTableModfiedColumnIdentifier";
NSString *const MPEntryTableHistoryColumnIdentifier = @"MPEntryTableHistoryColumnIdentifier"; NSString *const MPEntryTableHistoryColumnIdentifier = @"MPEntryTableHistoryColumnIdentifier";
@@ -146,11 +147,13 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
NSTableColumn *urlColumn = self.entryTable.tableColumns[4]; NSTableColumn *urlColumn = self.entryTable.tableColumns[4];
NSTableColumn *attachmentsColumn = [[NSTableColumn alloc] initWithIdentifier:MPEntryTableAttachmentColumnIdentifier]; NSTableColumn *attachmentsColumn = [[NSTableColumn alloc] initWithIdentifier:MPEntryTableAttachmentColumnIdentifier];
NSTableColumn *notesColumn = [[NSTableColumn alloc] initWithIdentifier:MPEntryTableNotesColumnIdentifier]; NSTableColumn *notesColumn = [[NSTableColumn alloc] initWithIdentifier:MPEntryTableNotesColumnIdentifier];
NSTableColumn *createdColumn = [[NSTableColumn alloc] initWithIdentifier:MPEntryTableCreatedColumnIdentifier];
NSTableColumn *modifiedColumn = [[NSTableColumn alloc] initWithIdentifier:MPEntryTableModfiedColumnIdentifier]; NSTableColumn *modifiedColumn = [[NSTableColumn alloc] initWithIdentifier:MPEntryTableModfiedColumnIdentifier];
NSTableColumn *historyColumn = [[NSTableColumn alloc] initWithIdentifier:MPEntryTableHistoryColumnIdentifier]; NSTableColumn *historyColumn = [[NSTableColumn alloc] initWithIdentifier:MPEntryTableHistoryColumnIdentifier];
NSTableColumn *indexColumn = [[NSTableColumn alloc] initWithIdentifier:MPEntryTableIndexColumnIdentifier]; NSTableColumn *indexColumn = [[NSTableColumn alloc] initWithIdentifier:MPEntryTableIndexColumnIdentifier];
notesColumn.minWidth = 40.0; notesColumn.minWidth = 40.0;
attachmentsColumn.minWidth = 40.0; attachmentsColumn.minWidth = 40.0;
createdColumn.minWidth = 40.0;
modifiedColumn.minWidth = 40.0; modifiedColumn.minWidth = 40.0;
historyColumn.minWidth = 40.0; historyColumn.minWidth = 40.0;
indexColumn.minWidth = 27.0; indexColumn.minWidth = 27.0;
@@ -158,6 +161,7 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
[self.entryTable addTableColumn:notesColumn]; [self.entryTable addTableColumn:notesColumn];
[self.entryTable addTableColumn:attachmentsColumn]; [self.entryTable addTableColumn:attachmentsColumn];
[self.entryTable addTableColumn:modifiedColumn]; [self.entryTable addTableColumn:modifiedColumn];
[self.entryTable addTableColumn:createdColumn];
[self.entryTable addTableColumn:historyColumn]; [self.entryTable addTableColumn:historyColumn];
[self.entryTable addTableColumn:indexColumn]; [self.entryTable addTableColumn:indexColumn];
@@ -172,6 +176,7 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
NSString *parentTitleKeyPath = [[NSString alloc] initWithFormat:@"%@.%@", NSStringFromSelector(@selector(parent)), NSStringFromSelector(@selector(title))]; NSString *parentTitleKeyPath = [[NSString alloc] initWithFormat:@"%@.%@", NSStringFromSelector(@selector(parent)), NSStringFromSelector(@selector(title))];
NSString *timeInfoModificationTimeKeyPath = [[NSString alloc] initWithFormat:@"%@.%@", NSStringFromSelector(@selector(timeInfo)), NSStringFromSelector(@selector(modificationDate))]; NSString *timeInfoModificationTimeKeyPath = [[NSString alloc] initWithFormat:@"%@.%@", NSStringFromSelector(@selector(timeInfo)), NSStringFromSelector(@selector(modificationDate))];
NSString *timeInfoCreationTimeKeyPath = [[NSString alloc] initWithFormat:@"%@.%@", NSStringFromSelector(@selector(timeInfo)), NSStringFromSelector(@selector(creationDate))];
indexColumn.sortDescriptorPrototype = [NSSortDescriptor sortDescriptorWithKey:NSStringFromSelector(@selector(index)) ascending:YES selector:@selector(compare:)]; indexColumn.sortDescriptorPrototype = [NSSortDescriptor sortDescriptorWithKey:NSStringFromSelector(@selector(index)) ascending:YES selector:@selector(compare:)];
titleColumn.sortDescriptorPrototype = [NSSortDescriptor sortDescriptorWithKey:NSStringFromSelector(@selector(title))ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; titleColumn.sortDescriptorPrototype = [NSSortDescriptor sortDescriptorWithKey:NSStringFromSelector(@selector(title))ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
@@ -179,6 +184,7 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
urlColumn.sortDescriptorPrototype = [NSSortDescriptor sortDescriptorWithKey:NSStringFromSelector(@selector(url)) ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; urlColumn.sortDescriptorPrototype = [NSSortDescriptor sortDescriptorWithKey:NSStringFromSelector(@selector(url)) ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
parentColumn.sortDescriptorPrototype = [NSSortDescriptor sortDescriptorWithKey:parentTitleKeyPath ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)]; parentColumn.sortDescriptorPrototype = [NSSortDescriptor sortDescriptorWithKey:parentTitleKeyPath ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
modifiedColumn.sortDescriptorPrototype = [NSSortDescriptor sortDescriptorWithKey:timeInfoModificationTimeKeyPath ascending:YES selector:@selector(compare:)]; modifiedColumn.sortDescriptorPrototype = [NSSortDescriptor sortDescriptorWithKey:timeInfoModificationTimeKeyPath ascending:YES selector:@selector(compare:)];
createdColumn.sortDescriptorPrototype = [NSSortDescriptor sortDescriptorWithKey:timeInfoCreationTimeKeyPath ascending:YES selector:@selector(compare:)];
indexColumn.headerCell.stringValue = @""; indexColumn.headerCell.stringValue = @"";
indexColumn.headerToolTip = NSLocalizedString(@"ENTRY_INDEX_COLUMN_TOOLTIP", "Tooltip displayed on the index header cell"); indexColumn.headerToolTip = NSLocalizedString(@"ENTRY_INDEX_COLUMN_TOOLTIP", "Tooltip displayed on the index header cell");
@@ -189,6 +195,7 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
urlColumn.headerCell.stringValue = NSLocalizedString(@"URL", "Url column title"); urlColumn.headerCell.stringValue = NSLocalizedString(@"URL", "Url column title");
notesColumn.headerCell.stringValue = NSLocalizedString(@"NOTES", "Notes column title"); notesColumn.headerCell.stringValue = NSLocalizedString(@"NOTES", "Notes column title");
attachmentsColumn.headerCell.stringValue = NSLocalizedString(@"ATTACHMENTS", "Attachments column title (shows counts)"); attachmentsColumn.headerCell.stringValue = NSLocalizedString(@"ATTACHMENTS", "Attachments column title (shows counts)");
createdColumn.headerCell.stringValue = NSLocalizedString(@"CREATED", "Creating date column title");
modifiedColumn.headerCell.stringValue = NSLocalizedString(@"MODIFIED", "Modification date column title"); modifiedColumn.headerCell.stringValue = NSLocalizedString(@"MODIFIED", "Modification date column title");
historyColumn.headerCell.stringValue = NSLocalizedString(@"HISTORY", "History count column title"); historyColumn.headerCell.stringValue = NSLocalizedString(@"HISTORY", "History count column title");
@@ -229,7 +236,7 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didUpdateSearchResults:) name:MPDocumentDidChangeSearchResults object:document]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didUpdateSearchResults:) name:MPDocumentDidChangeSearchResults object:document];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_showEntryHistory:) name:MPDocumentShowEntryHistoryNotification object:document]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_showEntryHistory:) name:MPDocumentShowEntryHistoryNotification object:document];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_hideEntryHistory:) name:MPDocumentHideEntryHistoryNotification object:document]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_hideEntryHistory:) name:MPDocumentHideEntryHistoryNotification object:document];
[self.contextBarViewController registerNotificationsForDocument:document]; [self.contextBarViewController registerNotificationsForDocument:document];
} }
@@ -253,7 +260,6 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
entry.parent.lastTopVisibleEntry = entry.uuid; entry.parent.lastTopVisibleEntry = entry.uuid;
} }
} }
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
BOOL isTitleColumn = [tableColumn.identifier isEqualToString:MPEntryTableTitleColumnIdentifier]; BOOL isTitleColumn = [tableColumn.identifier isEqualToString:MPEntryTableTitleColumnIdentifier];
BOOL isGroupColumn = [tableColumn.identifier isEqualToString:MPEntryTableParentColumnIdentifier]; BOOL isGroupColumn = [tableColumn.identifier isEqualToString:MPEntryTableParentColumnIdentifier];
@@ -262,6 +268,7 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
BOOL isURLColumn = [tableColumn.identifier isEqualToString:MPEntryTableURLColumnIdentifier]; BOOL isURLColumn = [tableColumn.identifier isEqualToString:MPEntryTableURLColumnIdentifier];
BOOL isAttachmentColumn = [tableColumn.identifier isEqualToString:MPEntryTableAttachmentColumnIdentifier]; BOOL isAttachmentColumn = [tableColumn.identifier isEqualToString:MPEntryTableAttachmentColumnIdentifier];
BOOL isNotesColumn = [tableColumn.identifier isEqualToString:MPEntryTableNotesColumnIdentifier]; BOOL isNotesColumn = [tableColumn.identifier isEqualToString:MPEntryTableNotesColumnIdentifier];
BOOL isCreatedColumn = [tableColumn.identifier isEqualToString:MPEntryTableCreatedColumnIdentifier];
BOOL isModifedColumn = [tableColumn.identifier isEqualToString:MPEntryTableModfiedColumnIdentifier]; BOOL isModifedColumn = [tableColumn.identifier isEqualToString:MPEntryTableModfiedColumnIdentifier];
BOOL isHistoryColumn = [tableColumn.identifier isEqualToString:MPEntryTableHistoryColumnIdentifier]; BOOL isHistoryColumn = [tableColumn.identifier isEqualToString:MPEntryTableHistoryColumnIdentifier];
@@ -308,12 +315,12 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
view = [tableView makeViewWithIdentifier:_MPTableStringCellView owner:self]; view = [tableView makeViewWithIdentifier:_MPTableStringCellView owner:self];
[view.textField unbind:NSValueBinding]; [view.textField unbind:NSValueBinding];
view.textField.stringValue = @""; view.textField.stringValue = @"";
if(!isModifedColumn) { if(!isModifedColumn && !isCreatedColumn) {
/* clean up old formatter that might be left */ /* clean up old formatter that might be left */
view.textField.formatter = nil; view.textField.formatter = nil;
} }
if(isModifedColumn) { if(isModifedColumn || isCreatedColumn) {
if(!view.textField.formatter) { if(!view.textField.formatter) {
/* Just use one formatter instance since it's expensive to create */ /* Just use one formatter instance since it's expensive to create */
static NSDateFormatter *formatter = nil; static NSDateFormatter *formatter = nil;
@@ -325,12 +332,23 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
}); });
view.textField.formatter = formatter; view.textField.formatter = formatter;
} }
NSString *modificationTimeKeyPath = [NSString stringWithFormat:@"%@.%@.%@", if(isModifedColumn) {
NSStringFromSelector(@selector(objectValue)), NSString *modificationTimeKeyPath = [NSString stringWithFormat:@"%@.%@.%@",
NSStringFromSelector(@selector(timeInfo)), NSStringFromSelector(@selector(objectValue)),
NSStringFromSelector(@selector(modificationDate))]; NSStringFromSelector(@selector(timeInfo)),
NSStringFromSelector(@selector(modificationDate))];
[view.textField bind:NSValueBinding toObject:view withKeyPath:modificationTimeKeyPath options:nil];
[view.textField bind:NSValueBinding toObject:view withKeyPath:modificationTimeKeyPath options:nil];
}
else {
NSString * createdTimeKeyPath = [NSString stringWithFormat:@"%@.%@.%@",
NSStringFromSelector(@selector(objectValue)),
NSStringFromSelector(@selector(timeInfo)),
NSStringFromSelector(@selector(creationDate))];
[view.textField bind:NSValueBinding toObject:view withKeyPath:createdTimeKeyPath options:nil];
}
return view; return view;
} }
else if(isURLColumn) { else if(isURLColumn) {
@@ -382,8 +400,11 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
if(tableView != self.entryTable) { if(tableView != self.entryTable) {
return; // Not the right table view return; // Not the right table view
} }
MPDocument *document = self.windowController.document; /* do not update the current item if we are not in focus! */
document.selectedEntries = self.entryArrayController.selectedObjects; if(tableView.window.firstResponder == self.entryTable) {
MPDocument *document = self.windowController.document;
document.selectedEntries = self.entryArrayController.selectedObjects;
}
} }
- (BOOL)tableView:(NSTableView *)tableView shouldReorderColumn:(NSInteger)columnIndex toColumn:(NSInteger)newColumnIndex { - (BOOL)tableView:(NSTableView *)tableView shouldReorderColumn:(NSInteger)columnIndex toColumn:(NSInteger)newColumnIndex {
@@ -472,6 +493,10 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
NSUInteger row = [self.entryArrayController.arrangedObjects indexOfObject:entry]; NSUInteger row = [self.entryArrayController.arrangedObjects indexOfObject:entry];
[self.entryTable scrollRowToVisible:row]; [self.entryTable scrollRowToVisible:row];
[self.entryTable selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO]; [self.entryTable selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];
// since we do not update the current selection when the table view is not first responder, do it here manually
if(self.entryTable.window.firstResponder != self.entryTable) {
document.selectedEntries = self.entryArrayController.selectedObjects;
}
} }
- (void)_didUpdateSearchResults:(NSNotification *)notification { - (void)_didUpdateSearchResults:(NSNotification *)notification {
@@ -602,7 +627,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];
} }
@@ -620,8 +645,10 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
[headerMenu addItemWithTitle:NSLocalizedString(@"NOTES", "Menu item to toggle display of notes column in entry table") action:NULL keyEquivalent:@""]; [headerMenu addItemWithTitle:NSLocalizedString(@"NOTES", "Menu item to toggle display of notes column in entry table") action:NULL keyEquivalent:@""];
[headerMenu addItemWithTitle:NSLocalizedString(@"ATTACHMENTS", "Menu item to toggle display of attachment count column in entry table") action:NULL keyEquivalent:@""]; [headerMenu addItemWithTitle:NSLocalizedString(@"ATTACHMENTS", "Menu item to toggle display of attachment count column in entry table") action:NULL keyEquivalent:@""];
[headerMenu addItemWithTitle:NSLocalizedString(@"MODIFIED", "Menu item to toggle display of modified date column in entry table") action:NULL keyEquivalent:@""]; [headerMenu addItemWithTitle:NSLocalizedString(@"MODIFIED", "Menu item to toggle display of modified date column in entry table") action:NULL keyEquivalent:@""];
[headerMenu addItemWithTitle:NSLocalizedString(@"CREATED", "Menu item to toggle display of created date column in entry table") action:NULL keyEquivalent:@""];
[headerMenu addItemWithTitle:NSLocalizedString(@"HISTORY", "Menu item to toggle display of history count column in entry table") action:NULL keyEquivalent:@""]; [headerMenu addItemWithTitle:NSLocalizedString(@"HISTORY", "Menu item to toggle display of history count column in entry table") action:NULL keyEquivalent:@""];
NSArray *identifier = @[ MPEntryTableTitleColumnIdentifier, NSArray *identifier = @[ MPEntryTableTitleColumnIdentifier,
MPEntryTableUserNameColumnIdentifier, MPEntryTableUserNameColumnIdentifier,
MPEntryTablePasswordColumnIdentifier, MPEntryTablePasswordColumnIdentifier,
@@ -629,6 +656,7 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
MPEntryTableNotesColumnIdentifier, MPEntryTableNotesColumnIdentifier,
MPEntryTableAttachmentColumnIdentifier, MPEntryTableAttachmentColumnIdentifier,
MPEntryTableModfiedColumnIdentifier, MPEntryTableModfiedColumnIdentifier,
MPEntryTableCreatedColumnIdentifier,
MPEntryTableHistoryColumnIdentifier ]; MPEntryTableHistoryColumnIdentifier ];
NSDictionary *options = @{ NSValueTransformerNameBindingOption : NSNegateBooleanTransformerName }; NSDictionary *options = @{ NSValueTransformerNameBindingOption : NSNegateBooleanTransformerName };
@@ -647,7 +675,7 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
KPKEntry *selectedEntry = nodes.count == 1 ? [nodes.firstObject asEntry] : nil; KPKEntry *selectedEntry = nodes.count == 1 ? [nodes.firstObject asEntry] : nil;
NSString *value = [selectedEntry.password kpk_finalValueForEntry:selectedEntry]; NSString *value = [selectedEntry.password kpk_finalValueForEntry:selectedEntry];
if(value) { if(value) {
[MPPasteBoardController.defaultController copyObjects:@[value] overlayInfo:MPPasteboardOverlayInfoPassword name:nil atView:self.view]; [MPPasteBoardController.defaultController copyObject:value overlayInfo:MPPasteboardOverlayInfoPassword name:nil atView:self.view];
} }
} }
@@ -656,7 +684,7 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
KPKEntry *selectedEntry = nodes.count == 1 ? [nodes.firstObject asEntry] : nil; KPKEntry *selectedEntry = nodes.count == 1 ? [nodes.firstObject asEntry] : nil;
NSString *value = [selectedEntry.username kpk_finalValueForEntry:selectedEntry]; NSString *value = [selectedEntry.username kpk_finalValueForEntry:selectedEntry];
if(value) { if(value) {
[MPPasteBoardController.defaultController copyObjects:@[value] overlayInfo:MPPasteboardOverlayInfoUsername name:nil atView:self.view]; [MPPasteBoardController.defaultController copyObject:value overlayInfo:MPPasteboardOverlayInfoUsername name:nil atView:self.view];
} }
} }
@@ -669,7 +697,7 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
KPKAttribute *attribute = selectedEntry.customAttributes[index]; KPKAttribute *attribute = selectedEntry.customAttributes[index];
NSString *value = attribute.evaluatedValue; NSString *value = attribute.evaluatedValue;
if(value) { if(value) {
[MPPasteBoardController.defaultController copyObjects:@[value] overlayInfo:MPPasteboardOverlayInfoCustom name:attribute.key atView:self.view]; [MPPasteBoardController.defaultController copyObject:value overlayInfo:MPPasteboardOverlayInfoCustom name:attribute.key atView:self.view];
} }
} }
} }
@@ -679,7 +707,7 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
KPKEntry *selectedEntry = nodes.count == 1 ? [nodes.firstObject asEntry] : nil; KPKEntry *selectedEntry = nodes.count == 1 ? [nodes.firstObject asEntry] : nil;
NSString *value = [selectedEntry.url kpk_finalValueForEntry:selectedEntry]; NSString *value = [selectedEntry.url kpk_finalValueForEntry:selectedEntry];
if(value) { if(value) {
[MPPasteBoardController.defaultController copyObjects:@[value] overlayInfo:MPPasteboardOverlayInfoURL name:nil atView:self.view]; [MPPasteBoardController.defaultController copyObject:value overlayInfo:MPPasteboardOverlayInfoURL name:nil atView:self.view];
} }
} }
@@ -718,7 +746,7 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
kKPKReferenceTitleKey: NSLocalizedString(@"COPIED_TITLE_REFERENCE", "Context menu that copies reference to title"), kKPKReferenceTitleKey: NSLocalizedString(@"COPIED_TITLE_REFERENCE", "Context menu that copies reference to title"),
kKPKReferencePasswordKey: NSLocalizedString(@"COPIED_PASSWORD_REFERENCE", "Context menu that copies reference to password"), kKPKReferencePasswordKey: NSLocalizedString(@"COPIED_PASSWORD_REFERENCE", "Context menu that copies reference to password"),
kKPKReferenceUsernameKey: NSLocalizedString(@"COPIED_USERNAME_REFERENCE", "Context menu that copies reference to username"), kKPKReferenceUsernameKey: NSLocalizedString(@"COPIED_USERNAME_REFERENCE", "Context menu that copies reference to username"),
}; };
if(![sender isKindOfClass:NSMenuItem.class]) { if(![sender isKindOfClass:NSMenuItem.class]) {
return; return;
} }
@@ -727,7 +755,7 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
KPKEntry *selectedEntry = nodes.count == 1 ? [nodes.firstObject asEntry] : nil; KPKEntry *selectedEntry = nodes.count == 1 ? [nodes.firstObject asEntry] : nil;
if(referencesField && selectedEntry) { if(referencesField && selectedEntry) {
NSString *value = [NSString stringWithFormat:@"{%@%@@%@:%@}", kKPKReferencePrefix, referencesField, kKPKReferenceUUIDKey, selectedEntry.uuid.UUIDString]; NSString *value = [NSString stringWithFormat:@"{%@%@@%@:%@}", kKPKReferencePrefix, referencesField, kKPKReferenceUUIDKey, selectedEntry.uuid.UUIDString];
[MPPasteBoardController.defaultController copyObjects:@[value] overlayInfo:MPPasteboardOverlayInfoReference name:references[referencesField] atView:self.view]; [MPPasteBoardController.defaultController copyObject:value overlayInfo:MPPasteboardOverlayInfoReference name:references[referencesField] atView:self.view];
} }
} }
@@ -749,14 +777,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 +798,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 +836,5 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
break; break;
} }
} }
@end @end

View File

@@ -22,7 +22,7 @@
#import <Cocoa/Cocoa.h> #import <Cocoa/Cocoa.h>
@interface MPPluginTabelCellView : NSTableCellView @interface MPExtendedTableCellView : NSTableCellView
@property (strong) IBOutlet NSTextField *addionalTextField; @property (strong) IBOutlet NSTextField *addionalTextField;

View File

@@ -20,9 +20,9 @@
// 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 "MPPluginTabelCellView.h" #import "MPExtendedTableCellView.h"
@implementation MPPluginTabelCellView @implementation MPExtendedTableCellView
- (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle { - (void)setBackgroundStyle:(NSBackgroundStyle)backgroundStyle {
super.backgroundStyle = backgroundStyle; super.backgroundStyle = backgroundStyle;

View File

@@ -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;
@@ -32,9 +32,11 @@
@property (strong) IBOutlet NSPopUpButton *idleTimeOutPopup; @property (strong) IBOutlet NSPopUpButton *idleTimeOutPopup;
@property (strong) IBOutlet NSButton *lockOnSleepCheckButton; @property (strong) IBOutlet NSButton *lockOnSleepCheckButton;
@property (strong) IBOutlet NSButton *lockOnLogoutCheckButton; @property (strong) IBOutlet NSButton *lockOnLogoutCheckButton;
@property (strong) IBOutlet NSButton *lockOnScreenSleepCheckButton;
@property (strong) IBOutlet NSButton *reopenLastDatabase; @property (strong) IBOutlet NSButton *reopenLastDatabase;
@property (strong) IBOutlet NSButton *enableAutosaveCheckButton; @property (strong) IBOutlet NSButton *enableAutosaveCheckButton;
@property (strong) IBOutlet NSButton *rememberKeyFileCheckButton; @property (strong) IBOutlet NSButton *rememberKeyFileCheckButton;
@property (strong) IBOutlet NSPopUpButton *fileChangeStrategyPopup; @property (strong) IBOutlet NSPopUpButton *fileChangeStrategyPopup;
@property (strong) IBOutlet NSPopUpButton *faviconDownloadMethodPopup;
@end @end

View File

@@ -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 {
@@ -52,11 +50,25 @@ NSString *const MPGeneralSetingsIdentifier = @"GeneralSettingsTab";
[self.preventUniversalClipboardSupportCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyPreventUniversalClipboard] options:nil]; [self.preventUniversalClipboardSupportCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyPreventUniversalClipboard] options:nil];
[self.lockOnSleepCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyLockOnSleep] options:nil]; [self.lockOnSleepCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyLockOnSleep] options:nil];
[self.lockOnLogoutCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingskeyLockOnLogout] options:nil]; [self.lockOnLogoutCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingskeyLockOnLogout] options:nil];
[self.lockOnScreenSleepCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingskeyLockOnScreenSleep] options:nil];
[self.idleTimeOutPopup bind:NSSelectedTagBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyIdleLockTimeOut] options:nil]; [self.idleTimeOutPopup bind:NSSelectedTagBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyIdleLockTimeOut] options:nil];
[self.reopenLastDatabase bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyReopenLastDatabaseOnLaunch] options:nil]; [self.reopenLastDatabase bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyReopenLastDatabaseOnLaunch] options:nil];
[self.enableAutosaveCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyEnableAutosave] options:nil]; [self.enableAutosaveCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyEnableAutosave] options:nil];
[self.rememberKeyFileCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyRememberKeyFilesForDatabases] options:nil]; [self.rememberKeyFileCheckButton bind:NSValueBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyRememberKeyFilesForDatabases] options:nil];
/* Favicon download method menu */
NSDictionary *faviconDownloadMethodDict = @{ @(MPFaviconDownloadMethodDirect) : NSLocalizedString(@"FAVICON_DOWNLOAD_METHOD_DIRECT", @"Favicon download method: directly download from the host"),
@(MPFaviconDownloadMethodDuckDuckGo) : NSLocalizedString(@"FAVICON_DOWNLOAD_METHOD_DUCKDUCKGO", @"Favicon download method: use DuckDuckGo's favicon fetching service"),
@(MPFaviconDownloadMethodGoogle) : NSLocalizedString(@"FAVICON_DOWNLOAD_METHOD_GOOGLE", @"Favicon download method: use Google's favicon fetching service"),
};
[self.faviconDownloadMethodPopup.menu removeAllItems];
for(NSNumber *key in faviconDownloadMethodDict) {
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:faviconDownloadMethodDict[key] action:NULL keyEquivalent:@""];
item.tag = key.integerValue;
[self.faviconDownloadMethodPopup.menu addItem:item];
}
[self.faviconDownloadMethodPopup bind:NSSelectedTagBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyFaviconDownloadMethod] options:nil];
/* File Change Strategy Menu */ /* File Change Strategy Menu */
NSDictionary *fileChangeStragegyDict = @{ @(MPFileChangeStrategyAsk) : NSLocalizedString(@"FILE_CHANGE_STRATEGY_ASK", @"External file change strategy option: ask what to do"), NSDictionary *fileChangeStragegyDict = @{ @(MPFileChangeStrategyAsk) : NSLocalizedString(@"FILE_CHANGE_STRATEGY_ASK", @"External file change strategy option: ask what to do"),
@(MPFileChangeStrategyUseOther) : NSLocalizedString(@"FILE_CHANGE_STRATEGY_USE_OTHER", @"External file change strategy option: Use the changed file and discard local changes"), @(MPFileChangeStrategyUseOther) : NSLocalizedString(@"FILE_CHANGE_STRATEGY_USE_OTHER", @"External file change strategy option: Use the changed file and discard local changes"),
@@ -70,6 +82,6 @@ NSString *const MPGeneralSetingsIdentifier = @"GeneralSettingsTab";
[self.fileChangeStrategyPopup.menu addItem:item]; [self.fileChangeStrategyPopup.menu addItem:item];
} }
[self.fileChangeStrategyPopup bind:NSSelectedTagBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyFileChangeStrategy] options:nil]; [self.fileChangeStrategyPopup bind:NSSelectedTagBinding toObject:defaultsController withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyFileChangeStrategy] options:nil];
} }
@end @end

View File

@@ -101,7 +101,7 @@ typedef NS_ENUM(NSUInteger, MPIconType) {
MPIconPhone, MPIconPhone,
/* Custom Icons not used in Database */ /* Custom Icons not used in Database */
MPCustomIconTypeBegin = 1000, MPCustomIconTypeBegin = 1000,
MPIconInfo, MPIconSidebar,
MPIconAddFolder, MPIconAddFolder,
MPIconHardDisk, MPIconHardDisk,
MPIconCreated, MPIconCreated,
@@ -130,19 +130,21 @@ typedef NS_ENUM(NSUInteger, MPIconType) {
* Available Icon names (all) * Available Icon names (all)
* @return Dictionary with MPIconType keys and NSString values containing their names * @return Dictionary with MPIconType keys and NSString values containing their names
*/ */
+ (NSDictionary *)availableIconNames; @property (class, nonatomic, strong, readonly) NSDictionary *availableIconNames;
@property (class, nonatomic, strong, readonly) NSDictionary *availableSymbolNames;
/** /**
* List of all available DatabaseIcons as an array of Images. Sorted by IconIndex. * List of all available DatabaseIcons as an array of Images. Sorted by IconIndex.
* @return Array of Icons as NSImage objects * @return Array of Icons as NSImage objects
*/ */
+ (NSArray<KPKIcon *> *)databaseIcons; @property (class, nonatomic, strong, readonly) NSArray<KPKIcon *> *databaseIcons;
/** /**
* List of all available DatabaseIcons as an array of MPIconType. Sorted by IconIndex. * List of all available DatabaseIcons as an array of MPIconType. Sorted by IconIndex.
* @return Array of MPIconType as NSNumber objects * @return Array of MPIconType as NSNumber objects
*/ */
+ (NSArray *)databaseIconTypes; @property (class, nonatomic, strong, readonly) NSArray *databaseIconTypes;
+ (void)fetchIconDataForURL:(NSURL *)url completionHandler:(void (^)(NSData *iconData))handler; + (void)fetchIconDataForURL:(NSURL *)url completionHandler:(void (^)(NSData *iconData))handler;

View File

@@ -21,19 +21,39 @@
// //
#import "MPIconHelper.h" #import "MPIconHelper.h"
#import "MPSettingsHelper.h"
#import "KeePassKit/KeePassKit.h" #import "KeePassKit/KeePassKit.h"
@implementation MPIconHelper @implementation MPIconHelper
+ (NSImage *)icon:(MPIconType)type { + (NSImage *)icon:(MPIconType)type {
static NSDictionary *icons; if (@available(macOS 11.0, *)) {
if(!icons) { static NSDictionary *symbols;
icons = [MPIconHelper availableIconNames]; if(!symbols) {
symbols = MPIconHelper.availableSymbolNames;
}
if([symbols.allKeys containsObject:@(type)]) {
NSString *imageName = symbols[@(type)];
NSImage *image = [NSImage imageWithSystemSymbolName:imageName accessibilityDescription:nil];
if(image) {
return image;
}
}
} }
if([[icons allKeys] containsObject:@(type)]) {
static NSDictionary *icons;
if(!icons) {
icons = MPIconHelper.availableIconNames;
}
if([icons.allKeys containsObject:@(type)]) {
NSString *imageName = icons[@(type)]; NSString *imageName = icons[@(type)];
NSImage *image = [NSImage imageNamed:imageName]; NSImage *image = [NSImage imageNamed:imageName];
return image; if(image) {
return image;
}
} }
return [NSImage imageNamed:NSImageNameActionTemplate]; return [NSImage imageNamed:NSImageNameActionTemplate];
} }
@@ -42,7 +62,7 @@
static NSArray *icons; static NSArray *icons;
static dispatch_once_t onceToken; static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{ dispatch_once(&onceToken, ^{
NSDictionary *imageNames = [MPIconHelper availableIconNames]; NSDictionary *imageNames = MPIconHelper.availableIconNames;
NSMutableArray *mutableIcons = [[NSMutableArray alloc] initWithCapacity:imageNames.count]; NSMutableArray *mutableIcons = [[NSMutableArray alloc] initWithCapacity:imageNames.count];
NSArray *sortedImageNames = [imageNames.allKeys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { NSArray *sortedImageNames = [imageNames.allKeys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
@@ -67,10 +87,10 @@
static NSArray *iconTypes; static NSArray *iconTypes;
static dispatch_once_t onceToken; static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{ dispatch_once(&onceToken, ^{
NSDictionary *imageNames = [MPIconHelper availableIconNames]; NSDictionary *imageNames = MPIconHelper.availableIconNames;
NSArray *sortedImageNames = [[imageNames allKeys] sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { NSArray *sortedImageNames = [imageNames.allKeys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [[imageNames objectForKey:obj1] compare:[imageNames objectForKey:obj2]]; return [imageNames[obj1] compare:imageNames[obj2]];
}]; }];
iconTypes = [sortedImageNames filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { iconTypes = [sortedImageNames filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
NSNumber *iconNumber = (NSNumber *)evaluatedObject; NSNumber *iconNumber = (NSNumber *)evaluatedObject;
@@ -80,104 +100,214 @@
return iconTypes; return iconTypes;
} }
+ (NSDictionary *)availableSymbolNames {
static NSDictionary *symbolNames;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
symbolNames = @{
@(MPIconPassword) : @"ellipsis.rectangle",
@(MPIconPackageNetwork) : @"globe",
@(MPIconWarning) : @"exclamationmark.triangle",
@(MPIconServer) : @"server.rack",
@(MPIconKlipper) : @"pin",
@(MPIconLanguages) : @"mouth",
@(MPIconBlockDevice) : @"gearshape.2",
@(MPIconNotepad) : @"note.text",
@(MPIconSocket) : @"rectangle.connected.to.line.below",
@(MPIconIdentity) : @"person.crop.square.fill.and.at.rectangle",
@(MPIconContact) : @"at",
@(MPIconCamera) : @"camera",
@(MPIconRemote) : @"icloud.fill",
@(MPIconKeys) : @"key",
@(MPIconBattery) : @"bolt.fill.batteryblock",
@(MPIconScanner) : @"scanner",
@(MPIconBrowser) : @"safari",
@(MPIconCDRom) : @"opticaldisc",
@(MPIconDisplay) : @"display",
@(MPIconEmail) : @"envelope",
@(MPIconMisc) : @"ellipsis.circle",
@(MPIconOrganizer) : @"list.number",
@(MPIconASCII) : @"doc.text",
@(MPIconIcons) : @"square.grid.3x3.fill.square",
@(MPIconEstablishedConnection) : @"bolt",
@(MPIconMailFolder) : @"tray.full",
@(MPIconFileSave) : @"square.and.arrow.down",
@(MPIconNFSUnmount) : @"externaldrive.connected.to.line.below",
@(MPIconQuickTime) : @"film",
@(MPIconSecureTerminal) : @"terminal",
@(MPIconTerminal) : @"terminal",
@(MPIconPrint) : @"printer",
@(MPIconFileSystemView) : @"square.grid.2x2",
@(MPIconRun) : @"figure.walk.diamond",
@(MPIconConfigure) : @"slider.vertical.3",
@(MPIconBrowserWindow) : @"macwindow",
@(MPIconArchive) : @"doc.zipper",
@(MPIconPercentage) : @"percent",
@(MPIconSambaUnmount) : @"externaldrive.badge.xmark",
@(MPIconHistory) : @"clock.arrow.circlepath",
@(MPIconFindMail) : @"mail.and.text.magnifyingglass",
@(MPIconVector) : @"skew",
@(MPIconMemory) : @"memorychip",
@(MPIconTrash) : @"trash",
@(MPIconNotes) : @"note.text",
@(MPIconCancel) : @"xmark.circle",
@(MPIconHelp) : @"questionmark.circle.fill",
@(MPIconPackage) : @"shippingbox",
@(MPIconFolder) : @"folder",
@(MPIconFolderOpen) : @"folder",
@(MPIconFolderTar) : @"archivebox",
@(MPIconDecrypted) : @"lock.open",
@(MPIconEncrypted) : @"lock",
@(MPIconApply) : @"checkmark.square",
@(MPIconSignature) : @"signature",
@(MPIconThumbnail) : @"photo",
@(MPIconAddressBook) : @"rectangle.stack.person.crop",
@(MPIconTextView) : @"text.justifyleft",
@(MPIconSecureAccount) : @"person.fill.viewfinder",
@(MPIconDevelopment) : @"hammer",
@(MPIconHome) : @"house",
@(MPIconServices) : @"star",
@(MPIconTux) : @"ladybug",
@(MPIconFeather) : @"lightbulb",
@(MPIconApple) : @"applelogo",
@(MPIconWiki) : @"w.circle",
@(MPIconMoney) : @"dollarsign.circle",
@(MPIconCertificat) : @"signature", // FIXME: find better icon
@(MPIconPhone) : @"iphone",
/* Custom */
@(MPIconSidebar) : @"sidebar.trailing",
@(MPIconAddFolder) : @"folder.badge.plus",
@(MPIconHardDisk) : @"internaldrive",
@(MPIconCreated) : @"staroflife", // FIXME: find better icon
@(MPIconAddEntry) : @"ellipsis.rectangle", // FIXME: find better icon
@(MPIconContextTriangle) : @"arrowtriangle.down.fill",
@(MPIconKeyboard) : @"keyboard",
@(MPIconExpiredEntry) : @"exclamationmark.octagon.fill",
@(MPIconExpiredGroup) : @"exclamationmark.octagon.fill"
};
});
if(@available(macOS 11.0, *)) {
return symbolNames;
}
else {
return nil;
}
}
+ (NSDictionary *)availableIconNames { + (NSDictionary *)availableIconNames {
static NSDictionary *imageNames; static NSDictionary *imageNames;
static dispatch_once_t onceToken; static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{ dispatch_once(&onceToken, ^{
imageNames = @{ imageNames = @{
@(MPIconPassword): @"00_PasswordTemplate", @(MPIconPassword) : @"00_PasswordTemplate",
@(MPIconPackageNetwork): @"01_PackageNetworkTemplate", @(MPIconPackageNetwork) : @"01_PackageNetworkTemplate",
@(MPIconWarning): @"02_MessageBoxWarningTemplate", @(MPIconWarning) : @"02_MessageBoxWarningTemplate",
@(MPIconServer): @"03_ServerTemplate", @(MPIconServer) : @"03_ServerTemplate",
@(MPIconKlipper): @"04_KlipperTemplate", @(MPIconKlipper) : @"04_KlipperTemplate",
@(MPIconLanguages): @"05_LanguagesTemplate", @(MPIconLanguages) : @"05_LanguagesTemplate",
@(MPIconBlockDevice): @"06_BlockDeviceTemplate", @(MPIconBlockDevice) : @"06_BlockDeviceTemplate",
@(MPIconNotepad): @"07_NotepadTemplate", @(MPIconNotepad) : @"07_NotepadTemplate",
@(MPIconSocket): @"08_SocketTemplate", @(MPIconSocket) : @"08_SocketTemplate",
@(MPIconIdentity): @"09_IdentityTemplate", @(MPIconIdentity) : @"09_IdentityTemplate",
@(MPIconContact): @"10_ContactTemplate", @(MPIconContact) : @"10_ContactTemplate",
@(MPIconCamera): @"11_CameraTemplate", @(MPIconCamera) : @"11_CameraTemplate",
@(MPIconRemote): @"12_RemoteTemplate", @(MPIconRemote) : @"12_RemoteTemplate",
@(MPIconKeys): @"13_KeysTemplate", @(MPIconKeys) : @"13_KeysTemplate",
@(MPIconBattery): @"14_BatteryTemplate", @(MPIconBattery) : @"14_BatteryTemplate",
@(MPIconScanner): @"15_ScannerTemplate", @(MPIconScanner) : @"15_ScannerTemplate",
@(MPIconBrowser): @"16_BrowserTemplate", @(MPIconBrowser) : @"16_BrowserTemplate",
@(MPIconCDRom): @"17_CDRomTemplate", @(MPIconCDRom) : @"17_CDRomTemplate",
@(MPIconDisplay): @"18_DisplayTemplate", @(MPIconDisplay) : @"18_DisplayTemplate",
@(MPIconEmail): @"19_EmailTemplate", @(MPIconEmail) : @"19_EmailTemplate",
@(MPIconMisc): @"20_MiscTemplate", @(MPIconMisc) : @"20_MiscTemplate",
@(MPIconOrganizer): @"21_OrganizerTemplate", @(MPIconOrganizer) : @"21_OrganizerTemplate",
@(MPIconASCII): @"22_ASCIITemplate", @(MPIconASCII) : @"22_ASCIITemplate",
@(MPIconIcons): @"23_IconsTemplate", @(MPIconIcons) : @"23_IconsTemplate",
@(MPIconEstablishedConnection): @"24_EstablishedConnectionTemplate", @(MPIconEstablishedConnection) : @"24_EstablishedConnectionTemplate",
@(MPIconMailFolder): @"25_MailFolderTemplate", @(MPIconMailFolder) : @"25_MailFolderTemplate",
@(MPIconFileSave): @"26_FileSaveTemplate", @(MPIconFileSave) : @"26_FileSaveTemplate",
@(MPIconNFSUnmount) :@"27_NFSUnmountTemplate", @(MPIconNFSUnmount) : @"27_NFSUnmountTemplate",
@(MPIconQuickTime) : @"28_QuickTimeTemplate", @(MPIconQuickTime) : @"28_QuickTimeTemplate",
@(MPIconSecureTerminal) : @"29_SecureTerminalTemplate", @(MPIconSecureTerminal) : @"29_SecureTerminalTemplate",
@(MPIconTerminal) : @"30_TerminalTemplate", @(MPIconTerminal) : @"30_TerminalTemplate",
@(MPIconPrint) : @"31_PrintTemplate", @(MPIconPrint) : @"31_PrintTemplate",
@(MPIconFileSystemView) : @"32_FileSystemViewTemplate", @(MPIconFileSystemView) : @"32_FileSystemViewTemplate",
@(MPIconRun) : @"33_RunTemplate", @(MPIconRun) : @"33_RunTemplate",
@(MPIconConfigure) : @"34_ConfigureTemplate", @(MPIconConfigure) : @"34_ConfigureTemplate",
@(MPIconBrowserWindow) : @"35_BrowserWindowTemplate", @(MPIconBrowserWindow) : @"35_BrowserWindowTemplate",
@(MPIconArchive) : @"36_ArchiveTemplate", @(MPIconArchive) : @"36_ArchiveTemplate",
@(MPIconPercentage) : @"37_PercentageTemplate", @(MPIconPercentage) : @"37_PercentageTemplate",
@(MPIconSambaUnmount) : @"38_SambaUnmountTemplate", @(MPIconSambaUnmount) : @"38_SambaUnmountTemplate",
@(MPIconHistory) : @"39_HistoryTemplate", @(MPIconHistory) : @"39_HistoryTemplate",
@(MPIconFindMail) : @"40_FindMailTemplate", @(MPIconFindMail) : @"40_FindMailTemplate",
@(MPIconVector) : @"41_VectorTemplate", @(MPIconVector) : @"41_VectorTemplate",
@(MPIconMemory) : @"42_MemoryTemplate", @(MPIconMemory) : @"42_MemoryTemplate",
@(MPIconTrash): @"43_TrashTemplate", @(MPIconTrash) : @"43_TrashTemplate",
@(MPIconNotes) : @"44_NotesTemplate", @(MPIconNotes) : @"44_NotesTemplate",
@(MPIconCancel) : @"45_CancelTemplate", @(MPIconCancel) : @"45_CancelTemplate",
@(MPIconHelp) : @"46_HelpTemplate", @(MPIconHelp) : @"46_HelpTemplate",
@(MPIconPackage) : @"47_PackageTemplate", @(MPIconPackage) : @"47_PackageTemplate",
@(MPIconFolder): @"48_FolderTemplate", @(MPIconFolder) : @"48_FolderTemplate",
@(MPIconFolderOpen) : @"49_FolderOpenTemplate", @(MPIconFolderOpen) : @"49_FolderOpenTemplate",
@(MPIconFolderTar) : @"50_FolderTarTemplate", @(MPIconFolderTar) : @"50_FolderTarTemplate",
@(MPIconDecrypted) : @"51_DecryptedTemplate", @(MPIconDecrypted) : @"51_DecryptedTemplate",
@(MPIconEncrypted) : @"52_EncryptedTemplate", @(MPIconEncrypted) : @"52_EncryptedTemplate",
@(MPIconApply) : @"53_ApplyTemplate", @(MPIconApply) : @"53_ApplyTemplate",
@(MPIconSignature) : @"54_SignatureTemplate", @(MPIconSignature) : @"54_SignatureTemplate",
@(MPIconThumbnail) : @"55_ThumbnailTemplate", @(MPIconThumbnail) : @"55_ThumbnailTemplate",
@(MPIconAddressBook) : @"56_AddressBookTemplate", @(MPIconAddressBook) : @"56_AddressBookTemplate",
@(MPIconTextView) : @"57_TextViewTemplate", @(MPIconTextView) : @"57_TextViewTemplate",
@(MPIconSecureAccount) : @"58_SecureAccountTemplate", @(MPIconSecureAccount) : @"58_SecureAccountTemplate",
@(MPIconDevelopment) : @"59_DevelopmentTemplate", @(MPIconDevelopment) : @"59_DevelopmentTemplate",
@(MPIconHome) : @"60_HomeTemplate", @(MPIconHome) : @"60_HomeTemplate",
@(MPIconServices) : @"61_ServicesTemplate", @(MPIconServices) : @"61_ServicesTemplate",
@(MPIconTux) : @"62_TuxTemplate", @(MPIconTux) : @"62_TuxTemplate",
@(MPIconFeather) : @"63_FeatherTemplate", @(MPIconFeather) : @"63_FeatherTemplate",
@(MPIconApple) : @"64_AppleTemplate", @(MPIconApple) : @"64_AppleTemplate",
@(MPIconWiki) : @"65_WikiTemplate", @(MPIconWiki) : @"65_WikiTemplate",
@(MPIconMoney) : @"66_MoneyTemplate", @(MPIconMoney) : @"66_MoneyTemplate",
@(MPIconCertificat) : @"67_CertificatTemplate", @(MPIconCertificat) : @"67_CertificatTemplate",
@(MPIconPhone): @"68_PhoneTemplate", @(MPIconPhone) : @"68_PhoneTemplate",
/* Custom */ /* Custom */
@(MPIconInfo): @"infoTemplate", @(MPIconSidebar) : NSImageNameTouchBarGetInfoTemplate,
@(MPIconAddFolder): @"addFolderTemplate", @(MPIconAddFolder) : @"addFolderTemplate",
@(MPIconHardDisk): @"harddiskTemplate", @(MPIconHardDisk) : @"harddiskTemplate",
@(MPIconCreated): @"createdTemplate", @(MPIconCreated) : @"createdTemplate",
@(MPIconAddEntry): @"addEntryTemplate", @(MPIconAddEntry) : @"addEntryTemplate",
@(MPIconContextTriangle): @"contextTriangleTemplate", @(MPIconContextTriangle) : @"contextTriangleTemplate",
@(MPIconKeyboard): @"keyboardTemplate", @(MPIconKeyboard) : @"keyboardTemplate",
@(MPIconExpiredEntry): NSImageNameCaution, @(MPIconExpiredEntry) : NSImageNameCaution,
@(MPIconExpiredGroup): NSImageNameCaution @(MPIconExpiredGroup) : NSImageNameCaution
}; };
}); });
return imageNames; return imageNames;
} }
+ (void)fetchIconDataForURL:(NSURL *)url completionHandler:(void (^)(NSData *iconData))handler { + (void)fetchIconDataForURL:(NSURL *)url completionHandler:(void (^)(NSData *iconData))handler {
if(!url || !handler) { if(!url || !handler) {
return; // no url, no handler so no need to do anything return; // no url, no handler so no need to do anything
} }
NSString *urlString = [NSString stringWithFormat:@"%@://%@/favicon.ico", url.scheme, url.host ? url.host : @""]; NSString *urlString;
MPFaviconDownloadMethod faviconDownloadMethod = (MPFaviconDownloadMethod)[NSUserDefaults.standardUserDefaults integerForKey:kMPSettingsKeyFaviconDownloadMethod];
switch(faviconDownloadMethod) {
case MPFaviconDownloadMethodGoogle:
urlString = [NSString stringWithFormat:@"https://www.google.com/s2/favicons?domain=%@", url.host ? url.host : @""];
break;
case MPFaviconDownloadMethodDuckDuckGo:
urlString = [NSString stringWithFormat:@"https://icons.duckduckgo.com/ip3/%@.ico", url.host ? url.host : @""];
break;
case MPFaviconDownloadMethodDirect:
default:
urlString = [NSString stringWithFormat:@"%@://%@/favicon.ico", url.scheme, url.host ? url.host : @""];
break;
}
NSURL *favIconURL = [NSURL URLWithString:urlString]; NSURL *favIconURL = [NSURL URLWithString:urlString];
if(!favIconURL) { if(!favIconURL) {
/* call the handler with nil data */ /* call the handler with nil data */
@@ -187,15 +317,15 @@
NSURLSessionTask *task = [NSURLSession.sharedSession dataTaskWithURL:favIconURL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { NSURLSessionTask *task = [NSURLSession.sharedSession dataTaskWithURL:favIconURL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if(error) { if(error) {
handler(nil); handler(nil);
} }
else if([response respondsToSelector:@selector(statusCode)] else if([response respondsToSelector:@selector(statusCode)]
&& (200 == [(id)response statusCode]) && (200 == [(id)response statusCode])
&& data.length > 0) { && data.length > 0) {
handler(data); handler(data);
} }
else { else {
handler(nil); handler(nil);
} }
}]; }];
[task resume]; [task resume];

View File

@@ -23,7 +23,6 @@
#import "MPViewController.h" #import "MPViewController.h"
@class MPDocument; @class MPDocument;
@class MPCollectionViewItem;
@interface MPIconSelectViewController : MPViewController <NSCollectionViewDelegate> @interface MPIconSelectViewController : MPViewController <NSCollectionViewDelegate>

View File

@@ -239,7 +239,6 @@ typedef NS_ENUM(NSInteger, MPIconDownloadStatus) {
} }
- (BOOL)collectionView:(NSCollectionView *)collectionView writeItemsAtIndexes:(NSIndexSet *)indexes toPasteboard:(NSPasteboard *)pasteboard { - (BOOL)collectionView:(NSCollectionView *)collectionView writeItemsAtIndexes:(NSIndexSet *)indexes toPasteboard:(NSPasteboard *)pasteboard {
NSLog(@"dragStart for indexes:%@", indexes);
[pasteboard declareTypes:@[(NSString *)kUTTypeText] owner:nil]; [pasteboard declareTypes:@[(NSString *)kUTTypeText] owner:nil];
return YES; return YES;
} }

View File

@@ -76,10 +76,6 @@ typedef NS_ENUM(NSUInteger, MPContentTab) {
return self; return self;
} }
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (NSResponder *)reconmendedFirstResponder { - (NSResponder *)reconmendedFirstResponder {
return self.view; return self.view;
} }
@@ -104,6 +100,7 @@ typedef NS_ENUM(NSUInteger, MPContentTab) {
NSTabViewItem *groupTabItem = [self.tabView tabViewItemAtIndex:MPGroupTab]; NSTabViewItem *groupTabItem = [self.tabView tabViewItemAtIndex:MPGroupTab];
NSView *groupTabView = groupTabItem.view; NSView *groupTabView = groupTabItem.view;
[groupTabView addSubview:groupView]; [groupTabView addSubview:groupView];
[groupTabView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[groupView]|" options:0 metrics:nil views:views]]; [groupTabView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[groupView]|" options:0 metrics:nil views:views]];
[groupTabView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[groupView]|" options:0 metrics:nil views:views]]; [groupTabView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[groupView]|" options:0 metrics:nil views:views]];
groupTabItem.initialFirstResponder = groupView; groupTabItem.initialFirstResponder = groupView;
@@ -111,15 +108,15 @@ typedef NS_ENUM(NSUInteger, MPContentTab) {
[self.view layout];} [self.view layout];}
- (void)registerNotificationsForDocument:(MPDocument *)document { - (void)registerNotificationsForDocument:(MPDocument *)document {
[[NSNotificationCenter defaultCenter] addObserver:self [NSNotificationCenter.defaultCenter addObserver:self
selector:@selector(_didChangeCurrentItem:) selector:@selector(_didChangeCurrentItem:)
name:MPDocumentCurrentItemChangedNotification name:MPDocumentCurrentItemChangedNotification
object:document]; object:document];
[[NSNotificationCenter defaultCenter] addObserver:self [NSNotificationCenter.defaultCenter addObserver:self
selector:@selector(_willChangeModelProperty:) selector:@selector(_willChangeModelProperty:)
name:MPDocumentWillChangeModelPropertyNotification name:MPDocumentWillChangeModelPropertyNotification
object:document]; object:document];
self.entryViewController.observer = document; self.entryViewController.observer = document;
self.itemImageView.modelChangeObserver = document; self.itemImageView.modelChangeObserver = document;
@@ -154,7 +151,7 @@ typedef NS_ENUM(NSUInteger, MPContentTab) {
if(textView == self.notesTextView) { if(textView == self.notesTextView) {
name = NSLocalizedString(@"NOTES", "Displayed name when notes or part of notes was copied"); name = NSLocalizedString(@"NOTES", "Displayed name when notes or part of notes was copied");
} }
[[MPPasteBoardController defaultController] copyObjects:@[selectedString] overlayInfo:info name:name atView:self.view]; [MPPasteBoardController.defaultController copyObject:selectedString overlayInfo:info name:name atView:self.view];
return NO; return NO;
} }
return YES; return YES;

View File

@@ -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;
@@ -40,10 +40,10 @@
@property (strong) IBOutlet NSButton *matchTagsCheckBox; @property (strong) IBOutlet NSButton *matchTagsCheckBox;
@property (strong) IBOutlet NSButton *sendCommandForControlCheckBox; @property (strong) IBOutlet NSButton *sendCommandForControlCheckBox;
@property (strong) IBOutlet NSButton *alwaysShowConfirmationBeforeAutotypeCheckBox;
/* Preview */ /* Preview */
@property (strong) IBOutlet NSButton *enableQuicklookCheckBox; @property (strong) IBOutlet NSButton *enableQuicklookCheckBox;
- (IBAction)openAccessibiltyPreferences:(id)sender; - (IBAction)runAutotypeDoctor:(id)sender;
@end @end

Some files were not shown because too many files have changed in this diff Show More