rough version of {PICKFIELD}

This commit is contained in:
Michael Starke
2017-11-28 18:33:37 +01:00
parent d8351f12f2
commit 6d8c2b34be
8 changed files with 407 additions and 1 deletions

View File

@@ -176,6 +176,9 @@
4C7F8B681A10B68400CCB83D /* WelcomeWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C7F8B6A1A10B68400CCB83D /* WelcomeWindow.xib */; };
4C80304A1E2FBAA300133E4C /* MPTestKeyMapper.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8030491E2FBAA300133E4C /* MPTestKeyMapper.m */; };
4C811C8316ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C811C8216ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m */; };
4C82046A1FCDC07800EB24A4 /* MPPickfieldViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C8204681FCDC07800EB24A4 /* MPPickfieldViewController.m */; };
4C82046B1FCDC07800EB24A4 /* PickfieldView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4C8204691FCDC07800EB24A4 /* PickfieldView.xib */; };
4C82046E1FCDC8A100EB24A4 /* MPPickfieldTableModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C82046D1FCDC8A100EB24A4 /* MPPickfieldTableModel.m */; };
4C83814215BF4677001AE468 /* MPDocumentWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C83814115BF4677001AE468 /* MPDocumentWindowController.m */; };
4C888C9016EB6C91003D34A1 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4C888C8E16EB6C91003D34A1 /* Localizable.strings */; };
4C888C9316EB6F5E003D34A1 /* MPToolbarItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C888C9216EB6F5E003D34A1 /* MPToolbarItem.m */; };
@@ -609,6 +612,11 @@
4C8030491E2FBAA300133E4C /* MPTestKeyMapper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTestKeyMapper.m; sourceTree = "<group>"; };
4C811C8116ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPKeyfilePathControlDelegate.h; sourceTree = "<group>"; };
4C811C8216ECD06E00C4BAC6 /* MPKeyfilePathControlDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPKeyfilePathControlDelegate.m; sourceTree = "<group>"; };
4C8204671FCDC07800EB24A4 /* MPPickfieldViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPickfieldViewController.h; sourceTree = "<group>"; };
4C8204681FCDC07800EB24A4 /* MPPickfieldViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPickfieldViewController.m; sourceTree = "<group>"; };
4C8204691FCDC07800EB24A4 /* PickfieldView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PickfieldView.xib; sourceTree = "<group>"; };
4C82046C1FCDC8A100EB24A4 /* MPPickfieldTableModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPickfieldTableModel.h; sourceTree = "<group>"; };
4C82046D1FCDC8A100EB24A4 /* MPPickfieldTableModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPickfieldTableModel.m; sourceTree = "<group>"; };
4C83814015BF4677001AE468 /* MPDocumentWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPDocumentWindowController.h; sourceTree = "<group>"; };
4C83814115BF4677001AE468 /* MPDocumentWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPDocumentWindowController.m; sourceTree = "<group>"; };
4C840C441D773E5D0081F605 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/DatabaseSettingsWindow.strings; sourceTree = "<group>"; };
@@ -1082,6 +1090,8 @@
4C6B7C7C18BE7EB0001D5D77 /* MPDocument+History.m */,
4C0AF62D195C1F2B009E658D /* MPEntrySearchContext.h */,
4C0AF62E195C1F2B009E658D /* MPEntrySearchContext.m */,
4C82046C1FCDC8A100EB24A4 /* MPPickfieldTableModel.h */,
4C82046D1FCDC8A100EB24A4 /* MPPickfieldTableModel.m */,
);
name = Model;
sourceTree = "<group>";
@@ -1443,6 +1453,9 @@
4CD4EE101FC7284000EA6EB3 /* MPPickcharViewController.h */,
4CD4EE111FC7284000EA6EB3 /* MPPickcharViewController.m */,
4CA4B3451FC88339007DF507 /* PickcharView.xib */,
4C8204671FCDC07800EB24A4 /* MPPickfieldViewController.h */,
4C8204681FCDC07800EB24A4 /* MPPickfieldViewController.m */,
4C8204691FCDC07800EB24A4 /* PickfieldView.xib */,
);
name = "View Controller";
sourceTree = "<group>";
@@ -1701,6 +1714,7 @@
4C3826B51AD04D8E007D7D67 /* 40_FindMailTemplate.pdf in Resources */,
4C2E381F16D11FF900037A9D /* 05_LanguagesTemplate.pdf in Resources */,
4C3826721AD04B51007D7D67 /* addFolderTemplate.pdf in Resources */,
4C82046B1FCDC07800EB24A4 /* PickfieldView.xib in Resources */,
4C3826C21AD04D8E007D7D67 /* 55_ThumbnailTemplate.pdf in Resources */,
4C3826A61AD04D8E007D7D67 /* 22_ASCIITemplate.pdf in Resources */,
4CD78ABC16D155FF00768A1D /* 07_NotepadTemplate.pdf in Resources */,
@@ -1822,6 +1836,7 @@
4CA0B2FC15BCAF8600654E32 /* MPSettingsWindowController.m in Sources */,
4C4F72D118DF704400E8D378 /* DDHotKeyTextField.m in Sources */,
4C83814215BF4677001AE468 /* MPDocumentWindowController.m in Sources */,
4C82046A1FCDC07800EB24A4 /* MPPickfieldViewController.m in Sources */,
4C2E382316D1421B00037A9D /* MPIconHelper.m in Sources */,
4C2E382616D1470200037A9D /* MPViewController.m in Sources */,
4C65FAE916D16DDB006E0577 /* MPPasswordInputController.m in Sources */,
@@ -1870,6 +1885,7 @@
4CE30ACC1A312B7F0063FCC6 /* MPReferenceBuilderViewController.m in Sources */,
4C6F228C19A4AA700012310C /* MPAutotypeDelay.m in Sources */,
4C3C4EAF18D7039300153127 /* MPValueTransformerHelper.m in Sources */,
4C82046E1FCDC8A100EB24A4 /* MPPickfieldTableModel.m in Sources */,
4C978E0D19AE54AB003067DF /* MPFlagsHelper.m in Sources */,
4C6F228919A4A7F90012310C /* MPAutotypeClear.m in Sources */,
4C0B038C18E36DA400B9F9C9 /* MPFixAutotypeWindowController.m in Sources */,

