22 Commits

Author SHA1 Message Date
Michael Starke
72718274b0 Minor updates to App Icon 2022-05-24 11:28:03 +02:00
Michael Starke
200e4e259a Removed required method for editors
node icon editor now uses bindings again
2022-03-21 15:25:21 +01:00
Michael Starke
217d1adca9 Extended Finder icon style 2022-03-17 14:13:34 +01:00
Michael Starke
14b9fd8d8f Fixed clipped button in Icon Editor
Set monospaced font on password attribute editor
2022-03-16 15:20:19 +01:00
Michael Starke
36ad08ba25 Folded MPEntryPasswordAttributeEditor back into generic attribute editor
fixed brocken tracking when scrolling
added first try to show custom attributes in inspector (this might become a bottleneck)
2022-03-15 21:20:13 +01:00
Michael Starke
9bb1d3e38c Removed obsolete action declarations 2022-03-15 15:51:18 +01:00
Michael Starke
5547aad7c3 Added better handling of responder chain in NSSplitViewController.
This allows for the removal of a lot of redirection in the MPDocumentWindowController
2022-03-15 15:21:45 +01:00
Michael Starke
d746fdd5c8 Fixed static analyser error.
default attribute editors now correctly trigger undo-manager
2022-03-12 00:31:23 +01:00
Michael Starke
ae59557407 Call super 2022-03-10 22:56:54 +01:00
Michael Starke
7b24e4cbde Experimental binding setup to ease model update 2022-03-10 22:47:19 +01:00
Michael Starke
ce24b1b57c Added another icon idea 2022-03-10 16:29:56 +01:00
Michael Starke
7113b9f355 Added stub for AutotypeOverlay 2022-03-10 12:39:49 +01:00
Michael Starke
401d0d1b2f Added copy API to attributeViewController to be used by subclasses 2022-03-09 00:07:17 +01:00
Michael Starke
cea10e83b1 Added copy button to attribute editor to remove need for in-view drawing in NSTextField 2022-03-08 21:07:05 +01:00
Michael Starke
0572431a51 Extended icon editor 2022-03-03 20:37:18 +01:00
Michael Starke
0be721aec8 Added editor for node icons 2022-03-03 15:51:10 +01:00
Michael Starke
7eca854b8d Updated to current HNHUi 2022-03-01 23:51:36 +01:00
Michael Starke
f761eb7c13 Replaced default attributes with new view controller editors 2022-03-01 20:12:42 +01:00
Michael Starke
a790103cd2 Added more protocols to clarify types for certain editors 2022-03-01 10:59:04 +01:00
Michael Starke
101cf7f6bd started modularization of entry inspector 2022-02-25 23:27:53 +01:00
Michael Starke
8be69ca779 Fixed #1208 Password field did not scroll when moving cursor out of view 2022-02-21 11:35:20 +01:00
Michael Starke
e985d23fa5 Fixed crash when saving files with ChaCha chipher 2022-02-10 21:36:31 +01:00
44 changed files with 1940 additions and 651 deletions

View File

@@ -0,0 +1,15 @@
//
// AppDelegate.h
// AutotypeOverlay
//
// Created by Michael Starke on 09.03.22.
// Copyright © 2022 HicknHack Software GmbH. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@interface AOAppDelegate : NSObject <NSApplicationDelegate>
@end

View File

@@ -0,0 +1,80 @@
//
// AppDelegate.m
// AutotypeOverlay
//
// Created by Michael Starke on 09.03.22.
// Copyright © 2022 HicknHack Software GmbH. All rights reserved.
//
#import "AOAppDelegate.h"
#import <ApplicationServices/ApplicationServices.h>
@interface AOAppDelegate ()
@property (strong) IBOutlet NSWindow *window;
@end
@implementation AOAppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application
if(!AXIsProcessTrusted()) {
NSString *name = [NSBundle.mainBundle.infoDictionary[@"CFBundleName"] copy];
NSLog(@"%@ requires Accessibilty Permissions to work.", name);
}
[NSWorkspace.sharedWorkspace.notificationCenter addObserver:self selector:@selector(_didDeactivateApplication:) name:NSWorkspaceDidDeactivateApplicationNotification object:nil];
[NSWorkspace.sharedWorkspace.notificationCenter addObserver:self selector:@selector(_didActivateApplication:) name:NSWorkspaceDidActivateApplicationNotification object:nil];
}
- (void)applicationWillTerminate:(NSNotification *)aNotification {
// Insert code here to tear down your application
}
- (BOOL)applicationSupportsSecureRestorableState:(NSApplication *)app {
return YES;
}
- (void)_didDeactivateApplication:(NSNotification *)notification {
//[self.window orderOut:nil];
}
- (void)_didActivateApplication:(NSNotification *)notification {
AXUIElementRef systemWide = AXUIElementCreateSystemWide();
if(NULL == systemWide) {
return;
}
CFTypeRef elementRef;
AXError error = AXUIElementCopyAttributeValue(systemWide, kAXFocusedUIElementAttribute, &elementRef);
if(error == kAXErrorSuccess) {
[self _updateFocusedElement:elementRef];
}
}
- (void)_updateFocusedElement:(AXUIElementRef)element {
if(CFGetTypeID(element) != AXUIElementGetTypeID()) {
return; // wrong type or NULL
}
CFTypeRef positionRef;
AXError error = AXUIElementCopyAttributeValue(element, kAXPositionAttribute, &positionRef);
if(error != kAXErrorSuccess || kAXValueTypeCGPoint != AXValueGetType(positionRef)) {
return;
}
CGPoint position;
AXValueGetValue(positionRef, kAXValueTypeCGPoint, &position);
[self.window orderFront:self];
[self.window setFrameTopLeftPoint:position];
NSLog(@"Setting position to %@", NSStringFromPoint(position));
}
@end

View File

