mirror of
https://github.com/MacPass/MacPass.git
synced 2025-12-24 08:49:42 +00:00
Adoped new KeePassKit placeholder delegation.
Added primitive support for {PICKCHARS} currently without support for options
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="13196" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="13529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||
<dependencies>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="13196"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="13529"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
@@ -142,7 +142,7 @@ DQ
|
||||
<constraint firstItem="7cB-re-3ys" firstAttribute="top" secondItem="kDw-2l-7gQ" secondAttribute="bottom" constant="8" symbolic="YES" id="ss6-Ku-XPY"/>
|
||||
<constraint firstAttribute="trailing" secondItem="kDw-2l-7gQ" secondAttribute="trailing" constant="20" symbolic="YES" id="zSz-fH-fVn"/>
|
||||
</constraints>
|
||||
<point key="canvasLocation" x="-128" y="-54"/>
|
||||
<point key="canvasLocation" x="176" y="-39"/>
|
||||
</customView>
|
||||
</objects>
|
||||
<resources>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="13196" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="13529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||
<dependencies>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="13196"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="13529"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
@@ -532,7 +532,7 @@
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="58" secondAttribute="trailing" constant="20" symbolic="YES" id="rbs-i7-bti"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="6" secondAttribute="trailing" constant="20" symbolic="YES" id="uuh-ba-z4h"/>
|
||||
</constraints>
|
||||
<point key="canvasLocation" x="-525" y="-927"/>
|
||||
<point key="canvasLocation" x="-679" y="-1054"/>
|
||||
</customView>
|
||||
<view translatesAutoresizingMaskIntoConstraints="NO" id="zv7-wE-Bmg" customClass="HNHUIScrollDocumentViewAdapter">
|
||||
<rect key="frame" x="0.0" y="0.0" width="301" height="424"/>
|
||||
@@ -900,7 +900,7 @@
|
||||
<connections>
|
||||
<outlet property="nextKeyView" destination="QSX-Xo-tcH" id="KP9-D4-4cC"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="-899" y="-949"/>
|
||||
<point key="canvasLocation" x="-1015" y="-1275"/>
|
||||
</scrollView>
|
||||
</objects>
|
||||
<resources>
|
||||
|
||||
@@ -239,8 +239,7 @@ static MPAutotypeDaemon *_sharedInstance;
|
||||
usleep(1 * NSEC_PER_MSEC);
|
||||
}
|
||||
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
||||
NSArray<MPAutotypeCommand *> *commands = [MPAutotypeCommand commandsForContext:context];
|
||||
for(MPAutotypeCommand *command in commands) {
|
||||
for(MPAutotypeCommand *command in [MPAutotypeCommand commandsForContext:context]) {
|
||||
[command execute];
|
||||
}
|
||||
});
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
//
|
||||
// MPAutotypePickchars.m
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 23.11.17.
|
||||
// Copyright © 2017 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MPAutotypePickchars.h"
|
||||
#import "MPPickcharViewController.h"
|
||||
|
||||
@implementation MPAutotypePickchars
|
||||
|
||||
- (void)execute {
|
||||
dispatch_sync(dispatch_get_main_queue(), ^{
|
||||
|
||||
|
||||
MPPickcharViewController *vc = [[MPPickcharViewController alloc] init];
|
||||
vc.sourceValue = @"ThisIsANicePassword";
|
||||
vc.countToPick = 10;
|
||||
|
||||
|
||||
NSPanel *panel = [[NSPanel alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
|
||||
styleMask:NSWindowStyleMaskNonactivatingPanel|NSWindowStyleMaskTitled
|
||||
backing:NSBackingStoreRetained
|
||||
defer:YES];
|
||||
panel.level = NSScreenSaverWindowLevel;
|
||||
panel.contentViewController = vc;
|
||||
[panel center];
|
||||
[panel makeKeyAndOrderFront:self];
|
||||
|
||||
if(NSModalResponseOK == [NSApp runModalForWindow:panel]) {
|
||||
// Do some stuff!
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@end
|
||||
23
MacPass/MPPickcharViewController.h
Normal file
23
MacPass/MPPickcharViewController.h
Normal file
@@ -0,0 +1,23 @@
|
||||
//
|
||||
// MPPickcharViewController.h
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 23.11.17.
|
||||
// Copyright © 2017 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import <Cocoa/Cocoa.h>
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface MPPickcharViewController : NSViewController
|
||||
|
||||
@property (copy) NSString *sourceValue;
|
||||
@property (nonatomic, copy) NSString *pickedValue;
|
||||
@property NSInteger countToPick;
|
||||
@property (nonatomic) BOOL hideSource;
|
||||
|
||||
- (IBAction)reset:(id)sender;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
121
MacPass/MPPickcharViewController.m
Normal file
121
MacPass/MPPickcharViewController.m
Normal file
@@ -0,0 +1,121 @@
|
||||
//
|
||||
// MPPickcharViewController.m
|
||||
// MacPass
|
||||
//
|
||||
// Created by Michael Starke on 23.11.17.
|
||||
// Copyright © 2017 HicknHack Software GmbH. All rights reserved.
|
||||
//
|
||||
|
||||
#import "MPPickcharViewController.h"
|
||||
#import "NSString+MPComposedCharacterAdditions.h"
|
||||
|
||||
#import <HNHUi/HNHUi.h>
|
||||
|
||||
@interface MPPickcharViewController () <NSTableViewDelegate, NSTableViewDataSource>
|
||||
@property (weak) IBOutlet NSTableView *characterTableView;
|
||||
@property (weak) IBOutlet NSTextField *pickedValueTextField;
|
||||
@property (weak) IBOutlet NSButton *togglePasswordDisplayButton;
|
||||
@property (weak) IBOutlet NSTextField *pickedStatusTextField;
|
||||
@end
|
||||
|
||||
@implementation MPPickcharViewController
|
||||
|
||||
- (NSNibName)nibName {
|
||||
return @"PickcharView";
|
||||
}
|
||||
|
||||
- (instancetype)initWithCoder:(NSCoder *)coder {
|
||||
self = [super initWithCoder:coder];
|
||||
if(self) {
|
||||
self.hideSource = NO;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (instancetype)initWithNibName:(NSNibName)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
|
||||
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
|
||||
if(self) {
|
||||
self.hideSource = NO;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
- (void)reset:(id)sender {
|
||||
self.pickedValue = @"";
|
||||
}
|
||||
|
||||
- (void)viewDidLoad {
|
||||
[super viewDidLoad];
|
||||
for(NSTableColumn *column in self.characterTableView.tableColumns) {
|
||||
[self.characterTableView removeTableColumn:column];
|
||||
}
|
||||
for(NSUInteger count = 0; count < self.sourceValue.composedCharacterLength; count++) {
|
||||
|
||||
NSString *columnTitle = [NSString stringWithFormat:@"%ld", count];
|
||||
NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:columnTitle];
|
||||
column.maxWidth = 32.0;
|
||||
column.minWidth = column.maxWidth;
|
||||
column.headerCell.stringValue = columnTitle;
|
||||
[self.characterTableView addTableColumn:column];
|
||||
}
|
||||
self.characterTableView.enclosingScrollView.horizontalScroller.scrollerStyle = NSScrollerStyleLegacy;
|
||||
[self.pickedValueTextField bind:NSValueBinding toObject:self withKeyPath:NSStringFromSelector(@selector(pickedValue)) options:nil];
|
||||
[self.togglePasswordDisplayButton bind:NSValueBinding toObject:self.pickedValueTextField withKeyPath:NSStringFromSelector(@selector(showPassword)) options:nil];
|
||||
|
||||
[self reset:self];
|
||||
}
|
||||
|
||||
- (void)setHideSource:(BOOL)hideSource {
|
||||
if(_hideSource != hideSource) {
|
||||
_hideSource = hideSource;
|
||||
[self.characterTableView reloadData];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setPickedValue:(NSString *)pickedValue {
|
||||
_pickedValue = [pickedValue copy];
|
||||
[self _updatePickedStatus];
|
||||
}
|
||||
|
||||
- (void)_updatePickedStatus {
|
||||
self.pickedStatusTextField.stringValue = [NSString stringWithFormat:@"%ld characters remaining", self.pickedValue.composedCharacterLength];
|
||||
}
|
||||
|
||||
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
|
||||
if(tableView != self.characterTableView) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
|
||||
NSTableCellView *view = [tableView makeViewWithIdentifier:@"Cell" owner:self];
|
||||
NSInteger index = [tableView.tableColumns indexOfObjectIdenticalTo:tableColumn];
|
||||
if(index == NSNotFound) {
|
||||
view.textField.stringValue = @"?";
|
||||
}
|
||||
view.textField.stringValue = self.hideSource ? @"•" : [self.sourceValue composedCharacterAtIndex:index];
|
||||
return view;
|
||||
}
|
||||
|
||||
- (void)tableView:(NSTableView *)tableView didClickTableColumn:(NSTableColumn *)tableColumn {
|
||||
NSInteger index = [tableView.tableColumns indexOfObjectIdenticalTo:tableColumn];
|
||||
if(index == NSNotFound) {
|
||||
return;
|
||||
}
|
||||
if(self.pickedValue) {
|
||||
self.pickedValue = [self.pickedValue stringByAppendingString:[self.sourceValue composedCharacterAtIndex:index]];
|
||||
}
|
||||
else {
|
||||
self.pickedValue = [self.sourceValue composedCharacterAtIndex:index];
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)finishedPicking:(id)sender {
|
||||
[NSApp stopModalWithCode:NSModalResponseOK];
|
||||
}
|
||||
|
||||
- (IBAction)cancelPicking:(id)sender {
|
||||
[NSApp stopModalWithCode:NSModalResponseCancel];
|
||||
}
|
||||
|
||||
@end
|
||||
@@ -25,6 +25,8 @@
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@class MPPluginHost;
|
||||
@class MPAutotypeCommand;
|
||||
@class KPKEntry;
|
||||
|
||||
FOUNDATION_EXPORT NSString *const kMPPluginFileExtension;
|
||||
|
||||
@@ -35,6 +37,14 @@ FOUNDATION_EXPORT NSString *const kMPPluginFileExtension;
|
||||
@property (copy, readonly) NSString *version;
|
||||
@property (nonatomic, strong, readonly) NSBundle *bundle;
|
||||
|
||||
|
||||
/**
|
||||
If your plugin needs initalization override this method but you have to call [super initWithPluginHost:]
|
||||
Otherwise your plugin might not get registered correctly
|
||||
|
||||
@param host plugin host hosting the pluing - MacPass
|
||||
@return the plugin instance ready for use
|
||||
*/
|
||||
- (instancetype)initWithPluginHost:(MPPluginHost *)host NS_DESIGNATED_INITIALIZER;
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
@@ -49,6 +59,43 @@ FOUNDATION_EXPORT NSString *const kMPPluginFileExtension;
|
||||
|
||||
@end
|
||||
|
||||
/* Adopt this protocoll if you plugin supplied additinal autotype commands */
|
||||
@protocol MPAutotypePlugin <NSObject>
|
||||
@required
|
||||
/**
|
||||
Returns an array of string of commands supported by this pluing. Leave out enclosing curly brackets!
|
||||
E.g. if you support {FOO} and {BAR} you will return @[ @"FOO", @"BAR" ]. The autotype system is case insenstivie.
|
||||
*/
|
||||
@property (nonatomic,copy) NSArray <NSString *> *commandStrings;
|
||||
/**
|
||||
Will be called by the plugin host to generate autotype commands for the corresponding string.
|
||||
Command strings are considered case insensitive but mostly will be used in upper case.
|
||||
You should therefore compare case insensitive.
|
||||
|
||||
@param commandString The command string without any enclosing curly brackets. The string is normalized to upper cased.
|
||||
@param entry The entry for which the command will be used
|
||||
@return a command for the supplied string, return nil if parsing fails or an unsupported command is supplied
|
||||
*/
|
||||
- (MPAutotypeCommand * _Nullable)commandForString:(NSString *)commandString entry:(KPKEntry *)entry;
|
||||
@end
|
||||
|
||||
/*
|
||||
Adopt this protocoll if your plugin supports actions on entries.
|
||||
Actions will get listed in various places in menues. You should shoudl supply a valid menu item
|
||||
that is wired up with the correct target and action. Since there's responder chain resolving involved
|
||||
as well as a
|
||||
*/
|
||||
@protocol MPEntryActionPlugin <NSObject>
|
||||
@optional
|
||||
- (NSMenuItem * _Nullable)menuItemForEntry;
|
||||
@end
|
||||
|
||||
@protocol MPCustomAttributePlugin <NSObject>
|
||||
@optional
|
||||
/* Supply a list of attribute keys that will get suggested for autocompletion as well as added to the extend add for custom fields */
|
||||
@property (nonatomic,copy) NSArray<NSString *>* attributeKeys;
|
||||
@end
|
||||
|
||||
@interface MPPlugin (Deprecated)
|
||||
|
||||
- (instancetype)initWithPluginManager:(id)manager;
|
||||
|
||||
@@ -44,4 +44,8 @@ FOUNDATION_EXPORT NSString *const MPPluginHostPluginBundleIdentifiyerKey;
|
||||
- (void)disablePlugin:(MPPlugin *)plugin;
|
||||
- (void)enablePlugin:(MPPlugin *)plugin;
|
||||
|
||||
/*
|
||||
- (NSArray <MPPlugin __kindof*>*)autotypePlugins;
|
||||
- (NSArray <MPPlugin __kindof*>*)entryContextMenuPlugins;
|
||||
*/
|
||||
@end
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
|
||||
#import "MPDocument.h"
|
||||
#import "MPSettingsHelper.h"
|
||||
#import "MPPickcharViewController.h"
|
||||
|
||||
@interface MPTreeDelegate ();
|
||||
|
||||
@@ -53,15 +54,12 @@
|
||||
return self.document.undoManager;
|
||||
}
|
||||
|
||||
- (NSString *)resolvePlaceholder:(NSString *)placeholder forTree:(KPKTree *)tree {
|
||||
- (NSString *)tree:(KPKTree *)tree resolvePlaceholder:(NSString *)placeholder forEntry:(KPKEntry *)entry {
|
||||
if([placeholder isEqualToString:kKPKPlaceholderDatabasePath]) {
|
||||
return self.document.fileURL.path;
|
||||
}
|
||||
if([placeholder isEqualToString:kKPKPlaceholderDatabaseFolder]) {
|
||||
return self.document.fileURL.path;
|
||||
}
|
||||
if([placeholder isEqualToString:kKPKPlaceholderDatabaseName]) {
|
||||
return self.document.tree.metaData.databaseName;
|
||||
return self.document.fileURL.path;
|
||||
}
|
||||
if([placeholder isEqualToString:kKPKPlaceholderDatabaseBasename]) {
|
||||
return @"";
|
||||
@@ -80,4 +78,35 @@
|
||||
}
|
||||
return @"";
|
||||
}
|
||||
|
||||
- (NSString *)tree:(KPKTree *)tree resolvePickFieldPlaceholderForEntry:(KPKEntry *)entry {
|
||||
return @"";
|
||||
}
|
||||
|
||||
- (NSString *)tree:(KPKTree *)tree resolvePickCharsPlaceholderForEntry:(KPKEntry *)entry field:(NSString *)field options:(NSString *)options {
|
||||
|
||||
NSString *value = [[entry valueForAttributeWithKey:field] kpk_finalValueForEntry:entry];
|
||||
if(value.length == 0) {
|
||||
return @""; // error while retrieving source value
|
||||
}
|
||||
|
||||
MPPickcharViewController *pickCharViewController = [[MPPickcharViewController alloc] init];
|
||||
|
||||
pickCharViewController.sourceValue = value;
|
||||
pickCharViewController.countToPick = 10;
|
||||
|
||||
|
||||
NSPanel *panel = [[NSPanel alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
|
||||
styleMask:NSWindowStyleMaskNonactivatingPanel|NSWindowStyleMaskTitled|NSWindowStyleMaskResizable
|
||||
backing:NSBackingStoreRetained
|
||||
defer:YES];
|
||||
panel.level = NSScreenSaverWindowLevel;
|
||||
panel.contentViewController = pickCharViewController;
|
||||
[panel center];
|
||||
if(NSModalResponseOK == [NSApp runModalForWindow:panel]) {
|
||||
/* add appropriate key press comamnds? or let the pick-char view-controller handel this? */
|
||||
return pickCharViewController.pickedValue;
|
||||
}
|
||||
return @"";
|
||||
}
|
||||
@end
|
||||
|
||||
163
MacPass/PickcharView.xib
Normal file
163
MacPass/PickcharView.xib
Normal file
@@ -0,0 +1,163 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="13529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||
<dependencies>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="13529"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<customObject id="-2" userLabel="File's Owner" customClass="MPPickcharViewController">
|
||||
<connections>
|
||||
<outlet property="characterTableView" destination="KJq-FZ-rAE" id="H5Y-kG-Mvm"/>
|
||||
<outlet property="pickedStatusTextField" destination="e2q-qh-Zlv" id="paL-BH-g7a"/>
|
||||
<outlet property="pickedValueTextField" destination="KQ1-tZ-qja" id="ETe-j3-jdp"/>
|
||||
<outlet property="togglePasswordDisplayButton" destination="hKI-WP-N93" id="ZDt-Rp-Ix2"/>
|
||||
<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="410" height="165"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="249" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="KQ1-tZ-qja" customClass="HNHUIRoundedSecureTextField">
|
||||
<rect key="frame" x="20" y="49" width="276" height="24"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" state="on" borderStyle="bezel" drawsBackground="YES" id="Wi0-xp-KgI">
|
||||
<font key="font" size="13" name="Menlo-Regular"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="hKI-WP-N93">
|
||||
<rect key="frame" x="361" y="48" width="29" height="25"/>
|
||||
<buttonCell key="cell" type="roundTextured" bezelStyle="texturedRounded" image="NSQuickLookTemplate" imagePosition="only" alignment="center" lineBreakMode="truncatingTail" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="95g-dp-50Q">
|
||||
<behavior key="behavior" pushIn="YES" changeContents="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
</button>
|
||||
<scrollView horizontalLineScroll="26" horizontalPageScroll="10" verticalLineScroll="26" verticalPageScroll="10" hasVerticalScroller="NO" usesPredominantAxisScrolling="NO" verticalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="MVS-ug-wys">
|
||||
<rect key="frame" x="20" y="81" width="370" height="64"/>
|
||||
<clipView key="contentView" drawsBackground="NO" id="8aa-cB-mUF">
|
||||
<rect key="frame" x="1" y="0.0" width="368" height="63"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" selectionHighlightStyle="none" columnReordering="NO" columnResizing="NO" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" typeSelect="NO" rowHeight="24" rowSizeStyle="systemDefault" headerView="GRO-H1-N4r" viewBased="YES" id="KJq-FZ-rAE">
|
||||
<rect key="frame" x="0.0" y="0.0" width="368" height="40"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<size key="intercellSpacing" width="3" height="2"/>
|
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
|
||||
<tableColumns>
|
||||
<tableColumn width="365" minWidth="40" maxWidth="1000" id="Q1b-ir-hyW">
|
||||
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
|
||||
</tableHeaderCell>
|
||||
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="pUG-4c-rTt">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||
<prototypeCellViews>
|
||||
<tableCellView identifier="Cell" id="Nz8-0B-uHk">
|
||||
<rect key="frame" x="1" y="1" width="365" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="prY-vi-i8N">
|
||||
<rect key="frame" x="0.0" y="0.0" width="365" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="v3T-2f-yWm">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
</subviews>
|
||||
<connections>
|
||||
<outlet property="textField" destination="prY-vi-i8N" id="uX4-gz-scd"/>
|
||||
</connections>
|
||||
</tableCellView>
|
||||
</prototypeCellViews>
|
||||
</tableColumn>
|
||||
</tableColumns>
|
||||
<connections>
|
||||
<outlet property="dataSource" destination="-2" id="UrQ-DY-2jn"/>
|
||||
<outlet property="delegate" destination="-2" id="JRz-9a-dkH"/>
|
||||
</connections>
|
||||
</tableView>
|
||||
</subviews>
|
||||
<nil key="backgroundColor"/>
|
||||
</clipView>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="64" id="AIX-Tc-QJA"/>
|
||||
</constraints>
|
||||
<scroller key="horizontalScroller" verticalHuggingPriority="750" horizontal="YES" id="sA9-kc-O5g">
|
||||
<rect key="frame" x="1" y="47" width="368" height="16"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="mSX-pm-wrh">
|
||||
<rect key="frame" x="-100" y="-100" width="15" height="102"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
<tableHeaderView key="headerView" id="GRO-H1-N4r">
|
||||
<rect key="frame" x="0.0" y="0.0" width="368" height="23"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</tableHeaderView>
|
||||
</scrollView>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="k8l-uy-C3l">
|
||||
<rect key="frame" x="324" y="13" width="72" height="32"/>
|
||||
<buttonCell key="cell" type="push" title="Done" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8vP-Ka-vsA">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="finishedPicking:" target="-1" id="Gb1-1S-8bv"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Y8X-Bm-qLt">
|
||||
<rect key="frame" x="304" y="48" width="49" height="25"/>
|
||||
<buttonCell key="cell" type="roundTextured" title="Reset" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Emo-pg-Mfe">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="reset:" target="-2" id="jCN-qH-N8O"/>
|
||||
</connections>
|
||||
</button>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="e2q-qh-Zlv">
|
||||
<rect key="frame" x="187" y="20" width="37" height="17"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Label" id="M3h-q8-FLO">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="hKI-WP-N93" secondAttribute="trailing" constant="20" symbolic="YES" id="0IY-n6-nZi"/>
|
||||
<constraint firstItem="hKI-WP-N93" firstAttribute="centerY" secondItem="KQ1-tZ-qja" secondAttribute="centerY" id="1CC-7F-3GU"/>
|
||||
<constraint firstItem="KQ1-tZ-qja" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="1D9-Zk-KrZ"/>
|
||||
<constraint firstItem="k8l-uy-C3l" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="e2q-qh-Zlv" secondAttribute="trailing" constant="8" symbolic="YES" id="7VJ-ri-ltE"/>
|
||||
<constraint firstItem="MVS-ug-wys" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="9cE-TT-pqS"/>
|
||||
<constraint firstItem="hKI-WP-N93" firstAttribute="leading" secondItem="Y8X-Bm-qLt" secondAttribute="trailing" constant="8" id="AVv-zt-6sj"/>
|
||||
<constraint firstAttribute="trailing" secondItem="k8l-uy-C3l" secondAttribute="trailing" constant="20" symbolic="YES" id="Eaa-oF-Lt5"/>
|
||||
<constraint firstItem="MVS-ug-wys" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" symbolic="YES" id="Klq-Q9-Rjp"/>
|
||||
<constraint firstItem="Y8X-Bm-qLt" firstAttribute="leading" secondItem="KQ1-tZ-qja" secondAttribute="trailing" constant="8" id="Qxu-Wk-ckL"/>
|
||||
<constraint firstItem="Y8X-Bm-qLt" firstAttribute="centerY" secondItem="KQ1-tZ-qja" secondAttribute="centerY" id="T81-yL-LEh"/>
|
||||
<constraint firstAttribute="bottom" secondItem="k8l-uy-C3l" secondAttribute="bottom" constant="20" symbolic="YES" id="UXs-2n-gB5"/>
|
||||
<constraint firstItem="k8l-uy-C3l" firstAttribute="top" secondItem="KQ1-tZ-qja" secondAttribute="bottom" constant="8" symbolic="YES" id="kn5-3q-Pae"/>
|
||||
<constraint firstAttribute="bottom" secondItem="e2q-qh-Zlv" secondAttribute="bottom" constant="20" symbolic="YES" id="l3c-Ig-Z3V"/>
|
||||
<constraint firstAttribute="trailing" secondItem="MVS-ug-wys" secondAttribute="trailing" constant="20" symbolic="YES" id="mMv-HC-fEv"/>
|
||||
<constraint firstItem="KQ1-tZ-qja" firstAttribute="top" secondItem="MVS-ug-wys" secondAttribute="bottom" constant="8" symbolic="YES" id="nKb-eh-ba4"/>
|
||||
<constraint firstItem="e2q-qh-Zlv" firstAttribute="centerX" secondItem="Hz6-mo-xeY" secondAttribute="centerX" id="tE5-PK-tp0"/>
|
||||
</constraints>
|
||||
<point key="canvasLocation" x="-769" y="-173"/>
|
||||
</customView>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="NSQuickLookTemplate" width="19" height="12"/>
|
||||
</resources>
|
||||
</document>
|
||||
Reference in New Issue
Block a user