View File

@@ -0,0 +1,33 @@
//
// MPPickfieldTableModel.h
// MacPass
//
// Created by Michael Starke on 28.11.17.
// Copyright © 2017 HicknHack Software GmbH. All rights reserved.
//
#import <Foundation/Foundation.h>
@class MPDocument;
@class KPKEntry;
@interface MPPickFieldTableModelRowItem : NSObject
@property (copy) NSString *name;
@property (copy) NSString *value;
@property BOOL isGroup;
+ (instancetype)groupItemWithName:(NSString *)name;
+ (instancetype)itemWithName:(NSString *)name value:(NSString *)value;
@end
@interface MPPickfieldTableModel : NSObject
@property (copy) NSArray<MPPickFieldTableModelRowItem *> *items;
- (instancetype)initWithEntry:(KPKEntry *)entry inDocument:(MPDocument *)document;
- (MPPickFieldTableModelRowItem *)itemAtIndex:(NSUInteger)index;
@end

View File

@@ -0,0 +1,72 @@
//
// MPPickfieldTableModel.m
// MacPass
//
// Created by Michael Starke on 28.11.17.
// Copyright © 2017 HicknHack Software GmbH. All rights reserved.
//
#import "MPPickfieldTableModel.h"
#import <KeePassKit/KeePassKit.h>
@implementation MPPickFieldTableModelRowItem
- (instancetype)init {
self = [super init];
if(self) {
_isGroup = NO;
}
return self;
}
+ (instancetype)groupItemWithName:(NSString *)name {
MPPickFieldTableModelRowItem *item = [self itemWithName:name value:nil];
item.isGroup = YES;
return item;
}
+ (instancetype)itemWithName:(NSString *)name value:(NSString *)value {
MPPickFieldTableModelRowItem *item = [[MPPickFieldTableModelRowItem alloc] init];
item.name = name;
item.value = value;
return item;
}
@end
@implementation MPPickfieldTableModel
- (instancetype)initWithEntry:(KPKEntry *)entry inDocument:(MPDocument *)document {
self = [super init];
if(self) {
[self _setupItemsForEntry:entry document:document];
}
return self;
}
- (void)_setupItemsForEntry:(KPKEntry *)entry document:(MPDocument *)document {
/* Default attributes */
NSMutableArray *items = [[NSMutableArray alloc] init];
[items addObject:[MPPickFieldTableModelRowItem groupItemWithName:NSLocalizedString(@"ENTRY_DEFAULT_ATTRIBUTES", @"Group row for entry attributes")]];
for(KPKAttribute *attribute in entry.defaultAttributes) {
/* TODO exclude protected values */
[items addObject:[MPPickFieldTableModelRowItem itemWithName:attribute.key value:attribute.value]];
}
[items addObject:[MPPickFieldTableModelRowItem groupItemWithName:NSLocalizedString(@"ENTRY_CUSTOM_ATTRIBUTES", @"Group row for entry attributes")]];
for(KPKAttribute *attribute in entry.customAttributes) {
/* TODO exclude protected values */
[items addObject:[MPPickFieldTableModelRowItem itemWithName:attribute.key value:attribute.value]];
}
self.items = items; // copy creates an immutable copy
}
- (MPPickFieldTableModelRowItem *)itemAtIndex:(NSUInteger)index {
if(index < _items.count) {
return _items[index];
}
return nil;
}
@end