@@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,58 @@
{
"images" : [
{
"idiom" : "mac",
"scale" : "1x",
"size" : "16x16"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "16x16"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "32x32"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "32x32"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "128x128"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "128x128"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "256x256"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "256x256"
},
{
"idiom" : "mac",
"scale" : "1x",
"size" : "512x512"
},
{
"idiom" : "mac",
"scale" : "2x",
"size" : "512x512"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict/>
</plist>

View File

@@ -0,0 +1,696 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="19529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19529"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
<connections>
<outlet property="delegate" destination="Voe-Tx-rLC" id="GzC-gU-4Uq"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customObject id="Voe-Tx-rLC" customClass="AOAppDelegate">
<connections>
<outlet property="window" destination="QvC-M9-y7g" id="gIp-Ho-8D9"/>
</connections>
</customObject>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="AutotypeOverlay" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="AutotypeOverlay" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="About AutotypeOverlay" id="5kV-Vb-QxS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
<menuItem title="Services" id="NMo-om-nkz">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
<menuItem title="Hide AutotypeOverlay" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="-1" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
</connections>
</menuItem>
<menuItem title="Show All" id="Kd2-mp-pUS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
<menuItem title="Quit AutotypeOverlay" keyEquivalent="q" id="4sb-4s-VLi">
<connections>
<action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="File" id="dMs-cI-mzQ">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="File" id="bib-Uj-vzu">
<items>
<menuItem title="New" keyEquivalent="n" id="Was-JA-tGl">
<connections>
<action selector="newDocument:" target="-1" id="4Si-XN-c54"/>
</connections>
</menuItem>
<menuItem title="Open…" keyEquivalent="o" id="IAo-SY-fd9">
<connections>
<action selector="openDocument:" target="-1" id="bVn-NM-KNZ"/>
</connections>
</menuItem>
<menuItem title="Open Recent" id="tXI-mr-wws">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="oas-Oc-fiZ">
<items>
<menuItem title="Clear Menu" id="vNY-rz-j42">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="clearRecentDocuments:" target="-1" id="Daa-9d-B3U"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="m54-Is-iLE"/>
<menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
<connections>
<action selector="performClose:" target="-1" id="HmO-Ls-i7Q"/>
</connections>
</menuItem>
<menuItem title="Save…" keyEquivalent="s" id="pxx-59-PXV">
<connections>
<action selector="saveDocument:" target="-1" id="teZ-XB-qJY"/>
</connections>
</menuItem>
<menuItem title="Save As…" keyEquivalent="S" id="Bw7-FT-i3A">
<connections>
<action selector="saveDocumentAs:" target="-1" id="mDf-zr-I0C"/>
</connections>
</menuItem>
<menuItem title="Revert to Saved" keyEquivalent="r" id="KaW-ft-85H">
<connections>
<action selector="revertDocumentToSaved:" target="-1" id="iJ3-Pv-kwq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
<menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="runPageLayout:" target="-1" id="Din-rz-gC5"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
<connections>
<action selector="print:" target="-1" id="qaZ-4w-aoO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Edit" id="5QF-Oa-p0T">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Edit" id="W48-6f-4Dl">
<items>
<menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
<connections>
<action selector="undo:" target="-1" id="M6e-cu-g7V"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
<connections>
<action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
<menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
<connections>
<action selector="cut:" target="-1" id="YJe-68-I9s"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
<connections>
<action selector="copy:" target="-1" id="G1f-GL-Joy"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
<connections>
<action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
</connections>
</menuItem>
<menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/>
</connections>
</menuItem>
<menuItem title="Delete" id="pa3-QI-u2k">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="delete:" target="-1" id="0Mk-Ml-PaM"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
<connections>
<action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
<menuItem title="Find" id="4EN-yA-p0u">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Find" id="1b7-l0-nxx">
<items>
<menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
<connections>
<action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
</connections>
</menuItem>
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
</connections>
</menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
<connections>
<action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
</connections>
</menuItem>
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
<connections>
<action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
</connections>
</menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
<connections>
<action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
</connections>
</menuItem>
<menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
<connections>
<action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
<items>
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
<connections>
<action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/>
</connections>
</menuItem>
<menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
<connections>
<action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
<menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/>
</connections>
</menuItem>
<menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/>
</connections>
</menuItem>
<menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Substitutions" id="9ic-FL-obx">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
<items>
<menuItem title="Show Substitutions" id="z6F-FW-3nz">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
<menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/>
</connections>
</menuItem>
<menuItem title="Smart Quotes" id="hQb-2v-fYv">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/>
</connections>
</menuItem>
<menuItem title="Smart Dashes" id="rgM-f4-ycn">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/>
</connections>
</menuItem>
<menuItem title="Smart Links" id="cwL-P1-jid">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/>
</connections>
</menuItem>
<menuItem title="Data Detectors" id="tRr-pd-1PS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/>
</connections>
</menuItem>
<menuItem title="Text Replacement" id="HFQ-gK-NFA">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Transformations" id="2oI-Rn-ZJC">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Transformations" id="c8a-y6-VQd">
<items>
<menuItem title="Make Upper Case" id="vmV-6d-7jI">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/>
</connections>
</menuItem>
<menuItem title="Make Lower Case" id="d9M-CD-aMd">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/>
</connections>
</menuItem>
<menuItem title="Capitalize" id="UEZ-Bs-lqG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Speech" id="xrE-MZ-jX0">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Speech" id="3rS-ZA-NoH">
<items>
<menuItem title="Start Speaking" id="Ynk-f8-cLZ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/>
</connections>
</menuItem>
<menuItem title="Stop Speaking" id="Oyz-dy-DGm">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Format" id="jxT-CU-nIS">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Format" id="GEO-Iw-cKr">
<items>
<menuItem title="Font" id="Gi5-1S-RQB">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Font" systemMenu="font" id="aXa-aM-Jaq">
<items>
<menuItem title="Show Fonts" keyEquivalent="t" id="Q5e-8K-NDq">
<connections>
<action selector="orderFrontFontPanel:" target="YLy-65-1bz" id="WHr-nq-2xA"/>
</connections>
</menuItem>
<menuItem title="Bold" tag="2" keyEquivalent="b" id="GB9-OM-e27">
<connections>
<action selector="addFontTrait:" target="YLy-65-1bz" id="hqk-hr-sYV"/>
</connections>
</menuItem>
<menuItem title="Italic" tag="1" keyEquivalent="i" id="Vjx-xi-njq">
<connections>
<action selector="addFontTrait:" target="YLy-65-1bz" id="IHV-OB-c03"/>
</connections>
</menuItem>
<menuItem title="Underline" keyEquivalent="u" id="WRG-CD-K1S">
<connections>
<action selector="underline:" target="-1" id="FYS-2b-JAY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="5gT-KC-WSO"/>
<menuItem title="Bigger" tag="3" keyEquivalent="+" id="Ptp-SP-VEL">
<connections>
<action selector="modifyFont:" target="YLy-65-1bz" id="Uc7-di-UnL"/>
</connections>
</menuItem>
<menuItem title="Smaller" tag="4" keyEquivalent="-" id="i1d-Er-qST">
<connections>
<action selector="modifyFont:" target="YLy-65-1bz" id="HcX-Lf-eNd"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kx3-Dk-x3B"/>
<menuItem title="Kern" id="jBQ-r6-VK2">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Kern" id="tlD-Oa-oAM">
<items>
<menuItem title="Use Default" id="GUa-eO-cwY">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardKerning:" target="-1" id="6dk-9l-Ckg"/>
</connections>
</menuItem>
<menuItem title="Use None" id="cDB-IK-hbR">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffKerning:" target="-1" id="U8a-gz-Maa"/>
</connections>
</menuItem>
<menuItem title="Tighten" id="46P-cB-AYj">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="tightenKerning:" target="-1" id="hr7-Nz-8ro"/>
</connections>
</menuItem>
<menuItem title="Loosen" id="ogc-rX-tC1">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="loosenKerning:" target="-1" id="8i4-f9-FKE"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Ligatures" id="o6e-r0-MWq">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Ligatures" id="w0m-vy-SC9">
<items>
<menuItem title="Use Default" id="agt-UL-0e3">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useStandardLigatures:" target="-1" id="7uR-wd-Dx6"/>
</connections>
</menuItem>
<menuItem title="Use None" id="J7y-lM-qPV">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="turnOffLigatures:" target="-1" id="iX2-gA-Ilz"/>
</connections>
</menuItem>
<menuItem title="Use All" id="xQD-1f-W4t">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="useAllLigatures:" target="-1" id="KcB-kA-TuK"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Baseline" id="OaQ-X3-Vso">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Baseline" id="ijk-EB-dga">
<items>
<menuItem title="Use Default" id="3Om-Ey-2VK">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unscript:" target="-1" id="0vZ-95-Ywn"/>
</connections>
</menuItem>
<menuItem title="Superscript" id="Rqc-34-cIF">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="superscript:" target="-1" id="3qV-fo-wpU"/>
</connections>
</menuItem>
<menuItem title="Subscript" id="I0S-gh-46l">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="subscript:" target="-1" id="Q6W-4W-IGz"/>
</connections>
</menuItem>
<menuItem title="Raise" id="2h7-ER-AoG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="raiseBaseline:" target="-1" id="4sk-31-7Q9"/>
</connections>
</menuItem>
<menuItem title="Lower" id="1tx-W0-xDw">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowerBaseline:" target="-1" id="OF1-bc-KW4"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="Ndw-q3-faq"/>
<menuItem title="Show Colors" keyEquivalent="C" id="bgn-CT-cEk">
<connections>
<action selector="orderFrontColorPanel:" target="-1" id="mSX-Xz-DV3"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="iMs-zA-UFJ"/>
<menuItem title="Copy Style" keyEquivalent="c" id="5Vv-lz-BsD">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="copyFont:" target="-1" id="GJO-xA-L4q"/>
</connections>
</menuItem>
<menuItem title="Paste Style" keyEquivalent="v" id="vKC-jM-MkH">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteFont:" target="-1" id="JfD-CL-leO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Text" id="Fal-I4-PZk">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Text" id="d9c-me-L2H">
<items>
<menuItem title="Align Left" keyEquivalent="{" id="ZM1-6Q-yy1">
<connections>
<action selector="alignLeft:" target="-1" id="zUv-R1-uAa"/>
</connections>
</menuItem>
<menuItem title="Center" keyEquivalent="|" id="VIY-Ag-zcb">
<connections>
<action selector="alignCenter:" target="-1" id="spX-mk-kcS"/>
</connections>
</menuItem>
<menuItem title="Justify" id="J5U-5w-g23">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="alignJustified:" target="-1" id="ljL-7U-jND"/>
</connections>
</menuItem>
<menuItem title="Align Right" keyEquivalent="}" id="wb2-vD-lq4">
<connections>
<action selector="alignRight:" target="-1" id="r48-bG-YeY"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="4s2-GY-VfK"/>
<menuItem title="Writing Direction" id="H1b-Si-o9J">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Writing Direction" id="8mr-sm-Yjd">
<items>
<menuItem title="Paragraph" enabled="NO" id="ZvO-Gk-QUH">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="YGs-j5-SAR">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionNatural:" target="-1" id="qtV-5e-UBP"/>
</connections>
</menuItem>
<menuItem id="Lbh-J2-qVU">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionLeftToRight:" target="-1" id="S0X-9S-QSf"/>
</connections>
</menuItem>
<menuItem id="jFq-tB-4Kx">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeBaseWritingDirectionRightToLeft:" target="-1" id="5fk-qB-AqJ"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="swp-gr-a21"/>
<menuItem title="Selection" enabled="NO" id="cqv-fj-IhA">
<modifierMask key="keyEquivalentModifierMask"/>
</menuItem>
<menuItem id="Nop-cj-93Q">
<string key="title"> Default</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionNatural:" target="-1" id="lPI-Se-ZHp"/>
</connections>
</menuItem>
<menuItem id="BgM-ve-c93">
<string key="title"> Left to Right</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionLeftToRight:" target="-1" id="caW-Bv-w94"/>
</connections>
</menuItem>
<menuItem id="RB4-Sm-HuC">
<string key="title"> Right to Left</string>
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="makeTextWritingDirectionRightToLeft:" target="-1" id="EXD-6r-ZUu"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="fKy-g9-1gm"/>
<menuItem title="Show Ruler" id="vLm-3I-IUL">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleRuler:" target="-1" id="FOx-HJ-KwY"/>
</connections>
</menuItem>
<menuItem title="Copy Ruler" keyEquivalent="c" id="MkV-Pr-PK5">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="copyRuler:" target="-1" id="71i-fW-3W2"/>
</connections>
</menuItem>
<menuItem title="Paste Ruler" keyEquivalent="v" id="LVM-kO-fVI">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="pasteRuler:" target="-1" id="cSh-wd-qM2"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="View" id="H8h-7b-M4v">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="View" id="HyV-fh-RgO">
<items>
<menuItem title="Show Toolbar" keyEquivalent="t" id="snW-S8-Cw5">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="toggleToolbarShown:" target="-1" id="BXY-wc-z0C"/>
</connections>
</menuItem>
<menuItem title="Customize Toolbar…" id="1UK-8n-QPP">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="runToolbarCustomizationPalette:" target="-1" id="pQI-g3-MTW"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="hB3-LF-h0Y"/>
<menuItem title="Show Sidebar" keyEquivalent="s" id="kIP-vf-haE">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="toggleSidebar:" target="-1" id="iwa-gc-5KM"/>
</connections>
</menuItem>
<menuItem title="Enter Full Screen" keyEquivalent="f" id="4J7-dP-txa">
<modifierMask key="keyEquivalentModifierMask" control="YES" command="YES"/>
<connections>
<action selector="toggleFullScreen:" target="-1" id="dU3-MA-1Rq"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Window" id="aUF-d1-5bR">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
<items>
<menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
<connections>
<action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="R4o-n2-Eq4">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Help" id="wpr-3q-Mcd">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
<items>
<menuItem title="AutotypeOverlay Help" keyEquivalent="?" id="FKE-Sm-Kum">
<connections>
<action selector="showHelp:" target="-1" id="y7X-2Q-9no"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
<point key="canvasLocation" x="200" y="121"/>
</menu>
<window title="AutotypeOverlay" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="335" y="390" width="480" height="360"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1415"/>
<view key="contentView" id="EiT-Mj-1SZ">
<rect key="frame" x="0.0" y="0.0" width="480" height="360"/>
<autoresizingMask key="autoresizingMask"/>
</view>
<point key="canvasLocation" x="200" y="400"/>
</window>
</objects>
</document>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>LSUIElement</key>
<true/>
</dict>
</plist>

16
AutotypeOverlay/main.m Normal file
View File

@@ -0,0 +1,16 @@
//
// main.m
// AutotypeOverlay
//
// Created by Michael Starke on 09.03.22.
// Copyright © 2022 HicknHack Software GmbH. All rights reserved.
//
#import <Cocoa/Cocoa.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// Setup code that might create autoreleased objects goes here.
}
return NSApplicationMain(argc, argv);
}

View File

@@ -1,5 +1,5 @@
github "MacPass/KeePassKit" "3.2.0" github "MacPass/KeePassKit" "3.2.1"
github "MacPass/KissXML" "933f04fe5ad95c2be07ec0c2f801e140007f20fa" github "MacPass/KissXML" "933f04fe5ad95c2be07ec0c2f801e140007f20fa"
github "MacPass/TransformerKit" "a8b5bb73cc327ec6798569b865c32fec5eb2289f" github "MacPass/TransformerKit" "a8b5bb73cc327ec6798569b865c32fec5eb2289f"
github "mstarke/HNHUi" "6.0" github "mstarke/HNHUi" "6.0.1"
github "sparkle-project/Sparkle" "1.27.1" github "sparkle-project/Sparkle" "1.27.1"

View File

@@ -129,6 +129,10 @@
4C4BE0C8257E9B91000AEA8C /* MPNotificationPreferencesController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4BE0C6257E9B91000AEA8C /* MPNotificationPreferencesController.m */; }; 4C4BE0C8257E9B91000AEA8C /* MPNotificationPreferencesController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4BE0C6257E9B91000AEA8C /* MPNotificationPreferencesController.m */; };
4C4BE0C9257E9B91000AEA8C /* MPNotificationPreferencesController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C4BE0C7257E9B91000AEA8C /* MPNotificationPreferencesController.xib */; }; 4C4BE0C9257E9B91000AEA8C /* MPNotificationPreferencesController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C4BE0C7257E9B91000AEA8C /* MPNotificationPreferencesController.xib */; };
4C4DC0A61C3AD17500DE9DCF /* KeePassKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C7B63791C0CB55600D7038C /* KeePassKit.framework */; }; 4C4DC0A61C3AD17500DE9DCF /* KeePassKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4C7B63791C0CB55600D7038C /* KeePassKit.framework */; };
4C4F120027D9055300ED5495 /* AOAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4F11FF27D9055300ED5495 /* AOAppDelegate.m */; };
4C4F120227D9055600ED5495 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4C4F120127D9055600ED5495 /* Assets.xcassets */; };
4C4F120527D9055600ED5495 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C4F120327D9055600ED5495 /* MainMenu.xib */; };
4C4F120727D9055600ED5495 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4F120627D9055600ED5495 /* main.m */; };
4C4F72D118DF704400E8D378 /* DDHotKeyTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4F72CF18DF704400E8D378 /* DDHotKeyTextField.m */; }; 4C4F72D118DF704400E8D378 /* DDHotKeyTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4F72CF18DF704400E8D378 /* DDHotKeyTextField.m */; };
4C4FCE15177CFE6B00BBF7AE /* MPCustomFieldTableCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4FCE14177CFE6B00BBF7AE /* MPCustomFieldTableCellView.m */; }; 4C4FCE15177CFE6B00BBF7AE /* MPCustomFieldTableCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C4FCE14177CFE6B00BBF7AE /* MPCustomFieldTableCellView.m */; };
4C50CC041F6C18830095629D /* MPCollectionViewItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C50CC031F6C18830095629D /* MPCollectionViewItem.m */; }; 4C50CC041F6C18830095629D /* MPCollectionViewItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C50CC031F6C18830095629D /* MPCollectionViewItem.m */; };
@@ -222,6 +226,8 @@
4C9328C8273E6A38000DCBEE /* MPTOTPSetupViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C9328CA273E6A38000DCBEE /* MPTOTPSetupViewController.xib */; }; 4C9328C8273E6A38000DCBEE /* MPTOTPSetupViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C9328CA273E6A38000DCBEE /* MPTOTPSetupViewController.xib */; };
4C9328D0273E6A83000DCBEE /* MPTOTPViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C9328D2273E6A83000DCBEE /* MPTOTPViewController.xib */; }; 4C9328D0273E6A83000DCBEE /* MPTOTPViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C9328D2273E6A83000DCBEE /* MPTOTPViewController.xib */; };
4C978E0D19AE54AB003067DF /* MPFlagsHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C978E0C19AE54AB003067DF /* MPFlagsHelper.m */; }; 4C978E0D19AE54AB003067DF /* MPFlagsHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C978E0C19AE54AB003067DF /* MPFlagsHelper.m */; };
4C98A6CC27CFAB1900CD912F /* MPNodeIconViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C98A6CA27CFAB1900CD912F /* MPNodeIconViewController.m */; };
4C98A6CD27CFAB1900CD912F /* MPNodeIconViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C98A6CB27CFAB1900CD912F /* MPNodeIconViewController.xib */; };
4C9BFFFB1FD19B5400264B16 /* MPPrettyPasswordTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C9BFFFA1FD19B5400264B16 /* MPPrettyPasswordTransformer.m */; }; 4C9BFFFB1FD19B5400264B16 /* MPPrettyPasswordTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C9BFFFA1FD19B5400264B16 /* MPPrettyPasswordTransformer.m */; };
4CA08DA017A831B200A6544B /* MPAddEntryContextMenuDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA08D9F17A831B200A6544B /* MPAddEntryContextMenuDelegate.m */; }; 4CA08DA017A831B200A6544B /* MPAddEntryContextMenuDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CA08D9F17A831B200A6544B /* MPAddEntryContextMenuDelegate.m */; };
4CA0B2ED15BCADAC00654E32 /* PreferencesWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CA0B2EC15BCADAC00654E32 /* PreferencesWindow.xib */; }; 4CA0B2ED15BCADAC00654E32 /* PreferencesWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CA0B2EC15BCADAC00654E32 /* PreferencesWindow.xib */; };
@@ -255,6 +261,7 @@
4CC59C2721AF0893005E8D6B /* MPPathControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC59C2621AF0893005E8D6B /* MPPathControl.m */; }; 4CC59C2721AF0893005E8D6B /* MPPathControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC59C2621AF0893005E8D6B /* MPPathControl.m */; };
4CC663E7216F7A7100E33965 /* MPPluginRepositoryBrowserViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC663E5216F7A7100E33965 /* MPPluginRepositoryBrowserViewController.m */; }; 4CC663E7216F7A7100E33965 /* MPPluginRepositoryBrowserViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC663E5216F7A7100E33965 /* MPPluginRepositoryBrowserViewController.m */; };
4CC6DB7A17D23719002C6091 /* KPKNode+IconImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6DB7917D23719002C6091 /* KPKNode+IconImage.m */; }; 4CC6DB7A17D23719002C6091 /* KPKNode+IconImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC6DB7917D23719002C6091 /* KPKNode+IconImage.m */; };
4CC91B6B27D7E7E6001E9517 /* MPInspectorEditorView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CC91B6A27D7E7E6001E9517 /* MPInspectorEditorView.m */; };
4CCA8E9B18D91ED9001A6754 /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CCA8E9A18D91ED9001A6754 /* Quartz.framework */; }; 4CCA8E9B18D91ED9001A6754 /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CCA8E9A18D91ED9001A6754 /* Quartz.framework */; };
4CCCE8011D75CA48006AA951 /* MPArrayController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCCE8001D75CA48006AA951 /* MPArrayController.m */; }; 4CCCE8011D75CA48006AA951 /* MPArrayController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCCE8001D75CA48006AA951 /* MPArrayController.m */; };
4CCEDE2A179F203B008402BE /* MPOutlineView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCEDE29179F203B008402BE /* MPOutlineView.m */; }; 4CCEDE2A179F203B008402BE /* MPOutlineView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CCEDE29179F203B008402BE /* MPOutlineView.m */; };
@@ -295,11 +302,11 @@
4CE5B54B173AFBA700207B39 /* MPDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE5B549173AFBA700207B39 /* MPDocument.m */; }; 4CE5B54B173AFBA700207B39 /* MPDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE5B549173AFBA700207B39 /* MPDocument.m */; };
4CE8246F16E2E93400573141 /* MPOverlayWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8246E16E2E93400573141 /* MPOverlayWindowController.m */; }; 4CE8246F16E2E93400573141 /* MPOverlayWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8246E16E2E93400573141 /* MPOverlayWindowController.m */; };
4CE8247516E2F2B900573141 /* MPOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8247416E2F2B900573141 /* MPOverlayView.m */; }; 4CE8247516E2F2B900573141 /* MPOverlayView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE8247416E2F2B900573141 /* MPOverlayView.m */; };
4CE84903271E10AC00EBAB0C /* MPEntryPasswordAttributeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CE84901271E10AC00EBAB0C /* MPEntryPasswordAttributeViewController.m */; };
4CE84904271E10AC00EBAB0C /* MPEntryPasswordAttributeViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CE84902271E10AC00EBAB0C /* MPEntryPasswordAttributeViewController.xib */; };
4CE88B9717BA651C0042E078 /* contextTriangleTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CE88B9617BA651C0042E078 /* contextTriangleTemplate.pdf */; }; 4CE88B9717BA651C0042E078 /* contextTriangleTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CE88B9617BA651C0042E078 /* contextTriangleTemplate.pdf */; };
4CEE46DD181C301D006BF1E5 /* MPAutotypeDaemon.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CEE46DC181C301D006BF1E5 /* MPAutotypeDaemon.m */; }; 4CEE46DD181C301D006BF1E5 /* MPAutotypeDaemon.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CEE46DC181C301D006BF1E5 /* MPAutotypeDaemon.m */; };
4CEED1C617D7BD0E007180F1 /* NSError+Messages.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CEED1C517D7BD0E007180F1 /* NSError+Messages.m */; }; 4CEED1C617D7BD0E007180F1 /* NSError+Messages.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CEED1C517D7BD0E007180F1 /* NSError+Messages.m */; };
4CF13A9727E0D5D800E3297A /* MPNodeTagViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF13A9527E0D5D800E3297A /* MPNodeTagViewController.m */; };
4CF13A9827E0D5D800E3297A /* MPNodeTagViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CF13A9627E0D5D800E3297A /* MPNodeTagViewController.xib */; };
4CF29BF417879D0000851B60 /* 26_FileSaveTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CF29BF317879D0000851B60 /* 26_FileSaveTemplate.pdf */; }; 4CF29BF417879D0000851B60 /* 26_FileSaveTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CF29BF317879D0000851B60 /* 26_FileSaveTemplate.pdf */; };
4CF5BE6D1BF33E3000048505 /* NSApplication+MPAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF5BE6C1BF33E3000048505 /* NSApplication+MPAdditions.m */; }; 4CF5BE6D1BF33E3000048505 /* NSApplication+MPAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF5BE6C1BF33E3000048505 /* NSApplication+MPAdditions.m */; };
4CF6653820E67A140008A25C /* PluginDataView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CF6653A20E67A140008A25C /* PluginDataView.xib */; }; 4CF6653820E67A140008A25C /* PluginDataView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4CF6653A20E67A140008A25C /* PluginDataView.xib */; };
@@ -581,6 +588,14 @@
4C4BE0C5257E9B91000AEA8C /* MPNotificationPreferencesController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPNotificationPreferencesController.h; sourceTree = "<group>"; }; 4C4BE0C5257E9B91000AEA8C /* MPNotificationPreferencesController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPNotificationPreferencesController.h; sourceTree = "<group>"; };
4C4BE0C6257E9B91000AEA8C /* MPNotificationPreferencesController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPNotificationPreferencesController.m; sourceTree = "<group>"; }; 4C4BE0C6257E9B91000AEA8C /* MPNotificationPreferencesController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPNotificationPreferencesController.m; sourceTree = "<group>"; };
4C4BE0C7257E9B91000AEA8C /* MPNotificationPreferencesController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MPNotificationPreferencesController.xib; sourceTree = "<group>"; }; 4C4BE0C7257E9B91000AEA8C /* MPNotificationPreferencesController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MPNotificationPreferencesController.xib; sourceTree = "<group>"; };
4C4F11FC27D9055300ED5495 /* AutotypeOverlay.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AutotypeOverlay.app; sourceTree = BUILT_PRODUCTS_DIR; };
4C4F11FE27D9055300ED5495 /* AOAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AOAppDelegate.h; sourceTree = "<group>"; };
4C4F11FF27D9055300ED5495 /* AOAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AOAppDelegate.m; sourceTree = "<group>"; };
4C4F120127D9055600ED5495 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
4C4F120427D9055600ED5495 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
4C4F120627D9055600ED5495 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
4C4F120827D9055600ED5495 /* AutotypeOverlay.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = AutotypeOverlay.entitlements; sourceTree = "<group>"; };
4C4F120C27D905CE00ED5495 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
4C4F72CF18DF704400E8D378 /* DDHotKeyTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; name = DDHotKeyTextField.m; path = DDHotKey/DDHotKeyTextField.m; sourceTree = "<group>"; tabWidth = 4; }; 4C4F72CF18DF704400E8D378 /* DDHotKeyTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; name = DDHotKeyTextField.m; path = DDHotKey/DDHotKeyTextField.m; sourceTree = "<group>"; tabWidth = 4; };
4C4F72D018DF704400E8D378 /* DDHotKeyTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DDHotKeyTextField.h; path = DDHotKey/DDHotKeyTextField.h; sourceTree = "<group>"; }; 4C4F72D018DF704400E8D378 /* DDHotKeyTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DDHotKeyTextField.h; path = DDHotKey/DDHotKeyTextField.h; sourceTree = "<group>"; };
4C4FCE13177CFE6B00BBF7AE /* MPCustomFieldTableCellView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCustomFieldTableCellView.h; sourceTree = "<group>"; }; 4C4FCE13177CFE6B00BBF7AE /* MPCustomFieldTableCellView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPCustomFieldTableCellView.h; sourceTree = "<group>"; };
@@ -779,6 +794,9 @@
4C9328D6273E6A85000DCBEE /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/MPTOTPViewController.strings; sourceTree = "<group>"; }; 4C9328D6273E6A85000DCBEE /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/MPTOTPViewController.strings; sourceTree = "<group>"; };
4C978E0C19AE54AB003067DF /* MPFlagsHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFlagsHelper.m; sourceTree = "<group>"; }; 4C978E0C19AE54AB003067DF /* MPFlagsHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFlagsHelper.m; sourceTree = "<group>"; };
4C97CCEF1FA727DC00E58F8C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; }; 4C97CCEF1FA727DC00E58F8C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
4C98A6C927CFAB1800CD912F /* MPNodeIconViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPNodeIconViewController.h; sourceTree = "<group>"; };
4C98A6CA27CFAB1900CD912F /* MPNodeIconViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPNodeIconViewController.m; sourceTree = "<group>"; };
4C98A6CB27CFAB1900CD912F /* MPNodeIconViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MPNodeIconViewController.xib; sourceTree = "<group>"; };
4C9BFFF91FD19B5400264B16 /* MPPrettyPasswordTransformer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPrettyPasswordTransformer.h; sourceTree = "<group>"; }; 4C9BFFF91FD19B5400264B16 /* MPPrettyPasswordTransformer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPrettyPasswordTransformer.h; sourceTree = "<group>"; };
4C9BFFFA1FD19B5400264B16 /* MPPrettyPasswordTransformer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPrettyPasswordTransformer.m; sourceTree = "<group>"; }; 4C9BFFFA1FD19B5400264B16 /* MPPrettyPasswordTransformer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPrettyPasswordTransformer.m; sourceTree = "<group>"; };
4C9FE47423703DA50096A5EA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; }; 4C9FE47423703DA50096A5EA /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
@@ -843,6 +861,8 @@
4CC663E5216F7A7100E33965 /* MPPluginRepositoryBrowserViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPluginRepositoryBrowserViewController.m; sourceTree = "<group>"; }; 4CC663E5216F7A7100E33965 /* MPPluginRepositoryBrowserViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPluginRepositoryBrowserViewController.m; sourceTree = "<group>"; };
4CC6DB7817D23719002C6091 /* KPKNode+IconImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "KPKNode+IconImage.h"; sourceTree = "<group>"; }; 4CC6DB7817D23719002C6091 /* KPKNode+IconImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "KPKNode+IconImage.h"; sourceTree = "<group>"; };
4CC6DB7917D23719002C6091 /* KPKNode+IconImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KPKNode+IconImage.m"; sourceTree = "<group>"; }; 4CC6DB7917D23719002C6091 /* KPKNode+IconImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "KPKNode+IconImage.m"; sourceTree = "<group>"; };
4CC91B6927D7E7E6001E9517 /* MPInspectorEditorView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPInspectorEditorView.h; sourceTree = "<group>"; };
4CC91B6A27D7E7E6001E9517 /* MPInspectorEditorView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPInspectorEditorView.m; sourceTree = "<group>"; };
4CCA7EEC1797866F00B0B55E /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/GeneralPreferences.strings; sourceTree = "<group>"; }; 4CCA7EEC1797866F00B0B55E /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/GeneralPreferences.strings; sourceTree = "<group>"; };
4CCA8E9A18D91ED9001A6754 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = System/Library/Frameworks/Quartz.framework; sourceTree = SDKROOT; }; 4CCA8E9A18D91ED9001A6754 /* Quartz.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quartz.framework; path = System/Library/Frameworks/Quartz.framework; sourceTree = SDKROOT; };
4CCCE7FF1D75CA48006AA951 /* MPArrayController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPArrayController.h; sourceTree = "<group>"; }; 4CCCE7FF1D75CA48006AA951 /* MPArrayController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPArrayController.h; sourceTree = "<group>"; };
@@ -909,9 +929,6 @@
4CE8246E16E2E93400573141 /* MPOverlayWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOverlayWindowController.m; sourceTree = "<group>"; }; 4CE8246E16E2E93400573141 /* MPOverlayWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOverlayWindowController.m; sourceTree = "<group>"; };
4CE8247316E2F2B900573141 /* MPOverlayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOverlayView.h; sourceTree = "<group>"; }; 4CE8247316E2F2B900573141 /* MPOverlayView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOverlayView.h; sourceTree = "<group>"; };
4CE8247416E2F2B900573141 /* MPOverlayView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOverlayView.m; sourceTree = "<group>"; }; 4CE8247416E2F2B900573141 /* MPOverlayView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOverlayView.m; sourceTree = "<group>"; };
4CE84900271E10AC00EBAB0C /* MPEntryPasswordAttributeViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPEntryPasswordAttributeViewController.h; sourceTree = "<group>"; };
4CE84901271E10AC00EBAB0C /* MPEntryPasswordAttributeViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPEntryPasswordAttributeViewController.m; sourceTree = "<group>"; };
4CE84902271E10AC00EBAB0C /* MPEntryPasswordAttributeViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MPEntryPasswordAttributeViewController.xib; sourceTree = "<group>"; };
4CE88B9617BA651C0042E078 /* contextTriangleTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = contextTriangleTemplate.pdf; sourceTree = "<group>"; }; 4CE88B9617BA651C0042E078 /* contextTriangleTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = contextTriangleTemplate.pdf; sourceTree = "<group>"; };
4CE88C2417C163FE00BFD195 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; }; 4CE88C2417C163FE00BFD195 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = System/Library/Frameworks/CoreFoundation.framework; sourceTree = SDKROOT; };
4CE88C3317C1647400BFD195 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 4CE88C3317C1647400BFD195 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
@@ -919,6 +936,9 @@
4CEE46DC181C301D006BF1E5 /* MPAutotypeDaemon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAutotypeDaemon.m; sourceTree = "<group>"; }; 4CEE46DC181C301D006BF1E5 /* MPAutotypeDaemon.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAutotypeDaemon.m; sourceTree = "<group>"; };
4CEED1C417D7BD0E007180F1 /* NSError+Messages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+Messages.h"; sourceTree = "<group>"; }; 4CEED1C417D7BD0E007180F1 /* NSError+Messages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+Messages.h"; sourceTree = "<group>"; };
4CEED1C517D7BD0E007180F1 /* NSError+Messages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSError+Messages.m"; sourceTree = "<group>"; }; 4CEED1C517D7BD0E007180F1 /* NSError+Messages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSError+Messages.m"; sourceTree = "<group>"; };
4CF13A9427E0D5D800E3297A /* MPNodeTagViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPNodeTagViewController.h; sourceTree = "<group>"; };
4CF13A9527E0D5D800E3297A /* MPNodeTagViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPNodeTagViewController.m; sourceTree = "<group>"; };
4CF13A9627E0D5D800E3297A /* MPNodeTagViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MPNodeTagViewController.xib; sourceTree = "<group>"; };
4CF14962224B623700D1CE1C /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = Base; path = Base.lproj/Credits.rtf; sourceTree = "<group>"; }; 4CF14962224B623700D1CE1C /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = Base; path = Base.lproj/Credits.rtf; sourceTree = "<group>"; };
4CF29BF317879D0000851B60 /* 26_FileSaveTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 26_FileSaveTemplate.pdf; sourceTree = "<group>"; }; 4CF29BF317879D0000851B60 /* 26_FileSaveTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 26_FileSaveTemplate.pdf; sourceTree = "<group>"; };
4CF5BE6B1BF33E3000048505 /* NSApplication+MPAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSApplication+MPAdditions.h"; sourceTree = "<group>"; }; 4CF5BE6B1BF33E3000048505 /* NSApplication+MPAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSApplication+MPAdditions.h"; sourceTree = "<group>"; };
@@ -1210,6 +1230,13 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
4C4F11F927D9055300ED5495 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
4C77E35F15B84A240093A587 /* Frameworks */ = { 4C77E35F15B84A240093A587 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -1270,6 +1297,8 @@
4CFC53BE16E94729007396BE /* MPShadowBox.m */, 4CFC53BE16E94729007396BE /* MPShadowBox.m */,
4C4A100D176286FD00BBF2CA /* MPTableView.h */, 4C4A100D176286FD00BBF2CA /* MPTableView.h */,
4C4A100E176286FD00BBF2CA /* MPTableView.m */, 4C4A100E176286FD00BBF2CA /* MPTableView.m */,
4CC91B6927D7E7E6001E9517 /* MPInspectorEditorView.h */,
4CC91B6A27D7E7E6001E9517 /* MPInspectorEditorView.m */,
); );
name = Views; name = Views;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -1509,16 +1538,33 @@
4CC0192B271836CD00459789 /* MPEntryAttributeViewController.h */, 4CC0192B271836CD00459789 /* MPEntryAttributeViewController.h */,
4CC0192C271836CD00459789 /* MPEntryAttributeViewController.m */, 4CC0192C271836CD00459789 /* MPEntryAttributeViewController.m */,
4CC0192D271836CD00459789 /* MPEntryAttributeViewController.xib */, 4CC0192D271836CD00459789 /* MPEntryAttributeViewController.xib */,
4CE84900271E10AC00EBAB0C /* MPEntryPasswordAttributeViewController.h */,
4CE84901271E10AC00EBAB0C /* MPEntryPasswordAttributeViewController.m */,
4CE84902271E10AC00EBAB0C /* MPEntryPasswordAttributeViewController.xib */,
4C59AC9A2722C12200F54B20 /* MPNodeExpirationViewController.h */, 4C59AC9A2722C12200F54B20 /* MPNodeExpirationViewController.h */,
4C59AC9B2722C12200F54B20 /* MPNodeExpirationViewController.m */, 4C59AC9B2722C12200F54B20 /* MPNodeExpirationViewController.m */,
4C59AC9C2722C12200F54B20 /* MPNodeExpirationViewController.xib */, 4C59AC9C2722C12200F54B20 /* MPNodeExpirationViewController.xib */,
4C98A6C927CFAB1800CD912F /* MPNodeIconViewController.h */,
4C98A6CA27CFAB1900CD912F /* MPNodeIconViewController.m */,
4C98A6CB27CFAB1900CD912F /* MPNodeIconViewController.xib */,
4CF13A9427E0D5D800E3297A /* MPNodeTagViewController.h */,
4CF13A9527E0D5D800E3297A /* MPNodeTagViewController.m */,
4CF13A9627E0D5D800E3297A /* MPNodeTagViewController.xib */,
); );
name = Inspector; name = Inspector;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
4C4F11FD27D9055300ED5495 /* AutotypeOverlay */ = {
isa = PBXGroup;
children = (
4C4F120C27D905CE00ED5495 /* Info.plist */,
4C4F11FE27D9055300ED5495 /* AOAppDelegate.h */,
4C4F11FF27D9055300ED5495 /* AOAppDelegate.m */,
4C4F120127D9055600ED5495 /* Assets.xcassets */,
4C4F120327D9055600ED5495 /* MainMenu.xib */,
4C4F120627D9055600ED5495 /* main.m */,
4C4F120827D9055600ED5495 /* AutotypeOverlay.entitlements */,
);
path = AutotypeOverlay;
sourceTree = "<group>";
};
4C5133861FA0C32C00C94C73 /* Accessory */ = { 4C5133861FA0C32C00C94C73 /* Accessory */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -1637,6 +1683,7 @@
4C00E33917D8FA3B00F37192 /* DDHotKey */, 4C00E33917D8FA3B00F37192 /* DDHotKey */,
4C77E36C15B84A240093A587 /* MacPass */, 4C77E36C15B84A240093A587 /* MacPass */,
4C45FB1E178E09ED0010007D /* MacPassTests */, 4C45FB1E178E09ED0010007D /* MacPassTests */,
4C4F11FD27D9055300ED5495 /* AutotypeOverlay */,
4C77E36515B84A240093A587 /* Frameworks */, 4C77E36515B84A240093A587 /* Frameworks */,
4C77E36315B84A240093A587 /* Products */, 4C77E36315B84A240093A587 /* Products */,
); );
@@ -1649,6 +1696,7 @@
children = ( children = (
4C77E36215B84A240093A587 /* MacPass.app */, 4C77E36215B84A240093A587 /* MacPass.app */,
4C45FB1A178E09ED0010007D /* MacPassTests.xctest */, 4C45FB1A178E09ED0010007D /* MacPassTests.xctest */,
4C4F11FC27D9055300ED5495 /* AutotypeOverlay.app */,
); );
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -1996,6 +2044,23 @@
productReference = 4C45FB1A178E09ED0010007D /* MacPassTests.xctest */; productReference = 4C45FB1A178E09ED0010007D /* MacPassTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test"; productType = "com.apple.product-type.bundle.unit-test";
}; };
4C4F11FB27D9055300ED5495 /* AutotypeOverlay */ = {
isa = PBXNativeTarget;
buildConfigurationList = 4C4F120B27D9055600ED5495 /* Build configuration list for PBXNativeTarget "AutotypeOverlay" */;
buildPhases = (
4C4F11F827D9055300ED5495 /* Sources */,
4C4F11F927D9055300ED5495 /* Frameworks */,
4C4F11FA27D9055300ED5495 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = AutotypeOverlay;
productName = AutotypeOverlay;
productReference = 4C4F11FC27D9055300ED5495 /* AutotypeOverlay.app */;
productType = "com.apple.product-type.application";
};
4C77E36115B84A240093A587 /* MacPass */ = { 4C77E36115B84A240093A587 /* MacPass */ = {
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 4C77E38015B84A240093A587 /* Build configuration list for PBXNativeTarget "MacPass" */; buildConfigurationList = 4C77E38015B84A240093A587 /* Build configuration list for PBXNativeTarget "MacPass" */;
@@ -2025,6 +2090,10 @@
LastUpgradeCheck = 1250; LastUpgradeCheck = 1250;
ORGANIZATIONNAME = "HicknHack Software GmbH"; ORGANIZATIONNAME = "HicknHack Software GmbH";
TargetAttributes = { TargetAttributes = {
4C4F11FB27D9055300ED5495 = {
CreatedOnToolsVersion = 13.2.1;
ProvisioningStyle = Automatic;
};
4C77E36115B84A240093A587 = { 4C77E36115B84A240093A587 = {
DevelopmentTeam = 55SM4L4Z97; DevelopmentTeam = 55SM4L4Z97;
}; };
@@ -2057,6 +2126,7 @@
targets = ( targets = (
4C77E36115B84A240093A587 /* MacPass */, 4C77E36115B84A240093A587 /* MacPass */,
4C45FB19178E09ED0010007D /* MacPassTests */, 4C45FB19178E09ED0010007D /* MacPassTests */,
4C4F11FB27D9055300ED5495 /* AutotypeOverlay */,
); );
}; };
/* End PBXProject section */ /* End PBXProject section */
@@ -2072,6 +2142,15 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
4C4F11FA27D9055300ED5495 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4C4F120227D9055600ED5495 /* Assets.xcassets in Resources */,
4C4F120527D9055600ED5495 /* MainMenu.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
4C77E36015B84A240093A587 /* Resources */ = { 4C77E36015B84A240093A587 /* Resources */ = {
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -2104,6 +2183,7 @@
4C586F9E16D07ABD00E7DB57 /* 00_PasswordTemplate.pdf in Resources */, 4C586F9E16D07ABD00E7DB57 /* 00_PasswordTemplate.pdf in Resources */,
FA13910C1F9CD9EB0033D256 /* Localizable.stringsdict in Resources */, FA13910C1F9CD9EB0033D256 /* Localizable.stringsdict in Resources */,
4C586FA016D07D7200E7DB57 /* 01_PackageNetworkTemplate.pdf in Resources */, 4C586FA016D07D7200E7DB57 /* 01_PackageNetworkTemplate.pdf in Resources */,
4C98A6CD27CFAB1900CD912F /* MPNodeIconViewController.xib in Resources */,
4CE4FFAD2746956F00789F75 /* MPGeneralDatabaseSettingsViewController.xib in Resources */, 4CE4FFAD2746956F00789F75 /* MPGeneralDatabaseSettingsViewController.xib in Resources */,
4C3826CB1AD04D8E007D7D67 /* 64_AppleTemplate.pdf in Resources */, 4C3826CB1AD04D8E007D7D67 /* 64_AppleTemplate.pdf in Resources */,
4C3826AA1AD04D8E007D7D67 /* 27_NFSUnmountTemplate.pdf in Resources */, 4C3826AA1AD04D8E007D7D67 /* 27_NFSUnmountTemplate.pdf in Resources */,
@@ -2168,11 +2248,11 @@
4C701CBC178618A000581B88 /* 12_RemoteTemplate.pdf in Resources */, 4C701CBC178618A000581B88 /* 12_RemoteTemplate.pdf in Resources */,
4CF29BF417879D0000851B60 /* 26_FileSaveTemplate.pdf in Resources */, 4CF29BF417879D0000851B60 /* 26_FileSaveTemplate.pdf in Resources */,
4C7BD07619FE94C900C7AA5C /* Assets.xcassets in Resources */, 4C7BD07619FE94C900C7AA5C /* Assets.xcassets in Resources */,
4CE84904271E10AC00EBAB0C /* MPEntryPasswordAttributeViewController.xib in Resources */,
4CA182781F96523600DD4A4A /* DuplicateEntryOptionsWindow.xib in Resources */, 4CA182781F96523600DD4A4A /* DuplicateEntryOptionsWindow.xib in Resources */,
4C52A88E1788628B00868229 /* 06_BlockDeviceTemplate.pdf in Resources */, 4C52A88E1788628B00868229 /* 06_BlockDeviceTemplate.pdf in Resources */,
4C52A88F1788628B00868229 /* 13_KeysTemplate.pdf in Resources */, 4C52A88F1788628B00868229 /* 13_KeysTemplate.pdf in Resources */,
4C3826C61AD04D8E007D7D67 /* 59_DevelopmentTemplate.pdf in Resources */, 4C3826C61AD04D8E007D7D67 /* 59_DevelopmentTemplate.pdf in Resources */,
4CF13A9827E0D5D800E3297A /* MPNodeTagViewController.xib in Resources */,
4C52A8901788628B00868229 /* 18_DisplayTemplate.pdf in Resources */, 4C52A8901788628B00868229 /* 18_DisplayTemplate.pdf in Resources */,
4C52A892178863B000868229 /* 68_PhoneTemplate.pdf in Resources */, 4C52A892178863B000868229 /* 68_PhoneTemplate.pdf in Resources */,
6021FE7718E15FF300C3BC51 /* DatePickingView.xib in Resources */, 6021FE7718E15FF300C3BC51 /* DatePickingView.xib in Resources */,
@@ -2247,6 +2327,15 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
4C4F11F827D9055300ED5495 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
4C4F120727D9055600ED5495 /* main.m in Sources */,
4C4F120027D9055300ED5495 /* AOAppDelegate.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
4C77E35E15B84A240093A587 /* Sources */ = { 4C77E35E15B84A240093A587 /* Sources */ = {
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -2257,6 +2346,7 @@
4CBA2ABA17074C07006D8139 /* MPSettingsHelper.m in Sources */, 4CBA2ABA17074C07006D8139 /* MPSettingsHelper.m in Sources */,
4C77E37A15B84A240093A587 /* MPAppDelegate.m in Sources */, 4C77E37A15B84A240093A587 /* MPAppDelegate.m in Sources */,
3C0CDED821D28BF700B2A10B /* MPTouchBarButtonCreator.m in Sources */, 3C0CDED821D28BF700B2A10B /* MPTouchBarButtonCreator.m in Sources */,
4CC91B6B27D7E7E6001E9517 /* MPInspectorEditorView.m in Sources */,
4C37A84015B8B474005EF8EE /* MPOutlineDataSource.m in Sources */, 4C37A84015B8B474005EF8EE /* MPOutlineDataSource.m in Sources */,
4CA0B2F915BCAF6700654E32 /* MPGeneralPreferencesController.m in Sources */, 4CA0B2F915BCAF6700654E32 /* MPGeneralPreferencesController.m in Sources */,
4C8F0C791FD05A6A00BE157F /* NSString+MPPrettyPasswordDisplay.m in Sources */, 4C8F0C791FD05A6A00BE157F /* NSString+MPPrettyPasswordDisplay.m in Sources */,
@@ -2313,6 +2403,7 @@
4C569DA117652BFE00595B62 /* MPEntryTableDataSource.m in Sources */, 4C569DA117652BFE00595B62 /* MPEntryTableDataSource.m in Sources */,
4CD034AA1BFE113B003C002C /* MPPlugin.m in Sources */, 4CD034AA1BFE113B003C002C /* MPPlugin.m in Sources */,
4CA2335A176DBFE100F0B6AC /* MPLockDaemon.m in Sources */, 4CA2335A176DBFE100F0B6AC /* MPLockDaemon.m in Sources */,
4CF13A9727E0D5D800E3297A /* MPNodeTagViewController.m in Sources */,
4C77C84118E240E000D1C42B /* DDHotKey+MacPassAdditions.m in Sources */, 4C77C84118E240E000D1C42B /* DDHotKey+MacPassAdditions.m in Sources */,
4C89B71019B4B4A300DC0A6A /* MPTreeDelegate.m in Sources */, 4C89B71019B4B4A300DC0A6A /* MPTreeDelegate.m in Sources */,
4C88C66918D9F8D600F43852 /* MPTemporaryFileStorageCenter.m in Sources */, 4C88C66918D9F8D600F43852 /* MPTemporaryFileStorageCenter.m in Sources */,
@@ -2368,7 +2459,6 @@
4CCEDE2A179F203B008402BE /* MPOutlineView.m in Sources */, 4CCEDE2A179F203B008402BE /* MPOutlineView.m in Sources */,
4CB33F861EAF54A000C9341E /* KPKNode+MPIsHistory.m in Sources */, 4CB33F861EAF54A000C9341E /* KPKNode+MPIsHistory.m in Sources */,
4CCEDE2E179F213B008402BE /* MPNotifications.m in Sources */, 4CCEDE2E179F213B008402BE /* MPNotifications.m in Sources */,
4CE84903271E10AC00EBAB0C /* MPEntryPasswordAttributeViewController.m in Sources */,
4C17D8E517A1C780006C8C1E /* MPDocumentWindowDelegate.m in Sources */, 4C17D8E517A1C780006C8C1E /* MPDocumentWindowDelegate.m in Sources */,
4C63B8FB17A3154D0091BD72 /* MPContextButton.m in Sources */, 4C63B8FB17A3154D0091BD72 /* MPContextButton.m in Sources */,
4C1E9885185F71A800943563 /* MPContextBarViewController.m in Sources */, 4C1E9885185F71A800943563 /* MPContextBarViewController.m in Sources */,
@@ -2396,6 +2486,7 @@
4C57AE1417BA422B00CA4F34 /* MPSegmentedContextCell.m in Sources */, 4C57AE1417BA422B00CA4F34 /* MPSegmentedContextCell.m in Sources */,
4CE2961518429AA5005F01CE /* MPAutotypeKeyPress.m in Sources */, 4CE2961518429AA5005F01CE /* MPAutotypeKeyPress.m in Sources */,
4CE4FFAC2746956F00789F75 /* MPGeneralDatabaseSettingsViewController.m in Sources */, 4CE4FFAC2746956F00789F75 /* MPGeneralDatabaseSettingsViewController.m in Sources */,
4C98A6CC27CFAB1900CD912F /* MPNodeIconViewController.m in Sources */,
4C32B0E71A1D4436007E12F1 /* KPKFormat+MPUTIDetection.m in Sources */, 4C32B0E71A1D4436007E12F1 /* KPKFormat+MPUTIDetection.m in Sources */,
4C5807781C64F67000E7171F /* NSString+MPHash.m in Sources */, 4C5807781C64F67000E7171F /* NSString+MPHash.m in Sources */,
4CAAA8271D787B8B00CDE977 /* MPAutotypeBuilderViewController.m in Sources */, 4CAAA8271D787B8B00CDE977 /* MPAutotypeBuilderViewController.m in Sources */,
@@ -2527,6 +2618,14 @@
name = InfoPlist.strings; name = InfoPlist.strings;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
4C4F120327D9055600ED5495 /* MainMenu.xib */ = {
isa = PBXVariantGroup;
children = (
4C4F120427D9055600ED5495 /* Base */,
);
name = MainMenu.xib;
sourceTree = "<group>";
};
4C6DCC471FA2457900C8AD3F /* ContextBar.xib */ = { 4C6DCC471FA2457900C8AD3F /* ContextBar.xib */ = {
isa = PBXVariantGroup; isa = PBXVariantGroup;
children = ( children = (
@@ -3122,6 +3221,97 @@
}; };
name = Release; name = Release;
}; };
4C4F120927D9055600ED5495 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = AutotypeOverlay/AutotypeOverlay.entitlements;
CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = "";
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = AutotypeOverlay/Info.plist;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 HicknHack Software GmbH. All rights reserved.";
INFOPLIST_KEY_NSMainNibFile = MainMenu;
INFOPLIST_KEY_NSPrincipalClass = NSApplication;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 11.6;
MARKETING_VERSION = 1.0;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.hicknhacksoftware.AutotypeOverlay;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_EMIT_LOC_STRINGS = YES;
};
name = Debug;
};
4C4F120A27D9055600ED5495 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = AutotypeOverlay/AutotypeOverlay.entitlements;
CODE_SIGN_IDENTITY = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = "";
ENABLE_NS_ASSERTIONS = NO;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = AutotypeOverlay/Info.plist;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2022 HicknHack Software GmbH. All rights reserved.";
INFOPLIST_KEY_NSMainNibFile = MainMenu;
INFOPLIST_KEY_NSPrincipalClass = NSApplication;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 11.6;
MARKETING_VERSION = 1.0;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.hicknhacksoftware.AutotypeOverlay;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_EMIT_LOC_STRINGS = YES;
};
name = Release;
};
4C77E37E15B84A240093A587 /* Debug */ = { 4C77E37E15B84A240093A587 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
@@ -3148,7 +3338,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = ""; CODE_SIGN_IDENTITY = "";
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 0.8; CURRENT_PROJECT_VERSION = 0.8.1;
ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES; ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
@@ -3204,7 +3394,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = ""; CODE_SIGN_IDENTITY = "";
COPY_PHASE_STRIP = YES; COPY_PHASE_STRIP = YES;
CURRENT_PROJECT_VERSION = 0.8; CURRENT_PROJECT_VERSION = 0.8.1;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
@@ -3299,6 +3489,15 @@
defaultConfigurationIsVisible = 0; defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release; defaultConfigurationName = Release;
}; };
4C4F120B27D9055600ED5495 /* Build configuration list for PBXNativeTarget "AutotypeOverlay" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4C4F120927D9055600ED5495 /* Debug */,
4C4F120A27D9055600ED5495 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
4C77E35C15B84A240093A587 /* Build configuration list for PBXProject "MacPass" */ = { 4C77E35C15B84A240093A587 /* Build configuration list for PBXProject "MacPass" */ = {
isa = XCConfigurationList; isa = XCConfigurationList;
buildConfigurations = ( buildConfigurations = (

View File

@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1320"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4C4F11FB27D9055300ED5495"
BuildableName = "AutotypeOverlay.app"
BlueprintName = "AutotypeOverlay"
ReferencedContainer = "container:MacPass.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4C4F11FB27D9055300ED5495"
BuildableName = "AutotypeOverlay.app"
BlueprintName = "AutotypeOverlay"
ReferencedContainer = "container:MacPass.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "4C4F11FB27D9055300ED5495"
BuildableName = "AutotypeOverlay.app"
BlueprintName = "AutotypeOverlay"
ReferencedContainer = "container:MacPass.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

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="17156" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="19529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17156"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19529"/>
<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 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="x9d-0h-hyJ"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="x9d-0h-hyJ">
<rect key="frame" x="38" y="321" width="236" height="32"/> <rect key="frame" x="37" y="322" width="230" 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"> <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"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
@@ -54,20 +54,20 @@
</connections> </connections>
</button> </button>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="vvZ-Lj-v22"> <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="vvZ-Lj-v22">
<rect key="frame" x="20" y="283" width="16" height="16"/> <rect key="frame" x="20" y="284" width="16" height="16"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSStatusAvailable" id="kCX-CB-5vQ"/> <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSStatusAvailable" id="kCX-CB-5vQ"/>
</imageView> </imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" verticalCompressionResistancePriority="751" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6vq-iM-inn"> <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"/> <rect key="frame" x="42" y="164" width="340" height="112"/>
<textFieldCell key="cell" controlSize="small" selectable="YES" id="7of-1z-Nfk"> <textFieldCell key="cell" controlSize="small" selectable="YES" id="7of-1z-Nfk">
<font key="font" metaFont="smallSystem"/> <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> <string key="title">MacPass will read every window title when Autotype or 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="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="IP0-CP-tlA"> <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="IP0-CP-tlA">
<rect key="frame" x="42" y="283" width="112" height="16"/> <rect key="frame" x="42" y="284" width="112" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Screen Recording" id="9gr-mz-2I4"> <textFieldCell key="cell" lineBreakMode="clipping" title="Screen Recording" id="9gr-mz-2I4">
<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"/>
@@ -75,10 +75,10 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="BHb-cd-Q0r"> <box verticalHuggingPriority="750" boxType="separator" translatesAutoresizingMaskIntoConstraints="NO" id="BHb-cd-Q0r">
<rect key="frame" x="20" y="305" width="360" height="5"/> <rect key="frame" x="20" y="306" width="360" height="5"/>
</box> </box>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="d5Z-hD-bpr"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="d5Z-hD-bpr">
<rect key="frame" x="38" y="129" width="177" height="32"/> <rect key="frame" x="37" y="117" width="172" height="32"/>
<buttonCell key="cell" type="push" title="Request Permissions…" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="1Nx-Cg-TCn"> <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"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
@@ -88,7 +88,7 @@
</connections> </connections>
</button> </button>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" preferredMaxLayoutWidth="336" translatesAutoresizingMaskIntoConstraints="NO" id="cu4-Jq-eaS"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" preferredMaxLayoutWidth="336" translatesAutoresizingMaskIntoConstraints="NO" id="cu4-Jq-eaS">
<rect key="frame" x="42" y="86" width="340" height="42"/> <rect key="frame" x="42" y="74" width="340" height="42"/>
<textFieldCell key="cell" selectable="YES" id="Mhg-rd-1hK"> <textFieldCell key="cell" selectable="YES" id="Mhg-rd-1hK">
<font key="font" metaFont="smallSystem"/> <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> <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>
@@ -97,7 +97,7 @@
</textFieldCell> </textFieldCell>
</textField> </textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="dek-ho-dPm"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="dek-ho-dPm">
<rect key="frame" x="38" y="50" width="271" height="32"/> <rect key="frame" x="37" y="39" width="266" 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"> <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"/> <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>

View File

@@ -8,7 +8,6 @@
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="MPEntryInspectorViewController"> <customObject id="-2" userLabel="File's Owner" customClass="MPEntryInspectorViewController">
<connections> <connections>
<outlet property="URLTextField" destination="56" id="262"/>
<outlet property="addAttachmentButton" destination="177" id="w3F-U0-Rpk"/> <outlet property="addAttachmentButton" destination="177" id="w3F-U0-Rpk"/>
<outlet property="addCustomFieldButton" destination="G9J-nn-2bu" id="vco-Lt-hkc"/> <outlet property="addCustomFieldButton" destination="G9J-nn-2bu" id="vco-Lt-hkc"/>
<outlet property="addWindowAssociationButton" destination="Iy9-9L-Aev" id="kDA-Mm-lah"/> <outlet property="addWindowAssociationButton" destination="Iy9-9L-Aev" id="kDA-Mm-lah"/>
@@ -18,23 +17,16 @@
<outlet property="customEntrySequenceTextField" destination="cDK-DM-F5z" id="CDU-Oq-AHP"/> <outlet property="customEntrySequenceTextField" destination="cDK-DM-F5z" id="CDU-Oq-AHP"/>
<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="fieldsStackView" destination="dx3-E2-FFt" id="GbY-9q-iEy"/> <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="infoTabControl" destination="82" id="264"/> <outlet property="infoTabControl" destination="82" id="264"/>
<outlet property="obfuscateAutotypeCheckButton" destination="I7L-Am-Qpa" id="hwa-zl-24W"/> <outlet property="obfuscateAutotypeCheckButton" destination="I7L-Am-Qpa" id="hwa-zl-24W"/>
<outlet property="passwordTextField" destination="60" id="263"/>
<outlet property="pickExpireDateButton" destination="8" id="cJg-5V-AL6"/>
<outlet property="removeWindowAssociationButton" destination="AAj-Ak-z46" id="KJD-It-16t"/> <outlet property="removeWindowAssociationButton" destination="AAj-Ak-z46" id="KJD-It-16t"/>
<outlet property="showCustomAssociationSequenceAutotypeBuilderButton" destination="m1C-m8-BKR" id="B3I-AG-TCJ"/> <outlet property="showCustomAssociationSequenceAutotypeBuilderButton" destination="m1C-m8-BKR" id="B3I-AG-TCJ"/>
<outlet property="showCustomDataButton" destination="QSX-Xo-tcH" id="bqq-Rh-GOb"/> <outlet property="showCustomDataButton" destination="QSX-Xo-tcH" id="bqq-Rh-GOb"/>
<outlet property="showCustomEntrySequenceAutotypeBuilderButton" destination="HDS-Bz-jrr" id="7u1-17-oMK"/> <outlet property="showCustomEntrySequenceAutotypeBuilderButton" destination="HDS-Bz-jrr" id="7u1-17-oMK"/>
<outlet property="tabView" destination="83" id="269"/> <outlet property="tabView" destination="83" id="269"/>
<outlet property="tagsTokenField" destination="5" id="287"/> <outlet property="tagsTokenField" destination="5" id="287"/>
<outlet property="titleTextField" destination="53" id="260"/>
<outlet property="togglePassword" destination="61" id="268"/>
<outlet property="usernameTextField" destination="55" id="261"/>
<outlet property="uuidTextField" destination="IpW-b2-jWu" id="dP6-qA-jJm"/> <outlet property="uuidTextField" destination="IpW-b2-jWu" id="dP6-qA-jJm"/>
<outlet property="view" destination="3" id="250"/> <outlet property="view" destination="3" id="250"/>
<outlet property="windowAssociationsTableView" destination="caM-L6-UHC" id="n5M-f8-z24"/> <outlet property="windowAssociationsTableView" destination="caM-L6-UHC" id="n5M-f8-z24"/>
@@ -97,7 +89,7 @@
<rect key="frame" x="20" y="26" width="233" height="396"/> <rect key="frame" x="20" y="26" width="233" 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="231" height="394"/> <rect key="frame" x="1" y="1" width="231" height="394"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<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="231" height="394"/> <rect key="frame" x="0.0" y="0.0" width="231" height="394"/>
@@ -254,15 +246,15 @@
<constraint firstItem="83" firstAttribute="trailing" secondItem="3" secondAttribute="trailing" id="86"/> <constraint firstItem="83" firstAttribute="trailing" secondItem="3" secondAttribute="trailing" id="86"/>
<constraint firstItem="82" firstAttribute="top" secondItem="3" secondAttribute="top" constant="5" id="89"/> <constraint firstItem="82" firstAttribute="top" secondItem="3" secondAttribute="top" constant="5" id="89"/>
<constraint firstAttribute="centerX" secondItem="82" secondAttribute="centerX" id="90"/> <constraint firstAttribute="centerX" secondItem="82" secondAttribute="centerX" id="90"/>
<constraint firstItem="83" firstAttribute="bottom" secondItem="3" secondAttribute="bottom" id="254"/>
<constraint firstItem="83" firstAttribute="top" secondItem="3" secondAttribute="top" constant="26" id="279"/> <constraint firstItem="83" firstAttribute="top" secondItem="3" secondAttribute="top" constant="26" id="279"/>
<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 firstAttribute="bottom" secondItem="83" secondAttribute="bottom" id="Lc3-ap-AJQ"/>
<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="-680" y="-1408"/> <point key="canvasLocation" x="-239" y="-1954"/>
</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="484"/> <rect key="frame" x="0.0" y="0.0" width="291" height="840"/>
<subviews> <subviews>
<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="77" width="32" height="14"/> <rect key="frame" x="18" y="77" width="32" height="14"/>
@@ -291,7 +283,6 @@
</buttonCell> </buttonCell>
<connections> <connections>
<action selector="showPluginData:" target="-1" id="yGe-GL-mcW"/> <action selector="showPluginData:" target="-1" id="yGe-GL-mcW"/>
<outlet property="nextKeyView" destination="53" id="HTB-dl-8aH"/>
</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">
@@ -309,162 +300,8 @@
</connections> </connections>
</segmentedControl> </segmentedControl>
<stackView distribution="fill" orientation="vertical" alignment="leading" horizontalStackHuggingPriority="250" verticalStackHuggingPriority="250" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="dx3-E2-FFt"> <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"/> <rect key="frame" x="20" y="721" width="251" height="99"/>
<subviews> <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" scrollable="YES" lineBreakMode="clipping" truncatesLastVisibleLine="YES" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="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" scrollable="YES" lineBreakMode="clipping" truncatesLastVisibleLine="YES" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="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" contentType="oneTimeCode" translatesAutoresizingMaskIntoConstraints="NO" id="60" customClass="HNHUISecureTextField">
<rect key="frame" x="0.0" y="0.0" width="123" height="20"/>
<secureTextFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" truncatesLastVisibleLine="YES" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="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="124" y="-7" width="50" height="32"/>
<buttonCell key="cell" type="push" bezelStyle="rounded" image="NSQuickLookTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="62">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES" changeBackground="YES" changeGray="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="168" y="-7" width="90" height="32"/>
<buttonCell key="cell" type="push" title="Generate" bezelStyle="rounded" 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" scrollable="YES" lineBreakMode="clipping" truncatesLastVisibleLine="YES" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="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"> <textField horizontalHuggingPriority="249" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6">
<rect key="frame" x="-2" y="85" width="255" height="14"/> <rect key="frame" x="-2" y="85" width="255" height="14"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Tags" id="79"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Tags" id="79">
@@ -491,28 +328,10 @@
<visibilityPriorities> <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"/>
<integer value="1000"/>
<integer value="1000"/>
</visibilityPriorities> </visibilityPriorities>
<customSpacing> <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"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing> </customSpacing>
</stackView> </stackView>
</subviews> </subviews>
@@ -533,7 +352,7 @@
<constraint firstItem="dx3-E2-FFt" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="sjr-Xo-zxh"/> <constraint firstItem="dx3-E2-FFt" firstAttribute="leading" secondItem="4" secondAttribute="leading" constant="20" symbolic="YES" id="sjr-Xo-zxh"/>
<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="-310" y="-1413"/> <point key="canvasLocation" x="91" y="-1780"/>
</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"/>
@@ -589,7 +408,7 @@
<rect key="frame" x="20" y="136" width="261" height="163"/> <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="161"/> <rect key="frame" x="1" y="1" width="259" height="161"/>
<autoresizingMask key="autoresizingMask"/> <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="161"/> <rect key="frame" x="0.0" y="0.0" width="259" height="161"/>
@@ -764,13 +583,13 @@
<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="145.5" y="-1275"/> <point key="canvasLocation" x="418" y="-1988"/>
</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="290" height="268"/> <rect key="frame" x="0.0" y="0.0" width="290" 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="288" height="266"/> <rect key="frame" x="1" y="1" width="288" height="266"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<tableView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" tableStyle="fullWidth" selectionHighlightStyle="none" columnSelection="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="54" viewBased="YES" id="193"> <tableView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" tableStyle="fullWidth" 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="288" height="266"/> <rect key="frame" x="0.0" y="0.0" width="288" height="266"/>
@@ -792,7 +611,7 @@
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/> <tableColumnResizingMask key="resizingMask" resizeWithTable="YES"/>
<prototypeCellViews> <prototypeCellViews>
<tableCellView identifier="SelectedCell" translatesAutoresizingMaskIntoConstraints="NO" id="196" customClass="MPCustomFieldTableCellView"> <tableCellView identifier="SelectedCell" translatesAutoresizingMaskIntoConstraints="NO" id="196" customClass="MPCustomFieldTableCellView">
<rect key="frame" x="0.0" y="0.0" width="227" height="53"/> <rect key="frame" x="1" y="1" width="227" height="53"/>
<subviews> <subviews>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" contentType="oneTimeCode" translatesAutoresizingMaskIntoConstraints="NO" id="199" customClass="HNHUISecureTextField"> <textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" contentType="oneTimeCode" translatesAutoresizingMaskIntoConstraints="NO" id="199" customClass="HNHUISecureTextField">
<rect key="frame" x="3" y="10" width="114" height="21"/> <rect key="frame" x="3" y="10" width="114" height="21"/>
@@ -878,7 +697,6 @@
<image name="NSActionTemplate" width="15" height="15"/> <image name="NSActionTemplate" width="15" height="15"/>
<image name="NSAddTemplate" width="14" height="13"/> <image name="NSAddTemplate" width="14" height="13"/>
<image name="NSLockLockedTemplate" width="14" height="15"/> <image name="NSLockLockedTemplate" width="14" height="15"/>
<image name="NSQuickLookTemplate" width="21" height="13"/>
<image name="NSRemoveTemplate" width="14" height="4"/> <image name="NSRemoveTemplate" width="14" height="4"/>
</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="19455" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="19529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19455"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19529"/>
<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

@@ -27,8 +27,11 @@
#import "MPIconHelper.h" #import "MPIconHelper.h"
@interface NSImage (MPTintedImage) @interface NSImage (MPTintedImage)
@end @end
@implementation NSImage (MPTintedImage) @implementation NSImage (MPTintedImage)
- (NSImage *)imageWithTintColor:(NSColor *)tintColor { - (NSImage *)imageWithTintColor:(NSColor *)tintColor {
/* only tint templated images! */ /* only tint templated images! */
if(NO == self.template) { if(NO == self.template) {
@@ -42,6 +45,7 @@
image.template = NO; image.template = NO;
return image; return image;
} }
@end @end
@implementation KPKNode (IconImage) @implementation KPKNode (IconImage)

View File

@@ -147,6 +147,11 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
[self addWindowController:windowController]; [self addWindowController:windowController];
} }
- (void)canCloseDocumentWithDelegate:(id)delegate shouldCloseSelector:(nullable SEL)shouldCloseSelector contextInfo:(nullable void *)contextInfo {
[super canCloseDocumentWithDelegate:delegate shouldCloseSelector:shouldCloseSelector contextInfo:contextInfo];
}
- (BOOL)canAsynchronouslyWriteToURL:(NSURL *)url ofType:(NSString *)typeName forSaveOperation:(NSSaveOperationType)saveOperation { - (BOOL)canAsynchronouslyWriteToURL:(NSURL *)url ofType:(NSString *)typeName forSaveOperation:(NSSaveOperationType)saveOperation {
return YES; return YES;
} }

View File

@@ -106,4 +106,24 @@
[NSUserDefaults.standardUserDefaults setBool:!inspector.collapsed forKey:kMPSettingsKeyShowInspector]; [NSUserDefaults.standardUserDefaults setBool:!inspector.collapsed forKey:kMPSettingsKeyShowInspector];
} }
- (id)supplementalTargetForAction:(SEL)action sender:(id)sender {
// NSLog(@"Looking for target for action:%@", NSStringFromSelector(action));
for(NSViewController *childViewController in self.childViewControllers) {
if([childViewController respondsToSelector:action]) {
// NSLog(@"Found target:%@ for action:%@", childViewController, NSStringFromSelector(action));
return childViewController;
}
else {
id target = [childViewController supplementalTargetForAction:action sender:sender];
if(!target) {
// NSLog(@"No target for action:%@", NSStringFromSelector(action));
continue;
}
// NSLog(@"Found supplemental target:%@ for action:%@", target, NSStringFromSelector(action));
return target;
}
}
return [super supplementalTargetForAction:action sender:sender];
}
@end @end

View File

@@ -64,19 +64,10 @@
- (IBAction)delete:(id)sender; - (IBAction)delete:(id)sender;
- (IBAction)duplicateEntryWithOptions:(id)sender; - (IBAction)duplicateEntryWithOptions:(id)sender;
- (IBAction)pickExpiryDate:(id)sender;
- (IBAction)performAutotypeForEntry:(id)sender; - (IBAction)performAutotypeForEntry:(id)sender;
- (IBAction)showGroupInOutline:(id)sender; - (IBAction)showGroupInOutline:(id)sender;
/* actions relayed to MPEntryViewController */
- (IBAction)copyUsername:(id)sender;
- (IBAction)copyPassword:(id)sender;
- (IBAction)copyCustomAttribute:(id)sender;
- (IBAction)copyAsReference:(id)sender;
- (IBAction)copyURL:(id)sender;
- (IBAction)openURL:(id)sender;
#pragma mark Helper #pragma mark Helper
- (IBAction)fixAutotype:(id)sender; - (IBAction)fixAutotype:(id)sender;

View File

@@ -441,16 +441,6 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
}]; }];
} }
- (void)pickExpiryDate:(id)sender {
// FIXME: use propert responder chain
[self.splitViewController.inspectorViewController pickExpiryDate:sender];
}
- (void)showPluginData:(id)sender {
// FIXME: use propert responder chain
[self.splitViewController.inspectorViewController showPluginData:sender];
}
- (void)toggleInspector:(id)sender { - (void)toggleInspector:(id)sender {
[self.splitViewController toggleInspector:sender]; [self.splitViewController toggleInspector:sender];
} }
@@ -497,32 +487,6 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
[self.splitViewController.outlineViewController selectGroup:targetEntries.lastObject.parent]; [self.splitViewController.outlineViewController selectGroup:targetEntries.lastObject.parent];
} }
#pragma mark -
#pragma mark Actions forwarded to MPEntryViewController
- (void)copyUsername:(id)sender {
[self.splitViewController.entryViewController copyUsername:sender];
}
- (void)copyPassword:(id)sender {
[self.splitViewController.entryViewController copyPassword:sender];
}
- (void)copyCustomAttribute:(id)sender {
[self.splitViewController.entryViewController copyCustomAttribute:sender];
}
- (void)copyAsReference:(id)sender {
[self.splitViewController.entryViewController copyAsReference:sender];
}
- (void)copyURL:(id)sender {
[self.splitViewController.entryViewController copyURL:sender];
}
- (void)openURL:(id)sender {
[self.splitViewController.entryViewController openURL:sender];
}
#pragma mark Validation #pragma mark Validation
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem { - (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
return ([self.document validateMenuItem:menuItem]); return ([self.document validateMenuItem:menuItem]);

View File

@@ -17,16 +17,18 @@ NS_ASSUME_NONNULL_BEGIN
/// View controller to show and edit KPKAttributes of KPKEntries. /// View controller to show and edit KPKAttributes of KPKEntries.
/// Set the represented object to the KPKAttribute the editor shoudl show/edit /// Set the represented object to the KPKAttribute the editor shoudl show/edit
/// The editor can be set to edit or view /// The editor can be set to edit or view
@interface MPEntryAttributeViewController : NSViewController <MPInspectorEditor, HNHUITextFieldDelegate> @interface MPEntryAttributeViewController : NSViewController <MPAttributeInspectorEditor, HNHUITextFieldDelegate>
@property (strong) IBOutlet NSTextField *keyTextField; @property (strong) IBOutlet NSTextField *keyTextField;
@property (strong) IBOutlet HNHUISecureTextField *valueTextField; @property (strong) IBOutlet HNHUISecureTextField *valueTextField;
@property (strong) IBOutlet NSButton *generatePasswordButton;
@property (strong) IBOutlet NSButton *toggleProtectedButton; @property (strong) IBOutlet NSButton *toggleProtectedButton;
@property (strong) IBOutlet NSButton *removeButton; @property (strong) IBOutlet NSButton *removeButton;
@property (strong) IBOutlet NSButton *actionButton;
@property SEL attributeSelector; // set this if the editor is bound to a default attributes
- (void)updateValues; - (void)updateValuesAndEditing;
- (void)updateEditing; - (void)performCopyForText:(NSString *)text;
@end @end

View File

@@ -10,11 +10,25 @@
#import <HNHUi/HNHUi.h> #import <HNHUi/HNHUi.h>
#import <KeePassKit/KeePassKit.h> #import <KeePassKit/KeePassKit.h>
#import "MPPasteBoardController.h" #import "MPPasteBoardController.h"
#import "MPInspectorEditorView.h"
@interface MPEntryAttributeViewController () { NSString *nameForDefaultKey(NSString *key) {
BOOL _isDefaultAttribute; static NSDictionary *mapping;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
mapping = @{ kKPKTitleKey: NSLocalizedString(@"TITTLE_ATTRIBUTE_KEY", @"Localized name for title attribute"),
kKPKUsernameKey: NSLocalizedString(@"USERNAME_ATTRIBUTE_KEY", @"Localized name for username attribute"),
kKPKPasswordKey: NSLocalizedString(@"PASSWORD_ATTRIBUTE_KEY", @"Localized name for password attribute"),
kKPKURLKey: NSLocalizedString(@"URL_ATTRIBUTE_KEY", @"Localized name for URL attribute") };
});
return mapping[key];
} }
@property (readonly, nullable, strong) KPKAttribute *representedAttribute;
@interface MPEntryAttributeViewController ()
@property (nonatomic, readonly, getter=isDefaultAttributeEditor) BOOL defaultAttributeEditor;
@property (nonatomic, readonly, getter=isPasswordAttributeEditor) BOOL passwordAttributeEditor;
@end @end
@@ -26,37 +40,71 @@
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if(self) { if(self) {
_isEditor = NO; _isEditor = NO;
_isDefaultAttribute = NO;
} }
return self; return self;
} }
- (instancetype)initWithCoder:(NSCoder *)coder { - (instancetype)initWithCoder:(NSCoder *)coder {
self = [super initWithCoder:coder]; self = [super initWithCoder:coder];
// set editor to false? if(self) {
_isEditor = NO;
NSString *selectorString = [coder decodeObjectOfClass:NSString.class forKey:NSStringFromSelector(@selector(attributeSelector))];
if(selectorString) {
self.attributeSelector = NSSelectorFromString(selectorString);
}
}
return self; return self;
} }
- (void)encodeWithCoder:(NSCoder *)coder {
[super encodeWithCoder:coder];
// editor state will be set to NO after decoding
[coder encodeObject:NSStringFromSelector(self.attributeSelector) forKey:NSStringFromSelector(@selector(attributeSelector))];
}
- (void)viewDidLoad { - (void)viewDidLoad {
[super viewDidLoad]; [super viewDidLoad];
NSString *placeHolder = NSLocalizedString(@"NONE", "Placeholder text for input fields if no entry or group is selected");
self.keyTextField.placeholderString = placeHolder; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didEnterMouse:) name:MPInspectorEditorViewMouseEnteredNotification object:self.view];
self.valueTextField.placeholderString = placeHolder; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didExitMouse:) name:MPInspectorEditorViewMouseExitedNotification object:self.view];
self.toggleProtectedButton.action = @selector(toggleDisplay:); self.toggleProtectedButton.action = @selector(toggleDisplay:);
self.toggleProtectedButton.target = self.valueTextField; self.toggleProtectedButton.target = self.valueTextField;
[self updateValues]; self.actionButton.action = @selector(_copyText:);
[self updateEditing]; self.actionButton.target = self;
self.actionButton.hidden = YES;
self.actionButton.title = NSLocalizedString(@"COPY", "Button title for copying an attribute value");
__weak MPEntryAttributeViewController *welf = self; NSDictionary *bindingOptions = @{ NSNullPlaceholderBindingOption : NSLocalizedString(@"NONE", "Placeholder text for input fields if no entry or group is selected"),
self.valueTextField.buttonTitle = NSLocalizedString(@"COPY", "Button to copy the value of an Attribute"); NSConditionallySetsHiddenBindingOption : @(NO),
self.valueTextField.buttonActionBlock = ^void(NSTextField *tf) { NSConditionallySetsEnabledBindingOption : @(NO),
NSText *text = [welf.view.window fieldEditor:NO forObject:welf.valueTextField]; NSConditionallySetsEditableBindingOption : @(NO) };
if([text isKindOfClass:NSTextView.class]) {
[welf textField:welf.valueTextField textView:(NSTextView *)text performAction:@selector(copy:)];
NSString *valueKeyPath = [NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(value))];
if(self.isDefaultAttributeEditor) {
valueKeyPath = [NSString stringWithFormat:@"%@.%@.%@", NSStringFromSelector(@selector(representedObject)),NSStringFromSelector(@selector(entry)), NSStringFromSelector(self.attributeSelector)];
} }
}; [self.valueTextField bind:NSValueBinding
toObject:self
withKeyPath:valueKeyPath
options:bindingOptions];
if(!self.isDefaultAttributeEditor) {
NSString *keyKeyPath = [NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(key))];
[self.keyTextField bind:NSValueBinding
toObject:self
withKeyPath:keyKeyPath
options:bindingOptions];
}
if(self.isPasswordAttributeEditor) {
self.toggleProtectedButton.image = [NSImage imageNamed:NSImageNameQuickLookTemplate];
NSFont *font = [NSFont fontWithName:@"Menlo-Regular" size:13.0];
self.valueTextField.font = font;
// TODO: setup pretty password value transformer
}
[self updateValuesAndEditing];
} }
- (KPKAttribute *)representedAttribute { - (KPKAttribute *)representedAttribute {
@@ -66,30 +114,50 @@
return nil; return nil;
} }
- (BOOL)isDefaultAttributeEditor {
return (self.attributeSelector != NULL);
}
- (BOOL)isPasswordAttributeEditor {
return self.attributeSelector == @selector(password);
}
- (void)setIsEditor:(BOOL)isEditor { - (void)setIsEditor:(BOOL)isEditor {
_isEditor = isEditor; _isEditor = isEditor;
[self updateEditing]; [self updateValuesAndEditing];
} }
- (void)setRepresentedObject:(id)representedObject { - (void)setRepresentedObject:(id)representedObject {
if(self.representedAttribute) { if(self.representedAttribute) {
[NSNotificationCenter.defaultCenter removeObserver:self name:KPKWillChangeAttributeNotification object:self.representedObject]; [NSNotificationCenter.defaultCenter removeObserver:self
[NSNotificationCenter.defaultCenter removeObserver:self name:KPKDidChangeAttributeNotification object:self.representedObject]; name:KPKDidChangeAttributeNotification
object:self.representedObject];
} }
super.representedObject = representedObject; super.representedObject = representedObject;
if(self.representedAttribute) { if(self.representedAttribute) {
[NSNotificationCenter.defaultCenter addObserver:self
selector:(@selector(_willChangeAttribute:))
name:KPKWillChangeAttributeNotification
object:self.representedAttribute];
[NSNotificationCenter.defaultCenter addObserver:self [NSNotificationCenter.defaultCenter addObserver:self
selector:(@selector(_didChangeAttribute:)) selector:(@selector(_didChangeAttribute:))
name:KPKDidChangeAttributeNotification name:KPKDidChangeAttributeNotification
object:self.representedAttribute]; object:self.representedAttribute];
} }
_isDefaultAttribute = self.representedAttribute.isDefault; // bind with read-only setup and value transformer for names?
[self updateValues]; if(self.isDefaultAttributeEditor) {
[self.keyTextField unbind:NSValueBinding];
NSString *localizedKey = nameForDefaultKey(self.representedAttribute.key);
if(localizedKey) {
self.keyTextField.stringValue = localizedKey;
}
else {
self.keyTextField.stringValue = self.representedAttribute.key ? self.representedAttribute.key : @"";
}
}
[self updateValuesAndEditing];
}
- (void)_copyText:(id)sender {
[self performCopyForText:self.valueTextField.stringValue];
} }
- (BOOL)textField:(NSTextField *)textField textView:(NSTextView *)textView performAction:(SEL)action { - (BOOL)textField:(NSTextField *)textField textView:(NSTextView *)textView performAction:(SEL)action {
@@ -98,7 +166,7 @@
} }
// Only copy action // Only copy action
MPPasteboardOverlayInfoType info = MPPasteboardOverlayInfoCustom;
NSMutableString *selectedValue = [[NSMutableString alloc] init]; NSMutableString *selectedValue = [[NSMutableString alloc] init];
for(NSValue *rangeValue in textView.selectedRanges) { for(NSValue *rangeValue in textView.selectedRanges) {
[selectedValue appendString:[textView.string substringWithRange:rangeValue.rangeValue]]; [selectedValue appendString:[textView.string substringWithRange:rangeValue.rangeValue]];
@@ -106,14 +174,21 @@
if(selectedValue.length == 0) { if(selectedValue.length == 0) {
[selectedValue setString:textField.stringValue]; [selectedValue setString:textField.stringValue];
} }
[self performCopyForText:selectedValue];
return NO;
}
- (void)performCopyForText:(NSString *)text {
MPPasteboardOverlayInfoType info = MPPasteboardOverlayInfoCustom;
NSString *name = @""; NSString *name = @"";
if([self.representedAttribute.key isEqual:kKPKUsernameKey]) { if([self.representedAttribute.key isEqual:kKPKUsernameKey]) {
info = MPPasteboardOverlayInfoUsername; info = MPPasteboardOverlayInfoUsername;
} }
/*else if([self.representedAttribute.key isEqual:kKPKPasswordKey]) { else if([self.representedAttribute.key isEqual:kKPKPasswordKey]) {
info = MPPasteboardOverlayInfoPassword; info = MPPasteboardOverlayInfoPassword;
} }
*/
else if([self.representedAttribute.key isEqual:kKPKURLKey]) { else if([self.representedAttribute.key isEqual:kKPKURLKey]) {
info = MPPasteboardOverlayInfoURL; info = MPPasteboardOverlayInfoURL;
} }
@@ -123,33 +198,55 @@
else { else {
name = self.representedAttribute.key; name = self.representedAttribute.key;
} }
[MPPasteBoardController.defaultController copyObject:selectedValue overlayInfo:info name:name atView:self.view]; [MPPasteBoardController.defaultController copyObject:text overlayInfo:info name:name atView:self.view];
return NO;
}
- (void)_willChangeAttribute:(NSNotification *)notification {
// nothing to d
} }
- (void)_didChangeAttribute:(NSNotification *)notification { - (void)_didChangeAttribute:(NSNotification *)notification {
[self updateValues]; [self updateValuesAndEditing];
} }
- (void)updateValues { - (void)updateValuesAndEditing {
self.view.hidden = (!self.isEditor && self.representedAttribute.value.length == 0); // values
self.keyTextField.stringValue = self.representedAttribute.key ? self.representedAttribute.key : @""; self.view.hidden = self.isEditor ? NO : self.representedAttribute.value.length == 0;
self.valueTextField.stringValue = self.representedAttribute.value ? self.representedAttribute.value : @"";
self.valueTextField.showPassword = !self.representedAttribute.protect; self.valueTextField.showPassword = !self.representedAttribute.protect;
}
- (void)updateEditing { // editor
self.keyTextField.editable = !_isDefaultAttribute && self.isEditor; self.keyTextField.editable = !self.isDefaultAttributeEditor && self.isEditor;
self.valueTextField.editable = self.isEditor; self.valueTextField.editable = self.isEditor;
self.keyTextField.selectable = YES; self.keyTextField.selectable = YES;
self.valueTextField.selectable = YES; self.valueTextField.selectable = YES;
self.toggleProtectedButton.hidden = _isDefaultAttribute; self.toggleProtectedButton.hidden = self.isDefaultAttributeEditor ? !self.isPasswordAttributeEditor : NO;
self.removeButton.hidden = !self.isEditor || (self.isEditor && !_isDefaultAttribute); self.generatePasswordButton.hidden = self.isEditor ? !self.isPasswordAttributeEditor : YES;
self.removeButton.hidden = !self.isEditor ? YES : self.isDefaultAttributeEditor;
// set draws background first, since bezeld might have side effects
self.valueTextField.drawsBackground = self.isEditor;
self.valueTextField.bordered = self.isEditor;
self.valueTextField.bezeled = self.isEditor;
}
- (void)_didEnterMouse:(NSNotification *)notification {
self.actionButton.hidden = self.isEditor;
}
- (void)_didExitMouse:(NSNotification *)notification {
self.actionButton.hidden = YES;
}
- (void)objectDidBeginEditing:(id<NSEditor>)editor {
[self.view.window.windowController.document objectDidBeginEditing:editor];
[super objectDidBeginEditing:editor];
}
- (void)objectDidEndEditing:(id<NSEditor>)editor {
[self.view.window.windowController.document objectDidEndEditing:editor];
[super objectDidEndEditing:editor];
}
- (void)commitEditingWithDelegate:(nullable id)delegate didCommitSelector:(nullable SEL)didCommitSelector contextInfo:(nullable void *)contextInfo {
[super commitEditingWithDelegate:delegate didCommitSelector:didCommitSelector contextInfo:contextInfo];
} }
@end @end

