Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7c741d0d38 | |||
| 9065c5db02 | |||
| 41c9af00a8 | |||
| a710f923e6 |
Binary file not shown.
|
Before Width: | Height: | Size: 503 KiB After Width: | Height: | Size: 514 KiB |
@@ -26,8 +26,8 @@
|
||||
05D7472021924D1F002CF085 /* AboutWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05D7471F21924D1F002CF085 /* AboutWindowController.swift */; };
|
||||
05E3745521925281000C6736 /* GitHubUpdates.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 05E3745121925277000C6736 /* GitHubUpdates.framework */; };
|
||||
05E3745921925294000C6736 /* GitHubUpdates.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 05E3745121925277000C6736 /* GitHubUpdates.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
05E3745B219253B5000C6736 /* ArrayIsEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05E3745A219253B5000C6736 /* ArrayIsEmpty.swift */; };
|
||||
05E3745D2192545A000C6736 /* ArrayIsNotEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05E3745C2192545A000C6736 /* ArrayIsNotEmpty.swift */; };
|
||||
05E3745B219253B5000C6736 /* IsEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05E3745A219253B5000C6736 /* IsEmpty.swift */; };
|
||||
05E3745D2192545A000C6736 /* IsNotEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05E3745C2192545A000C6736 /* IsNotEmpty.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
@@ -130,8 +130,8 @@
|
||||
05D7471D21924D18002CF085 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/Notarize.AboutWindowController.xib; sourceTree = "<group>"; };
|
||||
05D7471F21924D1F002CF085 /* AboutWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AboutWindowController.swift; sourceTree = "<group>"; };
|
||||
05E3744B21925276000C6736 /* GitHubUpdates.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = GitHubUpdates.xcodeproj; path = Submodules/GitHubUpdates/GitHubUpdates.xcodeproj; sourceTree = "<group>"; };
|
||||
05E3745A219253B5000C6736 /* ArrayIsEmpty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrayIsEmpty.swift; sourceTree = "<group>"; };
|
||||
05E3745C2192545A000C6736 /* ArrayIsNotEmpty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrayIsNotEmpty.swift; sourceTree = "<group>"; };
|
||||
05E3745A219253B5000C6736 /* IsEmpty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IsEmpty.swift; sourceTree = "<group>"; };
|
||||
05E3745C2192545A000C6736 /* IsNotEmpty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IsNotEmpty.swift; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -202,8 +202,8 @@
|
||||
05D746B92191F0BB002CF085 /* Keychain.swift */,
|
||||
059A0B60219050A3004E1D89 /* MainWindowController.swift */,
|
||||
05D7469121919DE7002CF085 /* Preferences.swift */,
|
||||
05E3745A219253B5000C6736 /* ArrayIsEmpty.swift */,
|
||||
05E3745C2192545A000C6736 /* ArrayIsNotEmpty.swift */,
|
||||
05E3745A219253B5000C6736 /* IsEmpty.swift */,
|
||||
05E3745C2192545A000C6736 /* IsNotEmpty.swift */,
|
||||
);
|
||||
path = Classes;
|
||||
sourceTree = "<group>";
|
||||
@@ -475,14 +475,14 @@
|
||||
05D7469421919F53002CF085 /* Account.swift in Sources */,
|
||||
05D7472021924D1F002CF085 /* AboutWindowController.swift in Sources */,
|
||||
059A0B61219050A3004E1D89 /* MainWindowController.swift in Sources */,
|
||||
05E3745D2192545A000C6736 /* ArrayIsNotEmpty.swift in Sources */,
|
||||
05E3745D2192545A000C6736 /* IsNotEmpty.swift in Sources */,
|
||||
05D746E721923630002CF085 /* HistoryItem.swift in Sources */,
|
||||
05D746E021922726002CF085 /* ALTool.swift in Sources */,
|
||||
059A0B6921905534004E1D89 /* AccountWindowController.swift in Sources */,
|
||||
05D7469221919DE7002CF085 /* Preferences.swift in Sources */,
|
||||
059A0B5E2190504B004E1D89 /* ApplicationDelegate.swift in Sources */,
|
||||
05D746BA2191F0BB002CF085 /* Keychain.swift in Sources */,
|
||||
05E3745B219253B5000C6736 /* ArrayIsEmpty.swift in Sources */,
|
||||
05E3745B219253B5000C6736 /* IsEmpty.swift in Sources */,
|
||||
05D746E2219230FC002CF085 /* HistoryViewController.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
|
||||
@@ -68,6 +68,20 @@ class ALTool
|
||||
}
|
||||
}
|
||||
|
||||
func notarizationInfo( for uuid: String ) throws -> String?
|
||||
{
|
||||
do
|
||||
{
|
||||
let out = try ALTool.run( arguments: [ "--notarization-info", uuid, "-u", self.username, "-p", self.password, "--output-format", "xml" ] )
|
||||
|
||||
return out.trimmingCharacters( in: NSCharacterSet.whitespacesAndNewlines )
|
||||
}
|
||||
catch let e as NSError
|
||||
{
|
||||
throw e
|
||||
}
|
||||
}
|
||||
|
||||
private class func run( arguments: [ String ] ) throws -> String
|
||||
{
|
||||
var args = [ "altool" ]
|
||||
|
||||
@@ -26,11 +26,12 @@ import Cocoa
|
||||
|
||||
@objc class HistoryItem: NSObject
|
||||
{
|
||||
@objc public var date: NSDate
|
||||
@objc public var uuid: String
|
||||
@objc public var success: Bool
|
||||
@objc public var status: Int
|
||||
@objc public var message: String
|
||||
@objc public dynamic var date: NSDate
|
||||
@objc public dynamic var uuid: String
|
||||
@objc public dynamic var success: Bool
|
||||
@objc public dynamic var status: Int
|
||||
@objc public dynamic var message: String
|
||||
@objc public dynamic var logURL: String?
|
||||
|
||||
class func ItemsFromDictionary( dict: NSDictionary? ) -> [ HistoryItem ]
|
||||
{
|
||||
@@ -97,4 +98,19 @@ import Cocoa
|
||||
self.status = code.intValue
|
||||
self.message = message
|
||||
}
|
||||
|
||||
override func isEqual( _ object: Any? ) -> Bool
|
||||
{
|
||||
guard let o = object as? HistoryItem else
|
||||
{
|
||||
return false
|
||||
}
|
||||
|
||||
return self.uuid == o.uuid
|
||||
}
|
||||
|
||||
override var hash: Int
|
||||
{
|
||||
return self.uuid.hash
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,17 +24,19 @@
|
||||
|
||||
import Cocoa
|
||||
|
||||
class HistoryViewController: NSViewController
|
||||
class HistoryViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource
|
||||
{
|
||||
@IBOutlet private var itemsController: NSArrayController!
|
||||
|
||||
@objc private dynamic var loading = true
|
||||
@objc private dynamic var refreshing = false
|
||||
@objc private dynamic var items = [ HistoryItem ]()
|
||||
@objc private dynamic var loading = true
|
||||
@objc private dynamic var refreshing = false
|
||||
@objc private dynamic var gettingInfo = false
|
||||
@objc private dynamic var items = Set< HistoryItem >()
|
||||
|
||||
private var account: Account?
|
||||
private var timer: Timer?
|
||||
private var add: AccountWindowController?
|
||||
private var account: Account?
|
||||
private var refreshTimer: Timer?
|
||||
private var infoTimer: Timer?
|
||||
private var add: AccountWindowController?
|
||||
|
||||
convenience init( account: Account )
|
||||
{
|
||||
@@ -45,7 +47,8 @@ class HistoryViewController: NSViewController
|
||||
|
||||
deinit
|
||||
{
|
||||
self.timer?.invalidate()
|
||||
self.refreshTimer?.invalidate()
|
||||
self.infoTimer?.invalidate()
|
||||
}
|
||||
|
||||
override var nibName: NSNib.Name?
|
||||
@@ -61,10 +64,15 @@ class HistoryViewController: NSViewController
|
||||
|
||||
self.refresh( nil )
|
||||
|
||||
self.timer = Timer.scheduledTimer( withTimeInterval: 5, repeats: true )
|
||||
self.refreshTimer = Timer.scheduledTimer( withTimeInterval: 5, repeats: true )
|
||||
{
|
||||
t in self.refresh( userInitiated: false )
|
||||
}
|
||||
|
||||
self.infoTimer = Timer.scheduledTimer( withTimeInterval: 5, repeats: true )
|
||||
{
|
||||
t in self.getInfo()
|
||||
}
|
||||
}
|
||||
|
||||
@IBAction func refresh( _ sender: Any? )
|
||||
@@ -72,6 +80,21 @@ class HistoryViewController: NSViewController
|
||||
self.refresh( userInitiated: true )
|
||||
}
|
||||
|
||||
@IBAction func showInfo( _ sender: Any? )
|
||||
{
|
||||
guard let item = sender as? HistoryItem else
|
||||
{
|
||||
return
|
||||
}
|
||||
|
||||
guard let url = URL( string: item.logURL ?? "" ) else
|
||||
{
|
||||
return
|
||||
}
|
||||
|
||||
NSWorkspace.shared.open( url )
|
||||
}
|
||||
|
||||
private func refresh( userInitiated: Bool )
|
||||
{
|
||||
DispatchQueue.main.async
|
||||
@@ -111,20 +134,32 @@ class HistoryViewController: NSViewController
|
||||
|
||||
DispatchQueue.global( qos: .userInitiated ).async
|
||||
{
|
||||
let altool = ALTool( username: account.username, password: password )
|
||||
let xml = try? altool.notarizationHistory()
|
||||
let altool = ALTool( username: account.username, password: password )
|
||||
let xml = try? altool.notarizationHistory()
|
||||
|
||||
DispatchQueue.main.async
|
||||
if let xmlData = xml??.data( using: .utf8 )
|
||||
{
|
||||
if let xmlData = xml??.data( using: .utf8 )
|
||||
if let history = try? PropertyListSerialization.propertyList( from: xmlData, options: [], format: nil ) as? NSDictionary
|
||||
{
|
||||
if let history = try? PropertyListSerialization.propertyList( from: xmlData, options: [], format: nil ) as? NSDictionary
|
||||
let items = HistoryItem.ItemsFromDictionary( dict: history )
|
||||
|
||||
DispatchQueue.main.async
|
||||
{
|
||||
self.itemsController.remove( contentsOf: self.items )
|
||||
self.itemsController.add( contentsOf: HistoryItem.ItemsFromDictionary( dict: history ) )
|
||||
items.forEach
|
||||
{
|
||||
o in
|
||||
|
||||
if self.items.contains( o ) == false
|
||||
{
|
||||
self.items.insert( o )
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DispatchQueue.main.async
|
||||
{
|
||||
self.loading = false
|
||||
self.refreshing = false
|
||||
}
|
||||
@@ -132,6 +167,84 @@ class HistoryViewController: NSViewController
|
||||
}
|
||||
}
|
||||
|
||||
private func getInfo()
|
||||
{
|
||||
DispatchQueue.main.async
|
||||
{
|
||||
if self.gettingInfo
|
||||
{
|
||||
return
|
||||
}
|
||||
|
||||
self.gettingInfo = true
|
||||
|
||||
DispatchQueue.global( qos: .userInitiated ).async
|
||||
{
|
||||
guard let account = self.account else
|
||||
{
|
||||
return
|
||||
}
|
||||
|
||||
guard let password = account.password else
|
||||
{
|
||||
return
|
||||
}
|
||||
|
||||
let items = DispatchQueue.main.sync { return self.items }
|
||||
let altool = ALTool( username: account.username, password: password )
|
||||
let group = DispatchGroup()
|
||||
|
||||
for item in items.filter( { o in o.logURL == nil } )
|
||||
{
|
||||
DispatchQueue.global( qos: .userInitiated ).async( group: group )
|
||||
{
|
||||
guard let xml = try? altool.notarizationInfo( for: item.uuid ) else
|
||||
{
|
||||
return
|
||||
}
|
||||
|
||||
guard let xmlData = xml?.data( using: .utf8 ) else
|
||||
{
|
||||
return
|
||||
}
|
||||
|
||||
guard let info = try? PropertyListSerialization.propertyList( from: xmlData, options: [], format: nil ) as? NSDictionary else
|
||||
{
|
||||
return
|
||||
}
|
||||
|
||||
guard let plist = info else
|
||||
{
|
||||
return
|
||||
}
|
||||
|
||||
guard let notarization = plist[ "notarization-info" ] as? NSDictionary else
|
||||
{
|
||||
return
|
||||
}
|
||||
|
||||
guard let url = notarization[ "LogFileURL" ] as? String else
|
||||
{
|
||||
return
|
||||
}
|
||||
|
||||
DispatchQueue.main.async
|
||||
{
|
||||
item.logURL = url
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
group.wait()
|
||||
|
||||
DispatchQueue.main.async
|
||||
{
|
||||
self.gettingInfo = false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func askPassword()
|
||||
{
|
||||
if self.add != nil
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*******************************************************************************
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Jean-David Gadina - www.xs-labs.com
|
||||
* Copyright (c) 2018 DigiDNA - www.imazing.com
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -24,25 +24,37 @@
|
||||
|
||||
import Cocoa
|
||||
|
||||
@objc public class ArrayIsEmpty: ValueTransformer
|
||||
class IsEmpty: ValueTransformer
|
||||
{
|
||||
override public class func transformedValueClass() -> AnyClass
|
||||
override class func transformedValueClass() -> AnyClass
|
||||
{
|
||||
return NSNumber.self
|
||||
}
|
||||
|
||||
override public class func allowsReverseTransformation() -> Bool
|
||||
override class func allowsReverseTransformation() -> Bool
|
||||
{
|
||||
return false
|
||||
}
|
||||
|
||||
override public func transformedValue( _ value: Any? ) -> Any?
|
||||
override func transformedValue( _ value: Any? ) -> Any?
|
||||
{
|
||||
guard let array = value as? NSArray else
|
||||
if let array = value as? NSArray
|
||||
{
|
||||
return NSNumber( booleanLiteral: true )
|
||||
return array.count == 0
|
||||
}
|
||||
else if let set = value as? NSSet
|
||||
{
|
||||
return set.count == 0
|
||||
}
|
||||
else if let dictionary = value as? NSDictionary
|
||||
{
|
||||
return dictionary.count == 0
|
||||
}
|
||||
else if let string = value as? String
|
||||
{
|
||||
return string.count == 0
|
||||
}
|
||||
|
||||
return NSNumber( booleanLiteral: array.count == 0 )
|
||||
return true
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
/*******************************************************************************
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2018 Jean-David Gadina - www.xs-labs.com
|
||||
* Copyright (c) 2018 DigiDNA - www.imazing.com
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -24,25 +24,37 @@
|
||||
|
||||
import Cocoa
|
||||
|
||||
@objc public class ArrayIsNotEmpty: ValueTransformer
|
||||
class IsNotEmpty: ValueTransformer
|
||||
{
|
||||
override public class func transformedValueClass() -> AnyClass
|
||||
override class func transformedValueClass() -> AnyClass
|
||||
{
|
||||
return NSNumber.self
|
||||
}
|
||||
|
||||
override public class func allowsReverseTransformation() -> Bool
|
||||
override class func allowsReverseTransformation() -> Bool
|
||||
{
|
||||
return false
|
||||
}
|
||||
|
||||
override public func transformedValue( _ value: Any? ) -> Any?
|
||||
override func transformedValue( _ value: Any? ) -> Any?
|
||||
{
|
||||
guard let array = value as? NSArray else
|
||||
if let array = value as? NSArray
|
||||
{
|
||||
return NSNumber( booleanLiteral: false )
|
||||
return array.count > 0
|
||||
}
|
||||
else if let set = value as? NSSet
|
||||
{
|
||||
return set.count > 0
|
||||
}
|
||||
else if let dictionary = value as? NSDictionary
|
||||
{
|
||||
return dictionary.count > 0
|
||||
}
|
||||
else if let string = value as? String
|
||||
{
|
||||
return string.count > 0
|
||||
}
|
||||
|
||||
return NSNumber( booleanLiteral: array.count > 0 )
|
||||
return false
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -17,9 +17,9 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0.0</string>
|
||||
<string>1.1.0</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>22</string>
|
||||
<string>27</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
|
||||
@@ -49,6 +49,57 @@
|
||||
</binding>
|
||||
</connections>
|
||||
</customView>
|
||||
<customView translatesAutoresizingMaskIntoConstraints="NO" id="4gW-Wz-KbZ">
|
||||
<rect key="frame" x="0.0" y="0.0" width="791" height="589"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3Np-5q-xRo">
|
||||
<rect key="frame" x="287" y="443" width="217" height="36"/>
|
||||
<textFieldCell key="cell" lineBreakMode="clipping" title="No Data Available" id="WDl-1p-B7p">
|
||||
<font key="font" metaFont="systemThin" size="30"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="qKQ-Pd-1H7">
|
||||
<rect key="frame" x="268" y="167" width="256" height="256"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="256" id="EFm-8K-mFN"/>
|
||||
<constraint firstAttribute="width" constant="256" id="dy3-Ix-Ru7"/>
|
||||
</constraints>
|
||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyUpOrDown" image="NSApplicationIcon" id="gLF-aJ-vlK"/>
|
||||
</imageView>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="4GV-g7-iLV">
|
||||
<rect key="frame" x="342" y="119" width="107" height="32"/>
|
||||
<buttonCell key="cell" type="push" title="Refresh" bezelStyle="rounded" image="NSRefreshFreestandingTemplate" imagePosition="leading" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8Xy-jP-dKA">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="refresh:" target="-2" id="wFY-oR-M6L"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="3Np-5q-xRo" firstAttribute="centerX" secondItem="qKQ-Pd-1H7" secondAttribute="centerX" id="FD2-jE-SGr"/>
|
||||
<constraint firstItem="4GV-g7-iLV" firstAttribute="top" secondItem="qKQ-Pd-1H7" secondAttribute="bottom" constant="20" id="HSw-gS-95R"/>
|
||||
<constraint firstItem="qKQ-Pd-1H7" firstAttribute="centerX" secondItem="4gW-Wz-KbZ" secondAttribute="centerX" id="JCY-w7-n0I"/>
|
||||
<constraint firstItem="qKQ-Pd-1H7" firstAttribute="centerY" secondItem="4gW-Wz-KbZ" secondAttribute="centerY" id="Mgn-xM-4uG"/>
|
||||
<constraint firstItem="qKQ-Pd-1H7" firstAttribute="top" secondItem="3Np-5q-xRo" secondAttribute="bottom" constant="20" id="aaw-ST-kxf"/>
|
||||
<constraint firstItem="4GV-g7-iLV" firstAttribute="centerX" secondItem="qKQ-Pd-1H7" secondAttribute="centerX" id="vw9-CS-2lQ"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<binding destination="-2" name="hidden" keyPath="loading" id="xYW-br-j0Z"/>
|
||||
<binding destination="-2" name="hidden2" keyPath="self.items" previousBinding="xYW-br-j0Z" id="VTf-UQ-DhU">
|
||||
<dictionary key="options">
|
||||
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
|
||||
<integer key="NSNoSelectionPlaceholder" value="-1"/>
|
||||
<integer key="NSNotApplicablePlaceholder" value="-1"/>
|
||||
<integer key="NSNullPlaceholder" value="-1"/>
|
||||
<string key="NSValueTransformerName">Notarize.IsNotEmpty</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</customView>
|
||||
<scrollView borderType="none" autohidesScrollers="YES" horizontalLineScroll="32" horizontalPageScroll="10" verticalLineScroll="32" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="YfE-Rw-vXm">
|
||||
<rect key="frame" x="0.0" y="0.0" width="791" height="589"/>
|
||||
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="jMg-EM-3u0">
|
||||
@@ -236,7 +287,7 @@
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="Htf-9O-HfB">
|
||||
<rect key="frame" x="0.0" y="8" width="304" height="14"/>
|
||||
<rect key="frame" x="0.0" y="8" width="270" height="14"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" sendsActionOnEndEditing="YES" title="Table View Cell" id="qAC-Pe-dzF">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
@@ -246,11 +297,41 @@
|
||||
<binding destination="a0C-v9-jpd" name="value" keyPath="objectValue.message" id="imO-yf-BBq"/>
|
||||
</connections>
|
||||
</textField>
|
||||
<button translatesAutoresizingMaskIntoConstraints="NO" id="9LR-mA-ejX">
|
||||
<rect key="frame" x="278" y="7" width="16" height="16"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="16" id="oce-eh-do7"/>
|
||||
<constraint firstAttribute="height" constant="16" id="pVl-48-3rY"/>
|
||||
</constraints>
|
||||
<buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="NSQuickLookTemplate" imagePosition="only" alignment="center" imageScaling="proportionallyUpOrDown" inset="2" id="6Rt-0Q-4Jj">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<binding destination="a0C-v9-jpd" name="argument" keyPath="objectValue" id="SF1-A4-wnX">
|
||||
<dictionary key="options">
|
||||
<string key="NSSelectorName">showInfo:</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
<binding destination="a0C-v9-jpd" name="hidden" keyPath="objectValue.logURL" id="QJW-MN-wYd">
|
||||
<dictionary key="options">
|
||||
<string key="NSValueTransformerName">NSIsNil</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
<binding destination="-2" name="target" keyPath="self" previousBinding="SF1-A4-wnX" id="CLU-f4-FB0">
|
||||
<dictionary key="options">
|
||||
<string key="NSSelectorName">showInfo:</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="9LR-mA-ejX" secondAttribute="trailing" constant="10" id="3Iv-i9-wuK"/>
|
||||
<constraint firstItem="9LR-mA-ejX" firstAttribute="centerY" secondItem="Htf-9O-HfB" secondAttribute="centerY" id="IAD-cp-5Xd"/>
|
||||
<constraint firstItem="Htf-9O-HfB" firstAttribute="centerY" secondItem="a0C-v9-jpd" secondAttribute="centerY" id="KYd-sb-upO"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Htf-9O-HfB" secondAttribute="trailing" constant="2" id="NVl-PL-5ph"/>
|
||||
<constraint firstItem="Htf-9O-HfB" firstAttribute="leading" secondItem="a0C-v9-jpd" secondAttribute="leading" constant="2" id="kM0-Oe-QY0"/>
|
||||
<constraint firstItem="9LR-mA-ejX" firstAttribute="leading" secondItem="Htf-9O-HfB" secondAttribute="trailing" constant="10" id="x9i-0v-pM7"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<outlet property="textField" destination="Htf-9O-HfB" id="smr-M1-6KR"/>
|
||||
@@ -263,6 +344,8 @@
|
||||
<binding destination="scX-MD-094" name="content" keyPath="arrangedObjects" id="o6w-dp-EnJ"/>
|
||||
<binding destination="scX-MD-094" name="selectionIndexes" keyPath="selectionIndexes" previousBinding="o6w-dp-EnJ" id="cT6-ut-G5b"/>
|
||||
<binding destination="scX-MD-094" name="sortDescriptors" keyPath="sortDescriptors" previousBinding="cT6-ut-G5b" id="LVB-12-aeT"/>
|
||||
<outlet property="dataSource" destination="-2" id="9v3-Am-50G"/>
|
||||
<outlet property="delegate" destination="-2" id="gkG-z5-vqD"/>
|
||||
</connections>
|
||||
</tableView>
|
||||
</subviews>
|
||||
@@ -281,68 +364,17 @@
|
||||
</tableHeaderView>
|
||||
<connections>
|
||||
<binding destination="-2" name="hidden" keyPath="loading" id="DZt-gS-AT9"/>
|
||||
<binding destination="-2" name="hidden2" keyPath="self.items" previousBinding="DZt-gS-AT9" id="7SZ-ux-Gh8">
|
||||
<binding destination="-2" name="hidden2" keyPath="self.items" previousBinding="DZt-gS-AT9" id="lEZ-NG-lkf">
|
||||
<dictionary key="options">
|
||||
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
|
||||
<integer key="NSNoSelectionPlaceholder" value="-1"/>
|
||||
<integer key="NSNotApplicablePlaceholder" value="-1"/>
|
||||
<integer key="NSNullPlaceholder" value="-1"/>
|
||||
<string key="NSValueTransformerName">Notarize.ArrayIsEmpty</string>
|
||||
<string key="NSValueTransformerName">Notarize.IsEmpty</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</scrollView>
|
||||
<customView translatesAutoresizingMaskIntoConstraints="NO" id="4gW-Wz-KbZ">
|
||||
<rect key="frame" x="0.0" y="0.0" width="791" height="589"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3Np-5q-xRo">
|
||||
<rect key="frame" x="287" y="443" width="217" height="36"/>
|
||||
<textFieldCell key="cell" lineBreakMode="clipping" title="No Data Available" id="WDl-1p-B7p">
|
||||
<font key="font" metaFont="systemThin" size="30"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="qKQ-Pd-1H7">
|
||||
<rect key="frame" x="268" y="167" width="256" height="256"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="256" id="EFm-8K-mFN"/>
|
||||
<constraint firstAttribute="width" constant="256" id="dy3-Ix-Ru7"/>
|
||||
</constraints>
|
||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyUpOrDown" image="NSApplicationIcon" id="gLF-aJ-vlK"/>
|
||||
</imageView>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="4GV-g7-iLV">
|
||||
<rect key="frame" x="342" y="119" width="107" height="32"/>
|
||||
<buttonCell key="cell" type="push" title="Refresh" bezelStyle="rounded" image="NSRefreshFreestandingTemplate" imagePosition="leading" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="8Xy-jP-dKA">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="refresh:" target="-2" id="wFY-oR-M6L"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="3Np-5q-xRo" firstAttribute="centerX" secondItem="qKQ-Pd-1H7" secondAttribute="centerX" id="FD2-jE-SGr"/>
|
||||
<constraint firstItem="4GV-g7-iLV" firstAttribute="top" secondItem="qKQ-Pd-1H7" secondAttribute="bottom" constant="20" id="HSw-gS-95R"/>
|
||||
<constraint firstItem="qKQ-Pd-1H7" firstAttribute="centerX" secondItem="4gW-Wz-KbZ" secondAttribute="centerX" id="JCY-w7-n0I"/>
|
||||
<constraint firstItem="qKQ-Pd-1H7" firstAttribute="centerY" secondItem="4gW-Wz-KbZ" secondAttribute="centerY" id="Mgn-xM-4uG"/>
|
||||
<constraint firstItem="qKQ-Pd-1H7" firstAttribute="top" secondItem="3Np-5q-xRo" secondAttribute="bottom" constant="20" id="aaw-ST-kxf"/>
|
||||
<constraint firstItem="4GV-g7-iLV" firstAttribute="centerX" secondItem="qKQ-Pd-1H7" secondAttribute="centerX" id="vw9-CS-2lQ"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<binding destination="-2" name="hidden" keyPath="loading" id="xYW-br-j0Z"/>
|
||||
<binding destination="-2" name="hidden2" keyPath="self.items" previousBinding="xYW-br-j0Z" id="P4I-Ea-MOw">
|
||||
<dictionary key="options">
|
||||
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
|
||||
<integer key="NSNoSelectionPlaceholder" value="-1"/>
|
||||
<integer key="NSNotApplicablePlaceholder" value="-1"/>
|
||||
<integer key="NSNullPlaceholder" value="-1"/>
|
||||
<string key="NSValueTransformerName">Notarize.ArrayIsNotEmpty</string>
|
||||
</dictionary>
|
||||
</binding>
|
||||
</connections>
|
||||
</customView>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="YfE-Rw-vXm" firstAttribute="centerY" secondItem="c22-O7-iKe" secondAttribute="centerY" id="2AA-KP-qpA"/>
|
||||
@@ -362,12 +394,13 @@
|
||||
</customView>
|
||||
<arrayController selectsInsertedObjects="NO" avoidsEmptySelection="NO" automaticallyRearrangesObjects="YES" id="scX-MD-094">
|
||||
<connections>
|
||||
<binding destination="-2" name="contentArray" keyPath="self.items" id="0Hr-36-gVJ"/>
|
||||
<binding destination="-2" name="contentSet" keyPath="self.items" id="rB8-Xq-XDt"/>
|
||||
</connections>
|
||||
</arrayController>
|
||||
</objects>
|
||||
<resources>
|
||||
<image name="NSApplicationIcon" width="128" height="128"/>
|
||||
<image name="NSQuickLookTemplate" width="19" height="12"/>
|
||||
<image name="NSRefreshFreestandingTemplate" width="14" height="14"/>
|
||||
<image name="NSStatusAvailable" width="16" height="16"/>
|
||||
<image name="NSStatusUnavailable" width="16" height="16"/>
|
||||
|
||||
Reference in New Issue
Block a user