View File

@@ -0,0 +1,20 @@
//
// MPPickfieldViewController.h
// MacPass
//
// Created by Michael Starke on 28.11.17.
// Copyright © 2017 HicknHack Software GmbH. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@class MPDocument;
@interface MPPickfieldViewController : NSViewController
@property (weak) MPDocument *document;
@property (copy, readonly) NSString *pickedValue;
- (IBAction)pickField:(id)sender;
@end

View File

@@ -0,0 +1,95 @@
//
// MPPickfieldViewController.m
// MacPass
//
// Created by Michael Starke on 28.11.17.
// Copyright © 2017 HicknHack Software GmbH. All rights reserved.
//
#import "MPPickfieldViewController.h"
#import "MPPickfieldTableModel.h"
#import <KeePassKit/KeePassKit.h>
@interface MPPickfieldViewController () <NSTableViewDelegate, NSTableViewDataSource>
@property (nonatomic, strong, readonly) KPKEntry *representedEntry;
@property (strong) MPPickfieldTableModel *tableModel;
@property (weak) IBOutlet NSTableView *tableView;
@property (copy) NSString *pickedValue;
@end
@implementation MPPickfieldViewController
@dynamic representedEntry;
- (NSString *)nibName {
return @"PickfieldView";
}
- (void)viewDidLoad {
[super viewDidLoad];
self.tableModel = [[MPPickfieldTableModel alloc] initWithEntry:self.representedEntry inDocument:nil];
}
- (KPKEntry *)representedEntry {
if([self.representedObject isKindOfClass:KPKEntry.class]) {
return self.representedObject;
}
return nil;
}
- (void)pickField:(id)sender {
[NSApp stopModalWithCode:NSModalResponseOK];
}
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return self.tableModel.items.count;
}
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
NSTableCellView *view;
if(tableColumn) {
view = [tableView makeViewWithIdentifier:@"DataCell" owner:self];
}
else {
view = [tableView makeViewWithIdentifier:@"HeaderCell" owner:self];
}
MPPickFieldTableModelRowItem *rowItem = [self.tableModel itemAtIndex:row];
view.textField.stringValue = @"";
if(!rowItem) {
return view;
}
/* group view or first column */
if(tableColumn == nil || [tableColumn.identifier isEqualToString:@"AutomaticTableColumnIdentifier.0"]) {
view.textField.stringValue = rowItem.name;
}
else if([tableColumn.identifier isEqualToString:@"AutomaticTableColumnIdentifier.1"]) {
view.textField.stringValue = rowItem.value;
}
return view;
}
- (BOOL)tableView:(NSTableView *)tableView isGroupRow:(NSInteger)row {
MPPickFieldTableModelRowItem *rowItem = [self.tableModel itemAtIndex:row];
return rowItem.isGroup;
}
- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row {
return ![self tableView:tableView isGroupRow:row];
}
- (void)tableViewSelectionDidChange:(NSNotification *)notification {
NSTableView *tableView = notification.object;
if(tableView.selectedRow < 0) {
self.pickedValue = @"";
}
else {
MPPickFieldTableModelRowItem *item = [self.tableModel itemAtIndex:tableView.selectedRow];
self.pickedValue = item ? item.value : @"";
}
}
@end

View File

@@ -25,6 +25,7 @@
#import "MPDocument.h"
#import "MPSettingsHelper.h"
#import "MPPickcharViewController.h"
#import "MPPickfieldViewController.h"
@interface MPTreeDelegate ();
@@ -80,6 +81,22 @@
}
- (NSString *)tree:(KPKTree *)tree resolvePickFieldPlaceholderForEntry:(KPKEntry *)entry {
MPPickfieldViewController *pickFieldViewController = [[MPPickfieldViewController alloc] init];
pickFieldViewController.representedObject = entry;
NSPanel *panel = [[NSPanel alloc] initWithContentRect:NSMakeRect(0, 0, 100, 100)
styleMask:NSWindowStyleMaskNonactivatingPanel|NSWindowStyleMaskTitled|NSWindowStyleMaskResizable
backing:NSBackingStoreRetained
defer:YES];
panel.level = NSScreenSaverWindowLevel;
panel.contentViewController = pickFieldViewController;
panel.title = NSLocalizedString(@"PICKFIELD_WINDOW_TITLE", @"Window displayed to the user to pick an amout of characters");
[panel center];
if(NSModalResponseOK == [NSApp runModalForWindow:panel]) {
/* add appropriate key press comamnds? or let the pick-char view-controller handel this? */
return pickFieldViewController.pickedValue;
}
return @"";
}

View File