View File

@@ -1,13 +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="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="19529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19529"/>
<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="MPEntryAttributeViewController"> <customObject id="-2" userLabel="File's Owner" customClass="MPEntryAttributeViewController">
<connections> <connections>
<outlet property="actionButton" destination="gab-tS-gBb" id="gvk-hn-Erc"/>
<outlet property="generatePasswordButton" destination="5gR-99-IVJ" id="SFB-s9-2CX"/>
<outlet property="keyTextField" destination="m8q-FN-S8D" id="HzJ-cd-ifA"/> <outlet property="keyTextField" destination="m8q-FN-S8D" id="HzJ-cd-ifA"/>
<outlet property="removeButton" destination="Nmx-gC-8rG" id="eRy-l0-u0E"/> <outlet property="removeButton" destination="Nmx-gC-8rG" id="eRy-l0-u0E"/>
<outlet property="toggleProtectedButton" destination="hAk-oD-dCj" id="js9-Hx-ycS"/> <outlet property="toggleProtectedButton" destination="hAk-oD-dCj" id="js9-Hx-ycS"/>
@@ -17,27 +19,27 @@
</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 id="Hz6-mo-xeY"> <customView id="Hz6-mo-xeY" customClass="MPInspectorEditorView">
<rect key="frame" x="0.0" y="0.0" width="251" height="43"/> <rect key="frame" x="0.0" y="0.0" width="436" height="50"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews> <subviews>
<stackView distribution="fill" orientation="vertical" alignment="leading" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="No7-P9-4cl"> <stackView distribution="fill" orientation="vertical" alignment="leading" spacing="2" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="No7-P9-4cl">
<rect key="frame" x="0.0" y="0.0" width="251" height="43"/> <rect key="frame" x="0.0" y="0.0" width="436" height="50"/>
<subviews> <subviews>
<textField horizontalHuggingPriority="249" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="m8q-FN-S8D"> <textField horizontalHuggingPriority="249" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="m8q-FN-S8D">
<rect key="frame" x="-2" y="29" width="255" height="14"/> <rect key="frame" x="-2" y="36" width="440" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="AttributeName" id="MQc-TE-UjE"> <textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="AttributeName" id="MQc-TE-UjE">
<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>
<stackView distribution="fill" orientation="horizontal" alignment="top" spacing="5" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="LBt-0e-cUK"> <stackView distribution="fill" orientation="horizontal" alignment="centerY" spacing="5" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="LBt-0e-cUK">
<rect key="frame" x="0.0" y="0.0" width="251" height="21"/> <rect key="frame" x="0.0" y="0.0" width="436" height="34"/>
<subviews> <subviews>
<textField horizontalHuggingPriority="249" verticalHuggingPriority="750" horizontalCompressionResistancePriority="249" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="HZM-H4-dB4" customClass="HNHUISecureTextField"> <textField horizontalHuggingPriority="249" verticalHuggingPriority="750" horizontalCompressionResistancePriority="249" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="HZM-H4-dB4" customClass="HNHUISecureTextField">
<rect key="frame" x="0.0" y="0.0" width="181" height="21"/> <rect key="frame" x="0.0" y="7" width="236" height="21"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" truncatesLastVisibleLine="YES" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" usesSingleLineMode="YES" id="sO3-xr-VwO"> <textFieldCell key="cell" lineBreakMode="truncatingTail" truncatesLastVisibleLine="YES" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" usesSingleLineMode="YES" id="sO3-xr-VwO" 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"/>
@@ -47,29 +49,50 @@
</connections> </connections>
</textField> </textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="hAk-oD-dCj"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="hAk-oD-dCj">
<rect key="frame" x="179" y="-6" width="44" height="32"/> <rect key="frame" x="234" y="0.0" width="44" height="32"/>
<buttonCell key="cell" type="push" bezelStyle="rounded" image="NSLockLockedTemplate" imagePosition="only" alignment="center" alternateImage="NSLockUnlockedTemplate" lineBreakMode="truncatingTail" borderStyle="border" inset="2" id="f80-K9-DO7"> <buttonCell key="cell" type="push" bezelStyle="rounded" image="NSLockLockedTemplate" imagePosition="only" alignment="center" alternateImage="NSLockUnlockedTemplate" lineBreakMode="truncatingTail" borderStyle="border" inset="2" id="f80-K9-DO7">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES" changeBackground="YES" changeGray="YES"/> <behavior key="behavior" lightByBackground="YES" lightByGray="YES" changeBackground="YES" changeGray="YES"/>
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
</buttonCell> </buttonCell>
</button> </button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Nmx-gC-8rG"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Nmx-gC-8rG">
<rect key="frame" x="214" y="-6" width="44" height="32"/> <rect key="frame" x="269" y="0.0" width="44" height="32"/>
<buttonCell key="cell" type="push" bezelStyle="rounded" image="NSRemoveTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="179-uk-89S"> <buttonCell key="cell" type="push" bezelStyle="rounded" image="NSRemoveTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="179-uk-89S">
<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="5gR-99-IVJ">
<rect key="frame" x="304" y="0.0" width="90" height="32"/>
<buttonCell key="cell" type="push" title="Generate" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="IwJ-ml-b4v">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="showPasswordGenerator:" target="-1" id="L0a-eV-dW3"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gab-tS-gBb">
<rect key="frame" x="386" y="2" width="56" height="27"/>
<buttonCell key="cell" type="push" title="Copy" bezelStyle="rounded" alignment="center" controlSize="small" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="0GH-rx-Fg4">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="smallSystem"/>
</buttonCell>
</button>
</subviews> </subviews>
<visibilityPriorities> <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"/>
</visibilityPriorities> </visibilityPriorities>
<customSpacing> <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"/>
</customSpacing> </customSpacing>
</stackView> </stackView>
</subviews> </subviews>
@@ -89,7 +112,7 @@
<constraint firstAttribute="bottom" secondItem="No7-P9-4cl" secondAttribute="bottom" id="MX2-as-4EI"/> <constraint firstAttribute="bottom" secondItem="No7-P9-4cl" secondAttribute="bottom" id="MX2-as-4EI"/>
<constraint firstItem="No7-P9-4cl" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" id="mbE-gq-jDF"/> <constraint firstItem="No7-P9-4cl" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" id="mbE-gq-jDF"/>
</constraints> </constraints>
<point key="canvasLocation" x="-434.5" y="134"/> <point key="canvasLocation" x="-527" y="134"/>
</customView> </customView>
</objects> </objects>
<resources> <resources>

View File

@@ -36,14 +36,7 @@
@property (weak) IBOutlet NSTabView *tabView; @property (weak) IBOutlet NSTabView *tabView;
@property (strong) IBOutlet NSView *generalView; @property (strong) IBOutlet NSView *generalView;
@property (weak) IBOutlet NSTextField *titleTextField; //@property (weak) IBOutlet NSTextField *titleTextField;
@property (weak) IBOutlet NSTextField *usernameTextField;
@property (weak) IBOutlet NSTextField *URLTextField;
@property (weak) IBOutlet HNHUISecureTextField *passwordTextField;
@property (weak) IBOutlet NSButton *generatePasswordButton;
@property (weak) IBOutlet NSButton *togglePassword;
@property (weak) IBOutlet NSButton *pickExpireDateButton;
@property (weak) IBOutlet NSButton *expiresCheckButton;
@property (weak) IBOutlet NSTokenField *tagsTokenField; @property (weak) IBOutlet NSTokenField *tagsTokenField;
@property (weak) IBOutlet NSTextField *uuidTextField; @property (weak) IBOutlet NSTextField *uuidTextField;
@@ -99,4 +92,6 @@
- (IBAction)toggleQuicklookPreview:(id)sender; - (IBAction)toggleQuicklookPreview:(id)sender;
- (IBAction)toggleExpire:(NSButton*)sender; - (IBAction)toggleExpire:(NSButton*)sender;
- (IBAction)toggleEdit:(id)sender;
@end @end