@@ -154,7 +154,7 @@
<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"/>
<point key="canvasLocation" x="-917" y="-230"/>
</customView>
</objects>
<resources>

153
MacPass/PickfieldView.xib Normal file
View File

@@ -0,0 +1,153 @@
<?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="MPPickfieldViewController">
<connections>
<outlet property="tableView" destination="5xi-x0-G4W" id="Tm9-fm-aqh"/>
<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="474" height="378"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="BDL-W9-psF">
<rect key="frame" x="18" y="341" width="237" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Please pick a field value to be inserted" id="aJS-22-6Va">
<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>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="n1E-iQ-yd7">
<rect key="frame" x="388" y="13" width="72" height="32"/>
<buttonCell key="cell" type="push" title="Done" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="6Wi-9i-Tcb">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="pickField:" target="-1" id="4cZ-5D-Nlf"/>
</connections>
</button>
<scrollView autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nlF-dy-Ttg">
<rect key="frame" x="20" y="61" width="434" height="272"/>
<clipView key="contentView" id="am4-w0-FSd">
<rect key="frame" x="1" y="0.0" width="432" height="271"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" headerView="jX4-Gp-btT" viewBased="YES" id="5xi-x0-G4W">
<rect key="frame" x="0.0" y="0.0" width="436" height="248"/>
<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="118" minWidth="40" maxWidth="1000" id="0H9-DW-Jyj">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" title="Field">
<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="fil-tT-GXX">
<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="DataCell" id="s1C-7e-04S">
<rect key="frame" x="1" y="1" width="118" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField identifier="DataCell" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ADN-XZ-Lq7">
<rect key="frame" x="0.0" y="0.0" width="118" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="e8U-mE-mZh">
<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="ADN-XZ-Lq7" id="7zs-7K-4Wg"/>
</connections>
</tableCellView>
<tableCellView identifier="HeaderCell" id="wpe-VG-m1j">
<rect key="frame" x="1" y="20" width="118" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="6sH-Uk-P1B">
<rect key="frame" x="0.0" y="0.0" width="118" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Header View Cell" id="kTy-VO-Xlg">
<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="6sH-Uk-P1B" id="4fT-uR-lzM"/>
</connections>
</tableCellView>
</prototypeCellViews>
</tableColumn>
<tableColumn width="312" minWidth="40" maxWidth="1000" id="rVo-ud-5fs">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" title="Value">
<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="z1F-Bi-PBg">
<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"/>
</tableColumn>
</tableColumns>
<connections>
<outlet property="dataSource" destination="-2" id="66g-fd-91p"/>
<outlet property="delegate" destination="-2" id="DaT-Xh-Etj"/>
</connections>
</tableView>
</subviews>
</clipView>
<scroller key="horizontalScroller" verticalHuggingPriority="750" horizontal="YES" id="RHy-ph-0lP">
<rect key="frame" x="1" y="255" width="432" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="b5D-WW-IPI">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<tableHeaderView key="headerView" id="jX4-Gp-btT">
<rect key="frame" x="0.0" y="0.0" width="436" height="23"/>
<autoresizingMask key="autoresizingMask"/>
</tableHeaderView>
</scrollView>
</subviews>
<constraints>
<constraint firstItem="BDL-W9-psF" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="11J-Yq-T60"/>
<constraint firstItem="n1E-iQ-yd7" firstAttribute="top" secondItem="nlF-dy-Ttg" secondAttribute="bottom" constant="20" symbolic="YES" id="7i7-Zj-Aco"/>
<constraint firstItem="nlF-dy-Ttg" firstAttribute="top" secondItem="BDL-W9-psF" secondAttribute="bottom" constant="8" symbolic="YES" id="JQU-HY-3hx"/>
<constraint firstItem="n1E-iQ-yd7" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="P1O-O7-bxC"/>
<constraint firstItem="nlF-dy-Ttg" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="RH7-aQ-wKU"/>
<constraint firstAttribute="bottom" secondItem="n1E-iQ-yd7" secondAttribute="bottom" constant="20" symbolic="YES" id="SBF-2E-hzT"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="BDL-W9-psF" secondAttribute="trailing" constant="20" symbolic="YES" id="W73-3d-vkM"/>
<constraint firstItem="BDL-W9-psF" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" symbolic="YES" id="p0t-q5-CZ1"/>
<constraint firstAttribute="trailing" secondItem="n1E-iQ-yd7" secondAttribute="trailing" constant="20" symbolic="YES" id="rJE-FS-dLo"/>
<constraint firstAttribute="trailing" secondItem="nlF-dy-Ttg" secondAttribute="trailing" constant="20" symbolic="YES" id="yiP-Kc-fqd"/>
</constraints>
<point key="canvasLocation" x="-43" y="-58"/>
</customView>
</objects>
</document>