View File

@@ -35,6 +35,7 @@
#import "MPTOTPSetupViewController.h" #import "MPTOTPSetupViewController.h"
#import "MPEntryAttributeViewController.h" #import "MPEntryAttributeViewController.h"
#import "MPNodeExpirationViewController.h" #import "MPNodeExpirationViewController.h"
#import "MPNodeIconViewController.h"
#import "MPPrettyPasswordTransformer.h" #import "MPPrettyPasswordTransformer.h"
#import "NSString+MPPasswordCreation.h" #import "NSString+MPPasswordCreation.h"
@@ -61,18 +62,6 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
MPEntryTabAutotype MPEntryTabAutotype
}; };
typedef NS_ENUM(NSUInteger, MPInpspectorEditorIndex) {
MPInpspectorEditorIndexImageEditor,
MPInpspectorEditorIndexTitle,
MPInpspectorEditorIndexUsername,
MPInpspectorEditorIndexPassword,
MPInpspectorEditorIndexURL,
MPInpspectorEditorIndexExpires,
MPInpspectorEditorIndexTags,
MPInpspectorEditorIndexDefaultCount
};
@interface NSObject (MPAppKitPrivateAPI) @interface NSObject (MPAppKitPrivateAPI)
- (void)_searchWithGoogleFromMenu:(id)obj; - (void)_searchWithGoogleFromMenu:(id)obj;
@end @end
@@ -89,13 +78,21 @@ typedef NS_ENUM(NSUInteger, MPInpspectorEditorIndex) {
MPWindowTitleComboBoxDelegate *_windowTitleMenuDelegate; MPWindowTitleComboBoxDelegate *_windowTitleMenuDelegate;
MPTagsTokenFieldDelegate *_tagTokenFieldDelegate; MPTagsTokenFieldDelegate *_tagTokenFieldDelegate;
MPAddCustomFieldContextMenuDelegate *_addCustomFieldContextMenuDelegate; MPAddCustomFieldContextMenuDelegate *_addCustomFieldContextMenuDelegate;
NSMutableArray<NSViewController<MPInspectorEditor> *> *_attributeEditorViewControllers;
NSMutableArray<NSViewController<MPAttributeInspectorEditor> *> *_customAttributeEditorViewControllers;
} }
@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) MPTOTPViewController *totpViewController;
@property (strong) MPEntryAttributeViewController *titleEditorViewController;
@property (strong) MPEntryAttributeViewController *usernameEditorViewController;
@property (strong) MPEntryAttributeViewController *passwordEditorViewController;
@property (strong) MPEntryAttributeViewController *urlEditorViewController;
@property (strong) MPNodeExpirationViewController *expiresEditorViewController;
@property (strong) MPNodeIconViewController *iconViewController;
@property (strong) MPTemporaryFileStorage *quicklookStorage; @property (strong) MPTemporaryFileStorage *quicklookStorage;
@@ -126,7 +123,7 @@ typedef NS_ENUM(NSUInteger, MPInpspectorEditorIndex) {
_customFieldTableDelegate.viewController = self; _customFieldTableDelegate.viewController = self;
_addCustomFieldContextMenuDelegate.viewController = self; _addCustomFieldContextMenuDelegate.viewController = self;
_attributeEditorViewControllers = [[NSMutableArray alloc] init]; _customAttributeEditorViewControllers = [[NSMutableArray alloc] init];
_activeTab = MPEntryTabGeneral; _activeTab = MPEntryTabGeneral;
} }
return self; return self;
@@ -143,6 +140,8 @@ typedef NS_ENUM(NSUInteger, MPInpspectorEditorIndex) {
if(self.representedObject) { if(self.representedObject) {
[NSNotificationCenter.defaultCenter removeObserver:self name:KPKWillChangeEntryNotification object:self.representedEntry]; [NSNotificationCenter.defaultCenter removeObserver:self name:KPKWillChangeEntryNotification object:self.representedEntry];
[NSNotificationCenter.defaultCenter removeObserver:self name:KPKDidChangeEntryNotification object:self.representedEntry]; [NSNotificationCenter.defaultCenter removeObserver:self name:KPKDidChangeEntryNotification object:self.representedEntry];
[NSNotificationCenter.defaultCenter removeObserver:self name:KPKWillAddAttributeNotification object:self.representedEntry];
[NSNotificationCenter.defaultCenter removeObserver:self name:KPKDidAddAttributeNotification object:self.representedEntry];
} }
super.representedObject = representedObject; super.representedObject = representedObject;
@@ -152,6 +151,8 @@ typedef NS_ENUM(NSUInteger, MPInpspectorEditorIndex) {
if(self.representedEntry) { if(self.representedEntry) {
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_willChangeEntry:) name:KPKWillChangeEntryNotification object:self.representedEntry]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_willChangeEntry:) name:KPKWillChangeEntryNotification object:self.representedEntry];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didChangeEntry:) name:KPKDidChangeEntryNotification object:self.representedEntry]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didChangeEntry:) name:KPKDidChangeEntryNotification object:self.representedEntry];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_willAddAttribute:) name:KPKWillAddAttributeNotification object:self.representedEntry];
[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(_didAddAttribute:) name:KPKDidAddAttributeNotification object:self.representedEntry];
} }
} }
@@ -207,8 +208,8 @@ typedef NS_ENUM(NSUInteger, MPInpspectorEditorIndex) {
self.windowTitleComboBox.delegate = _windowTitleMenuDelegate; self.windowTitleComboBox.delegate = _windowTitleMenuDelegate;
[self.passwordTextField bind:NSStringFromSelector(@selector(showPassword)) toObject:self withKeyPath:NSStringFromSelector(@selector(showPassword)) options:nil]; //[self.passwordTextField bind:NSStringFromSelector(@selector(showPassword)) toObject:self withKeyPath:NSStringFromSelector(@selector(showPassword)) options:nil];
[self.togglePassword bind:NSValueBinding toObject:self withKeyPath:NSStringFromSelector(@selector(showPassword)) options:nil]; //[self.togglePassword bind:NSValueBinding toObject:self withKeyPath:NSStringFromSelector(@selector(showPassword)) options:nil];
self.tagsTokenField.delegate = _tagTokenFieldDelegate; self.tagsTokenField.delegate = _tagTokenFieldDelegate;
@@ -334,6 +335,17 @@ typedef NS_ENUM(NSUInteger, MPInpspectorEditorIndex) {
} }
} }
- (void)toggleEdit:(id)sender {
// commit changes in editors!
self.titleEditorViewController.isEditor = !self.titleEditorViewController.isEditor;
self.usernameEditorViewController.isEditor = !self.usernameEditorViewController.isEditor;
self.passwordEditorViewController.isEditor = !self.passwordEditorViewController.isEditor;
self.urlEditorViewController.isEditor = !self.urlEditorViewController.isEditor;
self.expiresEditorViewController.isEditor = !self.expiresEditorViewController.isEditor;
self.iconViewController.isEditor = !self.iconViewController.isEditor;
//self.totpViewController.isEditor = !self.totpViewController.isEditor;
}
- (BOOL)validateMenuItem:(NSMenuItem *)menuItem { - (BOOL)validateMenuItem:(NSMenuItem *)menuItem {
switch([MPActionHelper typeForAction:menuItem.action]) { switch([MPActionHelper typeForAction:menuItem.action]) {
case MPActionToggleQuicklook: { case MPActionToggleQuicklook: {
@@ -404,7 +416,7 @@ typedef NS_ENUM(NSUInteger, MPInpspectorEditorIndex) {
} }
- (IBAction)showPasswordGenerator:(id)sender { - (IBAction)showPasswordGenerator:(id)sender {
self.generatePasswordButton.enabled = NO; //self.generatePasswordButton.enabled = NO;
MPPasswordCreatorViewController *viewController = [[MPPasswordCreatorViewController alloc] init]; MPPasswordCreatorViewController *viewController = [[MPPasswordCreatorViewController alloc] init];
viewController.allowsEntryDefaults = YES; viewController.allowsEntryDefaults = YES;
viewController.representedObject = self.representedObject; viewController.representedObject = self.representedObject;
@@ -434,7 +446,7 @@ typedef NS_ENUM(NSUInteger, MPInpspectorEditorIndex) {
self.showCustomEntrySequenceAutotypeBuilderButton.enabled = YES; self.showCustomEntrySequenceAutotypeBuilderButton.enabled = YES;
} }
else if([viewController isKindOfClass:MPPasswordCreatorViewController.class]) { else if([viewController isKindOfClass:MPPasswordCreatorViewController.class]) {
self.generatePasswordButton.enabled = YES; //self.generatePasswordButton.enabled = YES;
} }
[super dismissViewController:viewController]; [super dismissViewController:viewController];
} }
@@ -498,13 +510,8 @@ typedef NS_ENUM(NSUInteger, MPInpspectorEditorIndex) {
- (void)_setupViewBindings { - (void)_setupViewBindings {
/* Disable for history view */ /* Disable for history view */
NSArray *inputs = @[self.titleTextField, NSArray *inputs = @[
self.passwordTextField,
self.usernameTextField,
self.URLTextField,
self.expiresCheckButton,
self.tagsTokenField, self.tagsTokenField,
self.generatePasswordButton,
self.addAttachmentButton, self.addAttachmentButton,
self.addCustomFieldButton, self.addCustomFieldButton,
self.addWindowAssociationButton, self.addWindowAssociationButton,
@@ -526,35 +533,6 @@ typedef NS_ENUM(NSUInteger, MPInpspectorEditorIndex) {
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 }; NSDictionary *prettyPasswordBindingOptionsDict = @{ NSNullPlaceholderBindingOption: nullPlaceholderBindingOptionsDict[NSNullPlaceholderBindingOption], NSValueTransformerNameBindingOption : MPPrettyPasswordTransformerName };
[self.titleTextField bind:NSValueBinding
toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(title))]
options:nullPlaceholderBindingOptionsDict];
[self.passwordTextField bind:NSValueBinding
toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(password))]
options:prettyPasswordBindingOptionsDict];
[self.usernameTextField bind:NSValueBinding
toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(username))]
options:nullPlaceholderBindingOptionsDict];
[self.URLTextField bind:NSValueBinding
toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(url))]
options:nullPlaceholderBindingOptionsDict];
[self.expiresCheckButton bind:NSTitleBinding
toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(timeInfo)), NSStringFromSelector(@selector(expirationDate))]
options:@{ NSValueTransformerNameBindingOption:MPExpiryDateValueTransformerName }];
[self.expiresCheckButton bind:NSValueBinding
toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(timeInfo)), NSStringFromSelector(@selector(expires))]
options:nil];
[self.tagsTokenField bind:NSValueBinding [self.tagsTokenField bind:NSValueBinding
toObject:self toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(tags))] withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(tags))]
@@ -627,47 +605,79 @@ typedef NS_ENUM(NSUInteger, MPInpspectorEditorIndex) {
} }
- (void)_setupAttributeEditors { - (void)_setupAttributeEditors {
self.iconViewController = [[MPNodeIconViewController alloc] init];
[self addChildViewController:self.iconViewController];
[self.fieldsStackView addArrangedSubview:self.iconViewController.view];
self.titleEditorViewController = [[MPEntryAttributeViewController alloc] init];
[self addChildViewController:self.titleEditorViewController];
self.titleEditorViewController.attributeSelector = @selector(title);
[self.fieldsStackView addArrangedSubview:self.titleEditorViewController.view];
self.usernameEditorViewController = [[MPEntryAttributeViewController alloc] init];
[self addChildViewController:self.usernameEditorViewController];
self.usernameEditorViewController.attributeSelector = @selector(username);
[self.fieldsStackView addArrangedSubview:self.usernameEditorViewController.view];
self.passwordEditorViewController = [[MPEntryAttributeViewController alloc] init];
[self addChildViewController:self.passwordEditorViewController];
self.passwordEditorViewController.attributeSelector = @selector(password);
[self.fieldsStackView addArrangedSubview:self.passwordEditorViewController.view];
self.urlEditorViewController = [[MPEntryAttributeViewController alloc] init];
[self addChildViewController:self.urlEditorViewController];
self.urlEditorViewController.attributeSelector = @selector(url);
[self.fieldsStackView addArrangedSubview:self.urlEditorViewController.view];
self.totpViewController = [[MPTOTPViewController alloc] init]; 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 addChildViewController:self.totpViewController];
[self.fieldsStackView insertArrangedSubview:self.totpViewController.view atIndex:urlindex - 1]; //self.totpViewController.isEditor = NO;
[self.fieldsStackView addArrangedSubview:self.totpViewController.view];
/* self.expiresEditorViewController = [[MPNodeExpirationViewController alloc] init];
MPNodeExpirationViewController *vc = [[MPNodeExpirationViewController alloc] init]; [self addChildViewController:self.expiresEditorViewController];
vc.isEditor = NO; self.expiresEditorViewController.isEditor = NO;
[_attributeEditorViewControllers addObject:vc]; [self.fieldsStackView addArrangedSubview:self.expiresEditorViewController.view];
[self.fieldsStackView addArrangedSubview:vc.view];
MPEntryAttributeViewController *vc = [[MPEntryAttributeViewController alloc] init];
vc.isEditor = NO;
[_attributeEditorViewControllers addObject:vc];
[self.fieldsStackView addArrangedSubview:vc.view];
for(NSUInteger index = 0; index < kKPKDefaultEntryKeysCount; index++) {
MPEntryAttributeViewController *vc = [[MPEntryAttributeViewController alloc] init];
vc.isEditor = NO;
[_attributeEditorViewControllers addObject:vc];
[self.fieldsStackView addArrangedSubview:vc.view];
}
*/
} }
- (void)_updateEditors { - (void)_updateEditors {
self.iconViewController.representedObject = self.representedObject;
self.totpViewController.representedObject = self.representedObject; self.totpViewController.representedObject = self.representedObject;
/* Update all the Attribute editors self.expiresEditorViewController.representedObject = self.representedEntry.timeInfo;
_attributeEditorViewControllers[MPInpspectorEditorIndexUsername].representedObject = [self.representedEntry attributeWithKey:kKPKUsernameKey];
*/ self.titleEditorViewController.representedObject = [self.representedEntry attributeWithKey:kKPKTitleKey];
self.usernameEditorViewController.representedObject = [self.representedEntry attributeWithKey:kKPKUsernameKey];
self.passwordEditorViewController.representedObject = [self.representedEntry attributeWithKey:kKPKPasswordKey];
self.urlEditorViewController.representedObject = [self.representedEntry attributeWithKey:kKPKURLKey];
// update custom field editors
for(NSViewController *vc in _customAttributeEditorViewControllers) {
[self.fieldsStackView removeView:vc.view];
[vc removeFromParentViewController];
}
[_customAttributeEditorViewControllers removeAllObjects];
for(KPKAttribute *attribute in self.representedEntry.customAttributes) {
MPEntryAttributeViewController *vc = [[MPEntryAttributeViewController alloc] init];
// FIXME: Correcly set editor starte based on current state
vc.isEditor = NO;
vc.representedObject = attribute;
[self.fieldsStackView addArrangedSubview:vc.view];
[self addChildViewController:vc];
[_customAttributeEditorViewControllers addObject:vc];
}
} }
#pragma mark - #pragma mark -
#pragma mark HNHUITextFieldDelegate #pragma mark HNHUITextFieldDelegate
- (BOOL)textField:(NSTextField *)textField allowServicesForTextView:(NSTextView *)textView { - (BOOL)textField:(NSTextField *)textField allowServicesForTextView:(NSTextView *)textView {
/* disallow servies for password fields */ /* disallow servies for password fields */
/*
FIXME: Add to MPEntryPasswordViewController
if(textField == self.passwordTextField) { if(textField == self.passwordTextField) {
return NO; return NO;
} }
*/
NSInteger index = MPCustomFieldIndexFromTag(textField.tag); NSInteger index = MPCustomFieldIndexFromTag(textField.tag);
if(index > -1) { if(index > -1) {
KPKAttribute *attribute = _customFieldsController.arrangedObjects[index]; KPKAttribute *attribute = _customFieldsController.arrangedObjects[index];
@@ -690,8 +700,8 @@ typedef NS_ENUM(NSUInteger, MPInpspectorEditorIndex) {
/*- (NSArray<NSString *> *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray<NSString *> *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index { /*- (NSArray<NSString *> *)control:(NSControl *)control textView:(NSTextView *)textView completions:(NSArray<NSString *> *)words forPartialWordRange:(NSRange)charRange indexOfSelectedItem:(NSInteger *)index {
return @[ @"{USERNAME}", @"{PASSWORD}", @"{URL}", @"{TITLE}" ]; return @[ @"{USERNAME}", @"{PASSWORD}", @"{URL}", @"{TITLE}" ];
} }
*/ */
- (BOOL)textField:(NSTextField *)textField textView:(NSTextView *)textView performAction:(SEL)action { - (BOOL)textField:(NSTextField *)textField textView:(NSTextView *)textView performAction:(SEL)action {
if(action == @selector(copy:)) { if(action == @selector(copy:)) {
@@ -704,6 +714,7 @@ typedef NS_ENUM(NSUInteger, MPInpspectorEditorIndex) {
if(selectedValue.length == 0) { if(selectedValue.length == 0) {
return YES; return YES;
} }
/* FIXME: Add to AttributeViewController
if(textField == self.usernameTextField) { if(textField == self.usernameTextField) {
info = MPPasteboardOverlayInfoUsername; info = MPPasteboardOverlayInfoUsername;
} }
@@ -713,12 +724,9 @@ typedef NS_ENUM(NSUInteger, MPInpspectorEditorIndex) {
else if(textField == self.URLTextField) { else if(textField == self.URLTextField) {
info = MPPasteboardOverlayInfoURL; info = MPPasteboardOverlayInfoURL;
} }
else if(textField == self.uuidTextField) { else*/ if(textField == self.uuidTextField) {
name = NSLocalizedString(@"UUID", "Displayed name when uuid field was copied"); name = NSLocalizedString(@"UUID", "Displayed name when uuid field was copied");
} }
else if(textField == self.titleTextField) {
name = NSLocalizedString(@"TITLE", "Displayed name when title field was copied");
}
else { else {
NSInteger index = MPCustomFieldIndexFromTag(textField.tag); NSInteger index = MPCustomFieldIndexFromTag(textField.tag);
if(index > -1) { if(index > -1) {
@@ -732,9 +740,13 @@ typedef NS_ENUM(NSUInteger, MPInpspectorEditorIndex) {
} }
- (IBAction)toggleExpire:(NSButton*)sender { - (IBAction)toggleExpire:(NSButton*)sender {
/*
FIXME: Add to expiredViewController
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];
} }
*/
} }
#pragma mark - #pragma mark -
@@ -742,7 +754,6 @@ typedef NS_ENUM(NSUInteger, MPInpspectorEditorIndex) {
- (void)_didAddEntry:(NSNotification *)notification { - (void)_didAddEntry:(NSNotification *)notification {
[self.tabView selectTabViewItemAtIndex:MPEntryTabGeneral]; [self.tabView selectTabViewItemAtIndex:MPEntryTabGeneral];
[self.titleTextField becomeFirstResponder];
} }
- (void)_didChangeCurrentItem:(NSNotification *)notificiation { - (void)_didChangeCurrentItem:(NSNotification *)notificiation {
@@ -768,4 +779,19 @@ typedef NS_ENUM(NSUInteger, MPInpspectorEditorIndex) {
- (void)_didChangeAttribute:(NSNotification *)notification { - (void)_didChangeAttribute:(NSNotification *)notification {
} }
- (void)_willAddAttribute:(NSNotification *)notification {
}
- (void)_didAddAttribute:(NSNotification *)notification {
// TODO: add attribute editor to stackview
}
- (void)_willRemoveAttribute:(NSNotification *)notification {
// TODO: remove attribute editor form stackview
}
- (void)_didRemoveAttribute:(NSNotification *)notification {
}
@end @end

View File

@@ -1,18 +0,0 @@
//
// MPEntryPasswordAttributeViewController.h
// MacPass
//
// Created by Michael Starke on 18.10.21.
// Copyright © 2021 HicknHack Software GmbH. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "MPEntryAttributeViewController.h"
NS_ASSUME_NONNULL_BEGIN
@interface MPEntryPasswordAttributeViewController : MPEntryAttributeViewController
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,37 +0,0 @@
//
// MPEntryPasswordAttributeViewController.m
// MacPass
//
// Created by Michael Starke on 18.10.21.
// Copyright © 2021 HicknHack Software GmbH. All rights reserved.
//
#import "MPEntryPasswordAttributeViewController.h"
#import <HNHUi/HNHUi.h>
#import <KeePassKit/KeePassKit.h>
@interface MPEntryPasswordAttributeViewController ()
@property (strong) IBOutlet HNHUISecureTextField *passwordTextField;
@property (strong) IBOutlet NSButton *togglePasswordButton;
@property (strong) IBOutlet NSButton *generatePasswordButton;
@property (strong, nullable, readonly) KPKAttribute *representedAttribute;
@end
@implementation MPEntryPasswordAttributeViewController
- (void)updateValues {
self.view.hidden = (!self.isEditor && self.representedAttribute.value.length == 0);
self.passwordTextField.stringValue = self.representedAttribute.value ? self.representedAttribute.value : @"";
}
- (void)updateEditing {
self.generatePasswordButton.hidden = !self.isEditor;
self.passwordTextField.editable = self.isEditor;
self.passwordTextField.selectable = YES;
}
@end

View File

@@ -1,104 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="MPEntryPasswordAttributeViewController">
<connections>
<outlet property="generatePasswordButton" destination="UlI-yI-Sqn" id="sKR-Rd-2LC"/>
<outlet property="keyTextField" destination="2aN-Ps-z4K" id="ua7-Km-K5o"/>
<outlet property="passwordTextField" destination="tpF-hp-29r" id="2pM-fr-9l0"/>
<outlet property="togglePasswordButton" destination="AY0-XE-8S7" id="IwM-pB-tQn"/>
<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="480" height="42"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<stackView distribution="fill" orientation="vertical" alignment="leading" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="jTp-ga-xuT">
<rect key="frame" x="0.0" y="0.0" width="480" height="42"/>
<subviews>
<textField horizontalHuggingPriority="249" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="2aN-Ps-z4K">
<rect key="frame" x="-2" y="28" width="484" height="14"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Password" id="Piv-zL-dtc">
<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="XRh-Fs-reW">
<rect key="frame" x="0.0" y="0.0" width="480" height="20"/>
<subviews>
<secureTextField horizontalHuggingPriority="249" verticalHuggingPriority="750" horizontalCompressionResistancePriority="249" allowsCharacterPickerTouchBarItem="YES" contentType="oneTimeCode" translatesAutoresizingMaskIntoConstraints="NO" id="tpF-hp-29r" customClass="HNHUISecureTextField">
<rect key="frame" x="0.0" y="0.0" width="352" height="20"/>
<secureTextFieldCell key="cell" lineBreakMode="truncatingTail" truncatesLastVisibleLine="YES" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" usesSingleLineMode="YES" id="CeT-F7-Vb3">
<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="nextKeyView" destination="AY0-XE-8S7" id="uPk-2E-Bwh"/>
</connections>
</secureTextField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="AY0-XE-8S7">
<rect key="frame" x="353" y="-7" width="50" height="32"/>
<buttonCell key="cell" type="push" bezelStyle="rounded" image="NSQuickLookTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="NUE-lS-hzr">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES" changeBackground="YES" changeGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<outlet property="nextKeyView" destination="UlI-yI-Sqn" id="6uu-J3-TEc"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="UlI-yI-Sqn">
<rect key="frame" x="397" y="-7" width="90" height="32"/>
<buttonCell key="cell" type="push" title="Generate" bezelStyle="rounded" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Rx9-ck-eKo">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</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>
</subviews>
<visibilityPriorities>
<integer value="1000"/>
<integer value="1000"/>
</visibilityPriorities>
<customSpacing>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
</subviews>
<constraints>
<constraint firstAttribute="trailing" secondItem="jTp-ga-xuT" secondAttribute="trailing" id="8qT-FW-gVh"/>
<constraint firstItem="jTp-ga-xuT" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" id="Hla-na-Bw8"/>
<constraint firstAttribute="bottom" secondItem="jTp-ga-xuT" secondAttribute="bottom" id="pcp-4W-Bvc"/>
<constraint firstItem="jTp-ga-xuT" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" id="wEy-tv-xz0"/>
</constraints>
<point key="canvasLocation" x="173" y="112"/>
</customView>
</objects>
<resources>
<image name="NSQuickLookTemplate" width="21" height="13"/>
</resources>
</document>

View File

@@ -7,6 +7,10 @@
// //
#import <Foundation/Foundation.h> #import <Foundation/Foundation.h>
@class KPKAttribute;
@class KPKEntry;
@class KPKTimeInfo;
@class KPKNode;
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
@@ -14,10 +18,32 @@ NS_ASSUME_NONNULL_BEGIN
/// Individual editors shoudl adopt different APIs to accomodate their needs /// Individual editors shoudl adopt different APIs to accomodate their needs
/// The preferred way to set model data is to use the representedObject /// The preferred way to set model data is to use the representedObject
@protocol MPInspectorEditor <NSObject> @protocol MPInspectorEditor <NSObject>
@required @required
@property (nonatomic) BOOL isEditor; @property (nonatomic) BOOL isEditor;
@end
/// NodeInspectorEditors require the represented object to be a KPKNode
@protocol MPNodeInspectorEditor <MPInspectorEditor>
@required
@property (nonatomic, nullable, readonly, strong) KPKNode *representedNode;
@end
/// EntryInspectorEditors require the represented object to be a KPKEnty
@protocol MPEntryInspectorEditor <MPInspectorEditor>
@required
@property (nonatomic, nullable, readonly, strong) KPKEntry *representedEntry;
@end
/// AttributeInspectorEditors require the represented object to be a KPKAttribute
@protocol MPAttributeInspectorEditor <MPInspectorEditor>
@required
@property (nonatomic, nullable, readonly, strong) KPKAttribute *representedAttribute;
@end
/// TimeInfoInpspectorEditors require the represented object to be a KPKTimeInfo
@protocol MPTimeInfoInpspectorEditor <MPInspectorEditor>
@required
@property (nonatomic, nullable, readonly, strong) KPKTimeInfo *representedTimeInfo;
@end @end
NS_ASSUME_NONNULL_END NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,21 @@
//
// MPInspectorEditorView.h
// MacPass
//
// Created by Michael Starke on 08.03.22.
// Copyright © 2022 HicknHack Software GmbH. All rights reserved.
//
#import <Cocoa/Cocoa.h>
NS_ASSUME_NONNULL_BEGIN
FOUNDATION_EXPORT NSString *const MPInspectorEditorViewMouseEnteredNotification;
FOUNDATION_EXPORT NSString *const MPInspectorEditorViewMouseExitedNotification;
@interface MPInspectorEditorView : NSView
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,50 @@
//
// MPInspectorEditorView.m
// MacPass
//
// Created by Michael Starke on 08.03.22.
// Copyright © 2022 HicknHack Software GmbH. All rights reserved.
//
#import "MPInspectorEditorView.h"
NSString *const MPInspectorEditorViewMouseEnteredNotification = @"com.hicknhacksoftware.macpass.MPInspectorEditorViewMouseEnteredNotification";
NSString *const MPInspectorEditorViewMouseExitedNotification = @"com.hicknhacksoftware.macpass.MPInspectorEditorViewMouseExitedNotification";
@interface MPInspectorEditorView ()
@property (strong) NSTrackingArea *trackingArea;
@end
@implementation MPInspectorEditorView
- (void)mouseEntered:(NSEvent *)event {
[NSNotificationCenter.defaultCenter postNotificationName:MPInspectorEditorViewMouseEnteredNotification object:self];
}
- (void)mouseExited:(NSEvent *)event {
[NSNotificationCenter.defaultCenter postNotificationName:MPInspectorEditorViewMouseExitedNotification object:self];
}
- (void)createTrackingArea {
self.trackingArea = [[NSTrackingArea alloc] initWithRect:self.bounds options:NSTrackingActiveAlways|NSTrackingMouseEnteredAndExited owner:self userInfo:nil];
[self addTrackingArea:self.trackingArea];
NSPoint mouseLocation = self.window.mouseLocationOutsideOfEventStream;
mouseLocation = [self convertPoint:mouseLocation fromView:nil];
if(NSPointInRect(mouseLocation, self.bounds)) {
[self mouseEntered:NSApp.currentEvent];
}
else {
[self mouseExited:NSApp.currentEvent];
}
}
- (void)updateTrackingAreas {
[self removeTrackingArea:self.trackingArea];
[self createTrackingArea];
[super updateTrackingAreas];
}
@end

View File

@@ -81,6 +81,7 @@ typedef NS_ENUM(NSUInteger, MPContentTab) {
} }
- (void)awakeFromNib { - (void)awakeFromNib {
// TODO: Convert to NSTabViewController?
self.noSelectionInfo.cell.backgroundStyle = NSBackgroundStyleRaised; self.noSelectionInfo.cell.backgroundStyle = NSBackgroundStyleRaised;
self.itemImageView.cell.backgroundStyle = NSBackgroundStyleRaised; self.itemImageView.cell.backgroundStyle = NSBackgroundStyleRaised;
[self.tabView bind:NSSelectedIndexBinding toObject:self withKeyPath:NSStringFromSelector(@selector(activeTab)) options:nil]; [self.tabView bind:NSSelectedIndexBinding toObject:self withKeyPath:NSStringFromSelector(@selector(activeTab)) options:nil];
@@ -105,6 +106,10 @@ typedef NS_ENUM(NSUInteger, MPContentTab) {
[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;
[self addChildViewController:self.entryViewController];
[self addChildViewController:self.groupViewController];
[self.view layout];} [self.view layout];}
- (void)registerNotificationsForDocument:(MPDocument *)document { - (void)registerNotificationsForDocument:(MPDocument *)document {
@@ -217,4 +222,20 @@ typedef NS_ENUM(NSUInteger, MPContentTab) {
} }
- (id)supplementalTargetForAction:(SEL)action sender:(id)sender {
for(NSViewController *childViewController in self.childViewControllers) {
if([childViewController respondsToSelector:action]) {
return childViewController;
}
else {
id target = [childViewController supplementalTargetForAction:action sender:sender];
if(!target) {
continue;
}
return target;
}
}
return [super supplementalTargetForAction:action sender:sender];
}
@end @end

View File

@@ -11,7 +11,7 @@
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_BEGIN
@interface MPNodeExpirationViewController : NSViewController <MPInspectorEditor> @interface MPNodeExpirationViewController : NSViewController <MPTimeInfoInpspectorEditor>
@end @end

View File

@@ -13,7 +13,6 @@
@interface MPNodeExpirationViewController () @interface MPNodeExpirationViewController ()
@property (nonatomic, readonly, strong) KPKTimeInfo *representedTimeInfo;
@property (strong) IBOutlet NSButton *expiredCheckButton; @property (strong) IBOutlet NSButton *expiredCheckButton;
@property (strong) IBOutlet NSButton *pickExpireDateButton; @property (strong) IBOutlet NSButton *pickExpireDateButton;
@@ -61,7 +60,7 @@
} }
- (void)_updateValues { - (void)_updateValues {
self.view.hidden = self.representedTimeInfo.expires; self.view.hidden = !self.representedTimeInfo.expires;
self.expiredCheckButton.state = HNHUIStateForBool(self.representedTimeInfo.expires); self.expiredCheckButton.state = HNHUIStateForBool(self.representedTimeInfo.expires);
NSValueTransformer *dateTransformer = [NSValueTransformer valueTransformerForName:MPExpiryDateValueTransformerName]; NSValueTransformer *dateTransformer = [NSValueTransformer valueTransformerForName:MPExpiryDateValueTransformerName];
self.expiredCheckButton.title = [dateTransformer transformedValue:self.representedTimeInfo.expirationDate]; self.expiredCheckButton.title = [dateTransformer transformedValue:self.representedTimeInfo.expirationDate];

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="18122" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="19529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies> <dependencies>
<deployment identifier="macosx"/> <deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="18122"/> <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19529"/>
<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>
@@ -16,21 +16,21 @@
<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="Hz6-mo-xeY"> <customView id="Hz6-mo-xeY">
<rect key="frame" x="0.0" y="0.0" width="187" height="20"/> <rect key="frame" x="0.0" y="0.0" width="187" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews> <subviews>
<stackView distribution="fill" orientation="horizontal" alignment="centerY" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" horizontalHuggingPriority="248" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="l8k-GC-FnL"> <stackView distribution="fill" orientation="horizontal" alignment="centerY" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" horizontalHuggingPriority="248" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="l8k-GC-FnL">
<rect key="frame" x="0.0" y="0.0" width="187" height="20"/> <rect key="frame" x="0.0" y="0.0" width="187" height="22"/>
<subviews> <subviews>
<button horizontalHuggingPriority="249" horizontalCompressionResistancePriority="249" translatesAutoresizingMaskIntoConstraints="NO" id="HAQ-Wk-M7P"> <button horizontalHuggingPriority="249" horizontalCompressionResistancePriority="249" translatesAutoresizingMaskIntoConstraints="NO" id="HAQ-Wk-M7P">
<rect key="frame" x="-2" y="1" width="150" height="18"/> <rect key="frame" x="-2" y="2" width="150" height="18"/>
<buttonCell key="cell" type="check" title="Expires" bezelStyle="regularSquare" imagePosition="left" lineBreakMode="truncatingMiddle" state="on" inset="2" id="7kV-WE-lr3"> <buttonCell key="cell" type="check" title="Expires" bezelStyle="regularSquare" imagePosition="left" lineBreakMode="truncatingMiddle" state="on" inset="2" id="7kV-WE-lr3">
<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="G7C-WZ-ad7"> <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="G7C-WZ-ad7">
<rect key="frame" x="149" y="-7" width="45" height="32"/> <rect key="frame" x="149" y="-6" 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="hgC-Qj-aTs"> <buttonCell key="cell" type="push" bezelStyle="rounded" image="NSActionTemplate" imagePosition="only" alignment="center" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="hgC-Qj-aTs">
<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"/>
@@ -40,6 +40,10 @@
</connections> </connections>
</button> </button>
</subviews> </subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="G7C-WZ-ad7" secondAttribute="bottom" constant="1" id="62i-sg-sio"/>
<constraint firstItem="G7C-WZ-ad7" firstAttribute="top" secondItem="l8k-GC-FnL" secondAttribute="top" constant="1" id="QLH-zK-eyP"/>
</constraints>
<visibilityPriorities> <visibilityPriorities>
<integer value="1000"/> <integer value="1000"/>
<integer value="1000"/> <integer value="1000"/>
@@ -56,7 +60,7 @@
<constraint firstItem="l8k-GC-FnL" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" id="Qvv-5F-nde"/> <constraint firstItem="l8k-GC-FnL" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" id="Qvv-5F-nde"/>
<constraint firstAttribute="trailing" secondItem="l8k-GC-FnL" secondAttribute="trailing" id="ckb-kh-R60"/> <constraint firstAttribute="trailing" secondItem="l8k-GC-FnL" secondAttribute="trailing" id="ckb-kh-R60"/>
</constraints> </constraints>
<point key="canvasLocation" x="-91" y="-25"/> <point key="canvasLocation" x="-91.5" y="-41"/>
</customView> </customView>
</objects> </objects>
<resources> <resources>

View File

@@ -0,0 +1,18 @@
//
// MPNodeIconViewController.h
// MacPass
//
// Created by Michael Starke on 02.03.22.
// Copyright © 2022 HicknHack Software GmbH. All rights reserved.
//
#import <Cocoa/Cocoa.h>
#import "MPInspectorEditor.h"
NS_ASSUME_NONNULL_BEGIN
@interface MPNodeIconViewController : NSViewController <MPNodeInspectorEditor>
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,56 @@
//
// MPNodeIconViewController.m
// MacPass
//
// Created by Michael Starke on 02.03.22.
// Copyright © 2022 HicknHack Software GmbH. All rights reserved.
//
#import "MPNodeIconViewController.h"
#import <KeePassKit/KeePassKit.h>
#import "MPEntryInspectorViewController.h"
#import "KPKNode+IconImage.h"
@interface MPNodeIconViewController ()
@property (strong) IBOutlet NSButton *imageButton;
@property (strong) IBOutlet NSTextField *textField;
@property (copy) NSUUID *iconUUID;
@property NSUInteger iconId;
@end
@implementation MPNodeIconViewController
@synthesize isEditor = _isEditor;
- (void)viewDidLoad {
[super viewDidLoad];
//self.imageView.cell.backgroundStyle = NSBackgroundStyleRaised;
[self.imageButton bind:NSImageBinding
toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(iconImage))]
options:@{NSConditionallySetsEnabledBindingOption: @NO}];
[self.textField bind:NSValueBinding
toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(title))]
options:@{NSNullPlaceholderBindingOption:NSLocalizedString(@"NO_TITLE", @"Fallback to items with no title")}];
[self _updateValueAndEditing];
}
- (KPKNode *)representedNode {
if([self.representedObject isKindOfClass:KPKNode.class]) {
return (KPKNode *)self.representedObject;
}
return nil;
}
- (void)setIsEditor:(BOOL)isEditor {
_isEditor = isEditor;
[self _updateValueAndEditing];
}
- (void)_updateValueAndEditing {
self.imageButton.enabled = self.isEditor;
}
@end

View File

@@ -0,0 +1,68 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="19529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19529"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="MPNodeIconViewController">
<connections>
<outlet property="imageButton" destination="EO8-71-AW8" id="kgk-Bm-Hwv"/>
<outlet property="textField" destination="xou-fD-adZ" id="n93-XV-5dq"/>
<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="495" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<textField horizontalHuggingPriority="249" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="xou-fD-adZ">
<rect key="frame" x="38" y="8" width="406" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="aKF-2z-5ob">
<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>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0HE-hi-9Hm">
<rect key="frame" x="443" y="-1" width="58" height="32"/>
<buttonCell key="cell" type="push" title="Edit" alternateTitle="Done" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="ueF-MQ-zDV">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES" changeBackground="YES" changeGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="toggleEdit:" target="-1" id="cBO-qZ-fN3"/>
</connections>
</button>
<button translatesAutoresizingMaskIntoConstraints="NO" id="EO8-71-AW8">
<rect key="frame" x="0.0" y="0.0" width="32" height="32"/>
<constraints>
<constraint firstAttribute="height" constant="32" id="TEp-1p-b6O"/>
<constraint firstAttribute="width" constant="32" id="vue-ta-TCV"/>
</constraints>
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" imagePosition="only" alignment="center" imageScaling="proportionallyUpOrDown" inset="2" id="hbo-qV-oVP">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="pickIcon:" target="-1" id="8Ad-dS-w36"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="0HE-hi-9Hm" firstAttribute="centerY" secondItem="Hz6-mo-xeY" secondAttribute="centerY" id="4rk-Ut-1ch"/>
<constraint firstItem="EO8-71-AW8" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" id="AxG-ML-ibN"/>
<constraint firstItem="xou-fD-adZ" firstAttribute="centerY" secondItem="Hz6-mo-xeY" secondAttribute="centerY" id="EYw-Zm-iiO"/>
<constraint firstItem="0HE-hi-9Hm" firstAttribute="leading" secondItem="xou-fD-adZ" secondAttribute="trailing" constant="8" symbolic="YES" id="J5A-t9-uim"/>
<constraint firstAttribute="trailing" secondItem="0HE-hi-9Hm" secondAttribute="trailing" constant="1" id="QL9-uh-tCj"/>
<constraint firstItem="xou-fD-adZ" firstAttribute="leading" secondItem="EO8-71-AW8" secondAttribute="trailing" constant="8" symbolic="YES" id="TFI-Xr-6JG"/>
<constraint firstItem="EO8-71-AW8" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" id="bYm-Dz-12l"/>
<constraint firstAttribute="bottom" secondItem="EO8-71-AW8" secondAttribute="bottom" id="uhZ-Es-YcW"/>
</constraints>
<point key="canvasLocation" x="231.5" y="-13.5"/>
</customView>
</objects>
</document>

View File

@@ -0,0 +1,17 @@
//
// MPNodeTagViewController.h
// MacPass
//
// Created by Michael Starke on 15.03.22.
// Copyright © 2022 HicknHack Software GmbH. All rights reserved.
//
#import <Cocoa/Cocoa.h>
NS_ASSUME_NONNULL_BEGIN
@interface MPNodeTagViewController : NSViewController
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,22 @@
//
// MPNodeTagViewController.m
// MacPass
//
// Created by Michael Starke on 15.03.22.
// Copyright © 2022 HicknHack Software GmbH. All rights reserved.
//
#import "MPNodeTagViewController.h"
@interface MPNodeTagViewController ()
@end
@implementation MPNodeTagViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do view setup here.
}
@end

View File

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

View File

@@ -97,4 +97,11 @@
self.toptValueTextField.stringValue = @""; self.toptValueTextField.stringValue = @"";
} }
} }
- (BOOL)commitEditing {
NSLog(@"%@: %@", NSStringFromClass(self.class), NSStringFromSelector(_cmd));
return [super commitEditing];
}
@end @end

View File

@@ -34,7 +34,7 @@
+ (instancetype)QRCodeImageWithString:(NSString *)string { + (instancetype)QRCodeImageWithString:(NSString *)string {
NSData *asciiData = [string dataUsingEncoding:NSISOLatin1StringEncoding]; NSData *asciiData = [string dataUsingEncoding:NSISOLatin1StringEncoding];
if(!asciiData) { if(!asciiData) {
return nil; return [[NSImage alloc] init];
} }
CIFilter *qrCodeFilter = [CIFilter filterWithName:@"CIQRCodeGenerator" withInputParameters:@{@"inputMessage": asciiData}]; CIFilter *qrCodeFilter = [CIFilter filterWithName:@"CIQRCodeGenerator" withInputParameters:@{@"inputMessage": asciiData}];
NSAffineTransform *scale = [[NSAffineTransform alloc] init]; NSAffineTransform *scale = [[NSAffineTransform alloc] init];