PDF Export done (actually increases load tim edge to memory and shit)

This commit is contained in:
Kilian Hofmann 2017-06-18 22:11:32 +02:00
parent 03e30b9621
commit 70867909eb
16 changed files with 825 additions and 64 deletions

View File

@ -31,8 +31,14 @@
E2218D641EF45F37004298F6 /* LossDistributionPie.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2218D631EF45F37004298F6 /* LossDistributionPie.swift */; };
E2218D671EF463B4004298F6 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E2218D661EF463B4004298F6 /* QuartzCore.framework */; };
E2218D691EF478C0004298F6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E2218CA81EF2D37B004298F6 /* Assets.xcassets */; };
E2268DF81EF7095100C97726 /* PDFTitle.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2268DF61EF7095100C97726 /* PDFTitle.swift */; };
E2268DF91EF7095100C97726 /* PDFTitle.xib in Resources */ = {isa = PBXBuildFile; fileRef = E2268DF71EF7095100C97726 /* PDFTitle.xib */; };
E262463E1EF55BCE00EAA4A6 /* GraphWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = E262463C1EF55BCE00EAA4A6 /* GraphWindow.swift */; };
E262463F1EF55BCE00EAA4A6 /* GraphWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = E262463D1EF55BCE00EAA4A6 /* GraphWindow.xib */; };
E26246441EF5E64900EAA4A6 /* PDFDraw.swift in Sources */ = {isa = PBXBuildFile; fileRef = E26246421EF5E64900EAA4A6 /* PDFDraw.swift */; };
E26246451EF5E64900EAA4A6 /* PDFDraw.xib in Resources */ = {isa = PBXBuildFile; fileRef = E26246431EF5E64900EAA4A6 /* PDFDraw.xib */; };
E26246471EF6684B00EAA4A6 /* PDFItemViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E26246461EF6684B00EAA4A6 /* PDFItemViewController.xib */; };
E26246491EF6688400EAA4A6 /* PDFItemViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E26246481EF6688400EAA4A6 /* PDFItemViewController.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@ -86,8 +92,14 @@
E2218D611EF41415004298F6 /* CollectionViewMonth.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionViewMonth.swift; sourceTree = "<group>"; };
E2218D631EF45F37004298F6 /* LossDistributionPie.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LossDistributionPie.swift; sourceTree = "<group>"; };
E2218D661EF463B4004298F6 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
E2268DF61EF7095100C97726 /* PDFTitle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PDFTitle.swift; sourceTree = "<group>"; };
E2268DF71EF7095100C97726 /* PDFTitle.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PDFTitle.xib; sourceTree = "<group>"; };
E262463C1EF55BCE00EAA4A6 /* GraphWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphWindow.swift; sourceTree = "<group>"; };
E262463D1EF55BCE00EAA4A6 /* GraphWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = GraphWindow.xib; sourceTree = "<group>"; };
E26246421EF5E64900EAA4A6 /* PDFDraw.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PDFDraw.swift; sourceTree = "<group>"; };
E26246431EF5E64900EAA4A6 /* PDFDraw.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PDFDraw.xib; sourceTree = "<group>"; };
E26246461EF6684B00EAA4A6 /* PDFItemViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PDFItemViewController.xib; sourceTree = "<group>"; };
E26246481EF6688400EAA4A6 /* PDFItemViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PDFItemViewController.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -253,12 +265,11 @@
E2218D481EF328FC004298F6 /* UI */ = {
isa = PBXGroup;
children = (
E2218D5C1EF3DD6F004298F6 /* CollectionViewItemMonth.xib */,
E2218D561EF335E6004298F6 /* CollectionViewItemYear.xib */,
E2218D531EF32BC4004298F6 /* Document.xib */,
E2218D4B1EF329A6004298F6 /* GraphDetailsController.xib */,
E262463D1EF55BCE00EAA4A6 /* GraphWindow.xib */,
E2268DFD1EF712FF00C97726 /* Collection View */,
E2268DFC1EF712F800C97726 /* Graph View */,
E2218D491EF32917004298F6 /* MainMenu.xib */,
E2268DFB1EF712F000C97726 /* PDF Generation */,
);
name = UI;
sourceTree = "<group>";
@ -291,11 +302,10 @@
E2218D501EF329D0004298F6 /* Views */ = {
isa = PBXGroup;
children = (
E2218D681EF46ED3004298F6 /* Collection View */,
E2218D2F1EF3271F004298F6 /* Document.swift */,
E2218D511EF32AC6004298F6 /* GraphDetailsController.swift */,
E262463C1EF55BCE00EAA4A6 /* GraphWindow.swift */,
E2218D631EF45F37004298F6 /* LossDistributionPie.swift */,
E2218D681EF46ED3004298F6 /* Collection View */,
E2268DFA1EF712D300C97726 /* Graph View */,
E2268DF51EF7093600C97726 /* PDF Generation */,
);
name = Views;
sourceTree = "<group>";
@ -315,6 +325,54 @@
E2218D5F1EF40E23004298F6 /* CollectionViewYear.swift */,
E2218D5B1EF3DD6F004298F6 /* CollectionViewItemMonth.swift */,
E2218D551EF335E6004298F6 /* CollectionViewItemYear.swift */,
E2218D631EF45F37004298F6 /* LossDistributionPie.swift */,
);
name = "Collection View";
sourceTree = "<group>";
};
E2268DF51EF7093600C97726 /* PDF Generation */ = {
isa = PBXGroup;
children = (
E26246421EF5E64900EAA4A6 /* PDFDraw.swift */,
E26246481EF6688400EAA4A6 /* PDFItemViewController.swift */,
E2268DF61EF7095100C97726 /* PDFTitle.swift */,
);
name = "PDF Generation";
sourceTree = "<group>";
};
E2268DFA1EF712D300C97726 /* Graph View */ = {
isa = PBXGroup;
children = (
E2218D511EF32AC6004298F6 /* GraphDetailsController.swift */,
E262463C1EF55BCE00EAA4A6 /* GraphWindow.swift */,
);
name = "Graph View";
sourceTree = "<group>";
};
E2268DFB1EF712F000C97726 /* PDF Generation */ = {
isa = PBXGroup;
children = (
E26246431EF5E64900EAA4A6 /* PDFDraw.xib */,
E26246461EF6684B00EAA4A6 /* PDFItemViewController.xib */,
E2268DF71EF7095100C97726 /* PDFTitle.xib */,
);
name = "PDF Generation";
sourceTree = "<group>";
};
E2268DFC1EF712F800C97726 /* Graph View */ = {
isa = PBXGroup;
children = (
E2218D4B1EF329A6004298F6 /* GraphDetailsController.xib */,
E262463D1EF55BCE00EAA4A6 /* GraphWindow.xib */,
);
name = "Graph View";
sourceTree = "<group>";
};
E2268DFD1EF712FF00C97726 /* Collection View */ = {
isa = PBXGroup;
children = (
E2218D5C1EF3DD6F004298F6 /* CollectionViewItemMonth.xib */,
E2218D561EF335E6004298F6 /* CollectionViewItemYear.xib */,
);
name = "Collection View";
sourceTree = "<group>";
@ -465,7 +523,10 @@
E2218D3B1EF32764004298F6 /* Graph.icns in Resources */,
E2218D4C1EF329A6004298F6 /* GraphDetailsController.xib in Resources */,
E2218D581EF335E6004298F6 /* CollectionViewItemYear.xib in Resources */,
E26246451EF5E64900EAA4A6 /* PDFDraw.xib in Resources */,
E2218D4A1EF32917004298F6 /* MainMenu.xib in Resources */,
E26246471EF6684B00EAA4A6 /* PDFItemViewController.xib in Resources */,
E2268DF91EF7095100C97726 /* PDFTitle.xib in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -488,10 +549,13 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E26246441EF5E64900EAA4A6 /* PDFDraw.swift in Sources */,
E2268DF81EF7095100C97726 /* PDFTitle.swift in Sources */,
E2218D2C1EF3271F004298F6 /* AppDelegate.swift in Sources */,
E2218D621EF41415004298F6 /* CollectionViewMonth.swift in Sources */,
E2218D601EF40E23004298F6 /* CollectionViewYear.swift in Sources */,
E262463E1EF55BCE00EAA4A6 /* GraphWindow.swift in Sources */,
E26246491EF6688400EAA4A6 /* PDFItemViewController.swift in Sources */,
E2218D641EF45F37004298F6 /* LossDistributionPie.swift in Sources */,
E2218D571EF335E6004298F6 /* CollectionViewItemYear.swift in Sources */,
E2218D521EF32AC6004298F6 /* GraphDetailsController.swift in Sources */,

View File

@ -2,4 +2,22 @@
<Bucket
type = "1"
version = "2.0">
<Breakpoints>
<BreakpointProxy
BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
<BreakpointContent
shouldBeEnabled = "No"
ignoreCount = "0"
continueAfterRunningActions = "No"
filePath = "Graphic Analysis 2/PDFTitle.swift"
timestampString = "519509055.029461"
startingColumnNumber = "9223372036854775807"
endingColumnNumber = "9223372036854775807"
startingLineNumber = "30"
endingLineNumber = "30"
landmarkName = "windowDidLoad()"
landmarkType = "7">
</BreakpointContent>
</BreakpointProxy>
</Breakpoints>
</Bucket>

View File

@ -11,10 +11,11 @@ import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
var lock: pthread_mutex_t = pthread_mutex_t()
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Insert code here to initialize your application
pthread_mutex_init(&((NSApp.delegate as! AppDelegate).lock), nil)
}
func applicationWillTerminate(_ aNotification: Notification) {

View File

@ -36,6 +36,9 @@ extension CollectionViewMonth: NSCollectionViewDataSource {
let item = itemForRepresentedObjectAtcollectionView.makeItem(withIdentifier: "CollectionViewItemMonth", for: indexPath)
guard let item2 = item as? CollectionViewItemMonth else {
self.doc.progress.increment(by: 100/31)
if self.doc.progress.doubleValue > 98 {
self.doc.progress.isHidden = true
}
return item
}
if item2.isSelected {
@ -53,6 +56,9 @@ extension CollectionViewMonth: NSCollectionViewDataSource {
item2.day.stringValue = "\(indexPath.item + 1)"
guard month != nil else {
self.doc.progress.increment(by: 100/31)
if self.doc.progress.doubleValue > 98 {
self.doc.progress.isHidden = true
}
return item2
}
if indexPath.item == 0 {
@ -62,6 +68,9 @@ extension CollectionViewMonth: NSCollectionViewDataSource {
}
guard let day = days[month!][indexPath.item] else {
self.doc.progress.increment(by: 100/31)
if self.doc.progress.doubleValue > 98 {
self.doc.progress.isHidden = true
}
return item2
}
item2.day.textColor = NSColor.black
@ -69,6 +78,9 @@ extension CollectionViewMonth: NSCollectionViewDataSource {
guard let log = day.fileWrappers?["KDLog.txt"] else {
OperationQueue.main.addOperation {
self.doc.progress.increment(by: 100/31)
if self.doc.progress.doubleValue > 98 {
self.doc.progress.isHidden = true
}
}
return
}
@ -79,6 +91,9 @@ extension CollectionViewMonth: NSCollectionViewDataSource {
item2.loss.stringValue = "\(logA.count)"
item2.redrawDistribution()
self.doc.progress.increment(by: 100/31)
if self.doc.progress.doubleValue > 98 {
self.doc.progress.isHidden = true
}
}
}
item2.dayFW = day

View File

@ -57,6 +57,7 @@ extension CollectionViewYear : NSCollectionViewDelegate {
(collectionView.item(at: indexPaths.first!) as! CollectionViewItemYear).view.layer?.borderColor = NSColor.gray.cgColor
dsMonth.month = indexPaths.first?.item
doc.progress.doubleValue = 0
doc.progress.isHidden = false
self.cvMonth.reloadData()
}
@ -65,6 +66,7 @@ extension CollectionViewYear : NSCollectionViewDelegate {
layer.borderColor = NSColor.clear.cgColor
dsMonth.month = nil
doc.progress.doubleValue = 0
doc.progress.isHidden = false
self.cvMonth.reloadData()
}
}

View File

@ -17,9 +17,14 @@ class Document: NSDocument {
var monthDatasource: CollectionViewMonth = CollectionViewMonth()
var windowController: NSWindowController = NSWindowController()
var pdfWindows: [Data] = [Data(), Data(), Data(), Data(), Data(), Data(), Data(), Data(), Data(), Data(), Data(), Data()]
var pdfBegin: Bool = false
var name: String = ""
@IBOutlet var collectionViewYear: NSCollectionView!
@IBOutlet var collectionViewMonth: NSCollectionView!
@IBOutlet var progress: NSProgressIndicator!
@IBOutlet var exportProgress: NSProgressIndicator!
override init() {
super.init()
@ -41,6 +46,7 @@ class Document: NSDocument {
}
override func read(from fileWrapper: FileWrapper, ofType typeName: String) throws {
name = (fileWrapper.filename! as NSString).deletingPathExtension
year = fileWrapper
for entry in fileWrapper.fileWrappers! {
guard let month = Int(entry.key) else { continue }
@ -80,7 +86,18 @@ class Document: NSDocument {
}
override func shouldCloseWindowController(_ windowController: NSWindowController, delegate: Any?, shouldClose shouldCloseSelector: Selector?, contextInfo: UnsafeMutableRawPointer?) {
super.shouldCloseWindowController(windowController, delegate: delegate, shouldClose: shouldCloseSelector, contextInfo: contextInfo)
pthread_mutex_lock(&(NSApp.delegate as! AppDelegate).lock)
if !pdfBegin {
super.shouldCloseWindowController(windowController, delegate: delegate, shouldClose: shouldCloseSelector, contextInfo: contextInfo)
} else {
let alert = NSAlert()
alert.messageText = "Warning"
alert.informativeText = "PDF export active. Please wait until completed."
alert.alertStyle = NSAlertStyle.warning
alert.addButton(withTitle: "OK")
alert.runModal()
}
pthread_mutex_unlock(&(NSApp.delegate as! AppDelegate).lock)
}
override func printOperation(withSettings printSettings: [String : Any]) throws -> NSPrintOperation {
@ -94,5 +111,68 @@ class Document: NSDocument {
printOperation.printInfo.leftMargin = 1
return printOperation
}
@IBAction func exportPDF(sender: Any) {
(sender as! NSMenuItem).isEnabled = false
let savePanel: NSSavePanel = NSSavePanel()
savePanel.allowedFileTypes = ["pdf"]
savePanel.nameFieldStringValue = name
savePanel.canCreateDirectories = true
savePanel.beginSheetModal(for: windowController.window!) { result in
if result == NSFileHandlingPanelOKButton {
self.exportProgress.doubleValue = 0
self.exportProgress.isHidden = false
let operationQueue: OperationQueue = OperationQueue()
let d_group: DispatchGroup = DispatchGroup()
let bg_queue: DispatchQueue = DispatchQueue.global()
operationQueue.addOperation {
pthread_mutex_lock(&(NSApp.delegate as! AppDelegate).lock)
self.pdfBegin = true
pthread_mutex_unlock(&(NSApp.delegate as! AppDelegate).lock)
var bounds: NSRect = NSMakeRect(0, 0, 964, 675)
let data: NSMutableData = NSMutableData()
let dataConsumer: CGDataConsumer = CGDataConsumer(data: data)!
let context: CGContext = CGContext(consumer: dataConsumer, mediaBox: &bounds, nil)!
context.beginPDFPage(nil)
let window: PDFTitle = PDFTitle(title: "Monthly loss overview of year \(self.name)")
let providerTitle: CGDataProvider = CGDataProvider(data: (window.window?.contentView?.dataWithPDF(inside: (window.window?.contentView?.bounds)!))! as CFData)!
let titlePDF: CGPDFDocument = CGPDFDocument(providerTitle)!
let titlePage: CGPDFPage = titlePDF.page(at: 1)!
context.drawPDFPage(titlePage)
context.endPDFPage()
for i in 0..<12 {
bg_queue.async(group: d_group, qos: DispatchQoS(qosClass: .background, relativePriority: 0), flags: .barrier) {
let window: PDFDraw = PDFDraw(month: i)
window.days = self.days[i]
self.pdfWindows[i] = (window.window?.contentView?.dataWithPDF(inside: (window.window?.contentView?.bounds)!))!
DispatchQueue.main.async {
self.exportProgress.increment(by: 100/12)
}
}
}
let _: DispatchTimeoutResult = d_group.wait(timeout: .distantFuture)
for i in 0..<12 {
context.beginPDFPage(nil)
let montDataProvider: CGDataProvider = CGDataProvider(data: self.pdfWindows[i] as CFData)!
let monthPDF: CGPDFDocument = CGPDFDocument(montDataProvider)!
let page: CGPDFPage = monthPDF.page(at: 1)!
context.drawPDFPage(page)
context.endPDFPage()
}
context.closePDF()
data.write(to: savePanel.url!, atomically: true)
pthread_mutex_lock(&(NSApp.delegate as! AppDelegate).lock)
self.pdfBegin = false
pthread_mutex_unlock(&(NSApp.delegate as! AppDelegate).lock)
self.exportProgress.isHidden = true
(sender as! NSMenuItem).isEnabled = true
}
}
}
}
}

View File

@ -10,6 +10,7 @@
<connections>
<outlet property="collectionViewMonth" destination="hax-ty-I75" id="5UC-K2-fXz"/>
<outlet property="collectionViewYear" destination="QrY-5g-8Dh" id="fP5-J7-IUa"/>
<outlet property="exportProgress" destination="7gt-8k-i3i" id="uqE-NN-JqV"/>
<outlet property="progress" destination="PIE-RS-xuk" id="lvA-m1-yQd"/>
<outlet property="window" destination="QvC-M9-y7g" id="rV3-WO-9Cg"/>
</connections>
@ -19,21 +20,22 @@
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" animationBehavior="default" id="QvC-M9-y7g">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
<windowPositionMask key="initialPositionMask" topStrut="YES"/>
<rect key="contentRect" x="8" y="85" width="1272" height="740"/>
<rect key="contentRect" x="8" y="85" width="1272" height="766"/>
<rect key="screenRect" x="0.0" y="0.0" width="1280" height="800"/>
<value key="minSize" type="size" width="1272" height="740"/>
<value key="maxSize" type="size" width="1272" height="740"/>
<value key="minSize" type="size" width="1272" height="766"/>
<value key="maxSize" type="size" width="1272" height="766"/>
<view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ">
<rect key="frame" x="0.0" y="0.0" width="1272" height="740"/>
<rect key="frame" x="0.0" y="0.0" width="1272" height="766"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<scrollView wantsLayer="YES" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" hasVerticalScroller="NO" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" verticalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="v0h-Ac-Zdb">
<rect key="frame" x="288" y="45" width="964" height="675"/>
<clipView key="contentView" drawsBackground="NO" id="mfx-sA-NT9">
<scrollView wantsLayer="YES" fixedFrame="YES" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" hasVerticalScroller="NO" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" verticalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="v0h-Ac-Zdb">
<rect key="frame" x="288" y="71" width="964" height="675"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<clipView key="contentView" ambiguous="YES" drawsBackground="NO" id="mfx-sA-NT9">
<rect key="frame" x="1" y="1" width="962" height="673"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<collectionView identifier="month" selectable="YES" id="hax-ty-I75">
<collectionView identifier="month" ambiguous="YES" selectable="YES" id="hax-ty-I75">
<rect key="frame" x="0.0" y="0.0" width="962" height="673"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<collectionViewFlowLayout key="collectionViewLayout" minimumInteritemSpacing="10" minimumLineSpacing="10" id="Cyq-5W-OO3">
@ -44,10 +46,6 @@
</subviews>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</clipView>
<constraints>
<constraint firstAttribute="width" constant="964" id="2Fd-F5-mfN"/>
<constraint firstAttribute="height" constant="675" id="LH9-rK-flS"/>
</constraints>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="Ua0-m4-94V">
<rect key="frame" x="-100" y="-100" width="960" height="16"/>
<autoresizingMask key="autoresizingMask"/>
@ -57,13 +55,14 @@
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<scrollView wantsLayer="YES" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="p0d-ZT-icQ">
<rect key="frame" x="20" y="45" width="248" height="675"/>
<clipView key="contentView" drawsBackground="NO" id="x8z-Ha-RAr">
<scrollView wantsLayer="YES" fixedFrame="YES" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="p0d-ZT-icQ">
<rect key="frame" x="20" y="71" width="248" height="675"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<clipView key="contentView" ambiguous="YES" drawsBackground="NO" id="x8z-Ha-RAr">
<rect key="frame" x="1" y="1" width="246" height="673"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<collectionView identifier="year" selectable="YES" id="QrY-5g-8Dh">
<collectionView identifier="year" ambiguous="YES" selectable="YES" id="QrY-5g-8Dh">
<rect key="frame" x="0.0" y="0.0" width="246" height="673"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<collectionViewFlowLayout key="collectionViewLayout" minimumInteritemSpacing="10" minimumLineSpacing="10" id="y3w-79-aAH">
@ -74,10 +73,6 @@
</subviews>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</clipView>
<constraints>
<constraint firstAttribute="width" constant="248" id="Cki-dW-UNn"/>
<constraint firstAttribute="height" constant="675" id="diY-Fx-Rcz"/>
</constraints>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="B1S-Pw-6W0">
<rect key="frame" x="1" y="-15" width="0.0" height="16"/>
<autoresizingMask key="autoresizingMask"/>
@ -87,46 +82,38 @@
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oGO-03-0dP">
<rect key="frame" x="18" y="20" width="75" height="17"/>
<constraints>
<constraint firstAttribute="width" constant="71" id="QkD-gW-Xgl"/>
<constraint firstAttribute="height" constant="17" id="UGI-ar-Peh"/>
</constraints>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="oGO-03-0dP">
<rect key="frame" x="18" y="45" width="75" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Load status" id="E0E-Gb-jJx">
<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>
<progressIndicator wantsLayer="YES" maxValue="100" style="bar" translatesAutoresizingMaskIntoConstraints="NO" id="PIE-RS-xuk">
<rect key="frame" x="99" y="18" width="169" height="20"/>
<constraints>
<constraint firstAttribute="height" constant="18" id="IrB-lj-Z7z"/>
<constraint firstAttribute="width" constant="169" id="LMw-fa-aeR"/>
</constraints>
<progressIndicator wantsLayer="YES" fixedFrame="YES" maxValue="100" style="bar" translatesAutoresizingMaskIntoConstraints="NO" id="PIE-RS-xuk">
<rect key="frame" x="99" y="44" width="169" height="20"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</progressIndicator>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DTI-OB-mOG">
<rect key="frame" x="18" y="20" width="85" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Export status" id="cxe-J8-J6F">
<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>
<progressIndicator hidden="YES" wantsLayer="YES" fixedFrame="YES" maxValue="100" style="bar" translatesAutoresizingMaskIntoConstraints="NO" id="7gt-8k-i3i">
<rect key="frame" x="109" y="19" width="159" height="20"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</progressIndicator>
</subviews>
<constraints>
<constraint firstItem="oGO-03-0dP" firstAttribute="top" secondItem="p0d-ZT-icQ" secondAttribute="bottom" constant="8" id="6hn-jI-iDi"/>
<constraint firstItem="v0h-Ac-Zdb" firstAttribute="top" secondItem="EiT-Mj-1SZ" secondAttribute="top" constant="20" id="F4T-9q-adq"/>
<constraint firstItem="oGO-03-0dP" firstAttribute="leading" secondItem="EiT-Mj-1SZ" secondAttribute="leading" constant="20" id="F8l-8H-dTs"/>
<constraint firstItem="PIE-RS-xuk" firstAttribute="top" secondItem="p0d-ZT-icQ" secondAttribute="bottom" constant="8" id="Gcz-ya-Sbm"/>
<constraint firstItem="v0h-Ac-Zdb" firstAttribute="leading" secondItem="p0d-ZT-icQ" secondAttribute="trailing" constant="20" id="JgS-Ak-Rpe"/>
<constraint firstItem="PIE-RS-xuk" firstAttribute="leading" secondItem="oGO-03-0dP" secondAttribute="trailing" constant="8" id="Mmr-Wj-C7s"/>
<constraint firstAttribute="bottom" secondItem="oGO-03-0dP" secondAttribute="bottom" constant="20" id="WOw-So-ueQ"/>
<constraint firstItem="PIE-RS-xuk" firstAttribute="leading" secondItem="oGO-03-0dP" secondAttribute="trailing" constant="8" id="fMn-4t-w1l"/>
<constraint firstItem="p0d-ZT-icQ" firstAttribute="top" secondItem="EiT-Mj-1SZ" secondAttribute="top" constant="20" id="g20-F3-eNh"/>
<constraint firstAttribute="trailing" secondItem="v0h-Ac-Zdb" secondAttribute="trailing" constant="20" id="iae-HL-GFD"/>
<constraint firstAttribute="bottom" secondItem="PIE-RS-xuk" secondAttribute="bottom" constant="19" id="u8N-0K-3Le"/>
<constraint firstItem="p0d-ZT-icQ" firstAttribute="leading" secondItem="EiT-Mj-1SZ" secondAttribute="leading" constant="20" id="uDO-bh-xfc"/>
<constraint firstItem="v0h-Ac-Zdb" firstAttribute="leading" secondItem="p0d-ZT-icQ" secondAttribute="trailing" constant="20" id="wAi-4e-l44"/>
</constraints>
</view>
<connections>
<outlet property="delegate" destination="-2" id="BPU-SZ-Fs4"/>
</connections>
<point key="canvasLocation" x="224" y="70.5"/>
<point key="canvasLocation" x="224" y="83"/>
</window>
</objects>
</document>

View File

@ -44,7 +44,7 @@
<key>CFBundleShortVersionString</key>
<string>2.0</string>
<key>CFBundleVersion</key>
<string>297</string>
<string>411</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string>
<key>LSMinimumSystemVersion</key>

View File

@ -14,11 +14,11 @@
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModule="Graphic_Analysis_2" customModuleProvider="target"/>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<menu title="Main Menu" systemMenu="main" id="PUB-Vp-Pnr">
<menu title="Main Menu" systemMenu="main" autoenablesItems="NO" id="PUB-Vp-Pnr">
<items>
<menuItem title="Graphic Analysis 2" id="vNR-Hs-flz">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Graphic Analysis 2" systemMenu="apple" id="PVc-OY-teo">
<menu key="submenu" title="Graphic Analysis 2" systemMenu="apple" autoenablesItems="NO" id="PVc-OY-teo">
<items>
<menuItem title="About Graphic Analysis 2" id="COD-jk-h86">
<modifierMask key="keyEquivalentModifierMask"/>
@ -55,7 +55,7 @@
</menuItem>
<menuItem title="File" id="Dcx-gm-y6z">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="File" id="W7y-II-zJE">
<menu key="submenu" title="File" autoenablesItems="NO" id="W7y-II-zJE">
<items>
<menuItem title="Open…" keyEquivalent="o" id="viN-5I-FR9">
<connections>
@ -82,6 +82,11 @@
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="FZ5-XX-9Kk"/>
<menuItem title="Export Year to PDF" keyEquivalent="e" id="zda-Fx-vyg">
<connections>
<action selector="exportPDFWithSender:" target="-1" id="jTP-BD-XpF"/>
</connections>
</menuItem>
<menuItem title="Print" keyEquivalent="p" id="Dv8-mM-MkR">
<connections>
<action selector="printDocument:" target="-1" id="0i5-gB-HXD"/>
@ -92,7 +97,7 @@
</menuItem>
<menuItem title="Window" id="ZMN-wC-CZA">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Window" systemMenu="window" id="E8Z-aJ-3fE">
<menu key="submenu" title="Window" systemMenu="window" autoenablesItems="NO" id="E8Z-aJ-3fE">
<items>
<menuItem title="Minimize" keyEquivalent="m" id="6BM-mG-Rxt">
<connections>

View File

@ -0,0 +1,130 @@
//
// PDFDraw.swift
// Docsis Toolkit
//
// Created by Kilian Hofmann on 18.06.17.
// Copyright © 2017 Kilian Hofmann. All rights reserved.
//
import Cocoa
class PDFDraw: NSWindowController {
@IBOutlet var day01: NSView!
@IBOutlet var day02: NSView!
@IBOutlet var day03: NSView!
@IBOutlet var day04: NSView!
@IBOutlet var day05: NSView!
@IBOutlet var day06: NSView!
@IBOutlet var day07: NSView!
@IBOutlet var day08: NSView!
@IBOutlet var day09: NSView!
@IBOutlet var day10: NSView!
@IBOutlet var day11: NSView!
@IBOutlet var day12: NSView!
@IBOutlet var day13: NSView!
@IBOutlet var day14: NSView!
@IBOutlet var day15: NSView!
@IBOutlet var day16: NSView!
@IBOutlet var day17: NSView!
@IBOutlet var day18: NSView!
@IBOutlet var day19: NSView!
@IBOutlet var day20: NSView!
@IBOutlet var day21: NSView!
@IBOutlet var day22: NSView!
@IBOutlet var day23: NSView!
@IBOutlet var day24: NSView!
@IBOutlet var day25: NSView!
@IBOutlet var day26: NSView!
@IBOutlet var day27: NSView!
@IBOutlet var day28: NSView!
@IBOutlet var day29: NSView!
@IBOutlet var day30: NSView!
@IBOutlet var day31: NSView!
let monthNames: [String] = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
var month: Int = 0
var days: [FileWrapper?] = [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]
override var windowNibName: String! {
return "PDFDraw"
}
required init?(coder: NSCoder)
{
super.init(coder: coder)
}
init(month: Int) {
super.init(window: nil)
self.month = month
}
override func windowDidLoad() {
super.windowDidLoad()
window?.contentView?.wantsLayer = true
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
let item01 = PDFItemViewController(dayFW: days[0], day: 1, monthName: monthNames[month])
day01.addSubview(item01.view)
let item02 = PDFItemViewController(dayFW: days[1], day: 2)
day02.addSubview(item02.view)
let item03 = PDFItemViewController(dayFW: days[2], day: 3)
day03.addSubview(item03.view)
let item04 = PDFItemViewController(dayFW: days[3], day: 4)
day04.addSubview(item04.view)
let item05 = PDFItemViewController(dayFW: days[4], day: 5)
day05.addSubview(item05.view)
let item06 = PDFItemViewController(dayFW: days[5], day: 6)
day06.addSubview(item06.view)
let item07 = PDFItemViewController(dayFW: days[6], day: 7)
day07.addSubview(item07.view)
let item08 = PDFItemViewController(dayFW: days[7], day: 8)
day08.addSubview(item08.view)
let item09 = PDFItemViewController(dayFW: days[8], day: 9)
day09.addSubview(item09.view)
let item10 = PDFItemViewController(dayFW: days[9], day: 10)
day10.addSubview(item10.view)
let item11 = PDFItemViewController(dayFW: days[10], day: 11)
day11.addSubview(item11.view)
let item12 = PDFItemViewController(dayFW: days[11], day: 12)
day12.addSubview(item12.view)
let item13 = PDFItemViewController(dayFW: days[12], day: 13)
day13.addSubview(item13.view)
let item14 = PDFItemViewController(dayFW: days[13], day: 14)
day14.addSubview(item14.view)
let item15 = PDFItemViewController(dayFW: days[14], day: 15)
day15.addSubview(item15.view)
let item16 = PDFItemViewController(dayFW: days[15], day: 16)
day16.addSubview(item16.view)
let item17 = PDFItemViewController(dayFW: days[16], day: 17)
day17.addSubview(item17.view)
let item18 = PDFItemViewController(dayFW: days[17], day: 18)
day18.addSubview(item18.view)
let item19 = PDFItemViewController(dayFW: days[18], day: 19)
day19.addSubview(item19.view)
let item20 = PDFItemViewController(dayFW: days[19], day: 20)
day20.addSubview(item20.view)
let item21 = PDFItemViewController(dayFW: days[20], day: 21)
day21.addSubview(item21.view)
let item22 = PDFItemViewController(dayFW: days[21], day: 22)
day22.addSubview(item22.view)
let item23 = PDFItemViewController(dayFW: days[22], day: 23)
day23.addSubview(item23.view)
let item24 = PDFItemViewController(dayFW: days[23], day: 24)
day24.addSubview(item24.view)
let item25 = PDFItemViewController(dayFW: days[24], day: 25)
day25.addSubview(item25.view)
let item26 = PDFItemViewController(dayFW: days[25], day: 26)
day26.addSubview(item26.view)
let item27 = PDFItemViewController(dayFW: days[26], day: 27)
day27.addSubview(item27.view)
let item28 = PDFItemViewController(dayFW: days[27], day: 28)
day28.addSubview(item28.view)
let item29 = PDFItemViewController(dayFW: days[28], day: 29)
day29.addSubview(item29.view)
let item30 = PDFItemViewController(dayFW: days[29], day: 30)
day30.addSubview(item30.view)
let item31 = PDFItemViewController(dayFW: days[30], day: 31)
day31.addSubview(item31.view)
}
}

View File

@ -0,0 +1,186 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="12121" systemVersion="16G16b" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="12121"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="PDFDraw" customModule="Graphic_Analysis_2" customModuleProvider="target">
<connections>
<outlet property="day01" destination="wVo-n9-8iy" id="Dmb-VW-e8K"/>
<outlet property="day02" destination="nPA-B4-tFV" id="WgP-3n-Q78"/>
<outlet property="day03" destination="WiC-Is-qto" id="gYd-sq-uKt"/>
<outlet property="day04" destination="c9R-aL-ymR" id="TqG-qx-8ZH"/>
<outlet property="day05" destination="Jla-Yk-tyz" id="urD-Rd-PXf"/>
<outlet property="day06" destination="SZC-YG-1G8" id="5FN-BL-scs"/>
<outlet property="day07" destination="8s4-9T-Oid" id="WA4-zW-t4I"/>
<outlet property="day08" destination="miG-5R-dO0" id="k0H-pl-UXS"/>
<outlet property="day09" destination="J5E-4T-ulS" id="5Pj-52-cUT"/>
<outlet property="day10" destination="dT0-6Z-HLb" id="erC-qR-rDk"/>
<outlet property="day11" destination="BpY-Xg-1a0" id="CoR-wO-8GA"/>
<outlet property="day12" destination="JAN-ca-gkR" id="9KD-0X-EIP"/>
<outlet property="day13" destination="CU4-ay-ApJ" id="sIr-EH-WfL"/>
<outlet property="day14" destination="0eQ-5l-VUO" id="LHd-UW-mfz"/>
<outlet property="day15" destination="ig2-Dt-GUC" id="U9w-81-fLV"/>
<outlet property="day16" destination="wlL-Fv-fJn" id="3a4-el-FTE"/>
<outlet property="day17" destination="uca-pQ-tSj" id="vuB-oB-pO0"/>
<outlet property="day18" destination="Ywu-Xr-5s3" id="UDw-VH-qyW"/>
<outlet property="day19" destination="mQq-EY-wGn" id="qcG-Qo-OXW"/>
<outlet property="day20" destination="zFh-8C-dRl" id="LKF-gf-zWv"/>
<outlet property="day21" destination="hCv-lp-Q6J" id="UZm-jE-jub"/>
<outlet property="day22" destination="Mjc-h5-34u" id="sw8-G8-8c6"/>
<outlet property="day23" destination="b8E-Np-5Yk" id="G8F-E0-UBd"/>
<outlet property="day24" destination="Asb-qS-cNx" id="r12-Sz-APk"/>
<outlet property="day25" destination="9OY-RB-dvU" id="ddD-Hm-lo5"/>
<outlet property="day26" destination="sMv-zT-VqB" id="WOL-Gs-Lhs"/>
<outlet property="day27" destination="F3l-tk-4UC" id="Bez-cX-rvm"/>
<outlet property="day28" destination="nze-1f-GBe" id="N02-oJ-eKR"/>
<outlet property="day29" destination="V8P-oC-lNR" id="2KA-TE-JtC"/>
<outlet property="day30" destination="2Mb-Kw-yKY" id="onj-01-rRK"/>
<outlet property="day31" destination="842-Cq-bJh" id="gGp-Da-RMk"/>
<outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hasShadow="NO" oneShot="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" animationBehavior="default" id="F0z-JX-Cv5">
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="196" y="240" width="961" height="672"/>
<rect key="screenRect" x="0.0" y="0.0" width="1280" height="800"/>
<view key="contentView" wantsLayer="YES" id="se5-gp-TjO">
<rect key="frame" x="0.0" y="0.0" width="961" height="672"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="wVo-n9-8iy">
<rect key="frame" x="2" y="538" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="nPA-B4-tFV">
<rect key="frame" x="139" y="538" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="WiC-Is-qto">
<rect key="frame" x="276" y="538" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="c9R-aL-ymR">
<rect key="frame" x="413" y="538" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Jla-Yk-tyz">
<rect key="frame" x="550" y="538" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="SZC-YG-1G8">
<rect key="frame" x="687" y="538" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="8s4-9T-Oid">
<rect key="frame" x="824" y="538" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="miG-5R-dO0">
<rect key="frame" x="2" y="404" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="J5E-4T-ulS">
<rect key="frame" x="139" y="404" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="dT0-6Z-HLb">
<rect key="frame" x="276" y="404" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="BpY-Xg-1a0">
<rect key="frame" x="413" y="404" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="JAN-ca-gkR">
<rect key="frame" x="550" y="404" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="CU4-ay-ApJ">
<rect key="frame" x="687" y="404" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="0eQ-5l-VUO">
<rect key="frame" x="824" y="404" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ig2-Dt-GUC">
<rect key="frame" x="2" y="270" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="wlL-Fv-fJn">
<rect key="frame" x="139" y="270" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="uca-pQ-tSj">
<rect key="frame" x="276" y="270" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Ywu-Xr-5s3">
<rect key="frame" x="413" y="270" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="mQq-EY-wGn">
<rect key="frame" x="550" y="270" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="zFh-8C-dRl">
<rect key="frame" x="687" y="270" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="hCv-lp-Q6J">
<rect key="frame" x="824" y="270" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Mjc-h5-34u">
<rect key="frame" x="2" y="136" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="b8E-Np-5Yk">
<rect key="frame" x="139" y="136" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Asb-qS-cNx">
<rect key="frame" x="276" y="136" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="9OY-RB-dvU">
<rect key="frame" x="413" y="136" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="sMv-zT-VqB">
<rect key="frame" x="550" y="136" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="F3l-tk-4UC">
<rect key="frame" x="687" y="136" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="nze-1f-GBe">
<rect key="frame" x="824" y="136" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="V8P-oC-lNR">
<rect key="frame" x="2" y="2" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="2Mb-Kw-yKY">
<rect key="frame" x="139" y="2" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="842-Cq-bJh">
<rect key="frame" x="276" y="2" width="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
</subviews>
</view>
<connections>
<outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
</connections>
</window>
</objects>
</document>

View File

@ -0,0 +1,66 @@
//
// PDFItemViewController.swift
// Docsis Toolkit
//
// Created by Kilian Hofmann on 18.06.17.
// Copyright © 2017 Kilian Hofmann. All rights reserved.
//
import Cocoa
class PDFItemViewController: NSViewController {
@IBOutlet var day: NSTextField!
@IBOutlet var loss: NSTextField!
@IBOutlet var distributionAM: LossDistributionPie!
@IBOutlet var distributionPM: LossDistributionPie!
@IBOutlet var month: NSTextField!
var dayFW: FileWrapper?
var dayI: Int = 0
var monthName: String = ""
required init?(coder: NSCoder) {
super.init(coder: coder)
}
init(dayFW: FileWrapper?, day: Int, monthName: String) {
super.init(nibName: "PDFItemViewController", bundle: Bundle.main)!
self.dayFW = dayFW
self.dayI = day
self.monthName = monthName
}
init(dayFW: FileWrapper?, day: Int) {
super.init(nibName: "PDFItemViewController", bundle: Bundle.main)!
self.dayFW = dayFW
self.dayI = day
}
override func viewDidLoad() {
super.viewDidLoad()
// Do view setup here.
view.wantsLayer = true
view.layer?.backgroundColor = NSColor.white.cgColor
day.stringValue = "\(dayI)"
month.stringValue = monthName
guard dayFW != nil else { return }
day.textColor = NSColor.black
guard let log = dayFW?.fileWrappers?["KDLog.txt"] else { return }
guard var logA = String(data: log.regularFileContents!, encoding: .utf8)?.components(separatedBy: "\n") else { return }
logA.removeLast()
loss.stringValue = "\(logA.count)"
var am: [Int] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
var pm: [Int] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
for entry in logA {
let hour: Int = Int(entry.components(separatedBy: ":")[0])!
if hour < 12 {
am[hour] += 1
} else {
pm[hour - 12] += 1
}
}
self.distributionAM.distribution = am
self.distributionPM.distribution = pm
}
}

View File

@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="12121" systemVersion="16G16b" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="12121"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="PDFItemViewController" customModule="Graphic_Analysis_2" customModuleProvider="target">
<connections>
<outlet property="day" destination="3aE-Wf-9eZ" id="T7k-f7-IBu"/>
<outlet property="distributionAM" destination="B0U-sm-QBD" id="jN5-fA-i8W"/>
<outlet property="distributionPM" destination="ftO-kx-Le5" id="Fjl-OH-3tS"/>
<outlet property="loss" destination="Ios-8D-sSB" id="RS0-0q-8Bt"/>
<outlet property="month" destination="4zV-3k-nlC" id="zax-kO-7tP"/>
<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="135" height="132"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="3aE-Wf-9eZ">
<rect key="frame" x="91" y="100" width="26" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" title="01" id="hZ1-E9-nbm">
<font key="font" metaFont="system" size="17"/>
<color key="textColor" name="controlShadowColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ios-8D-sSB">
<rect key="frame" x="58" y="75" width="59" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" id="axa-F2-XeS">
<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>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bOH-fN-p3a">
<rect key="frame" x="18" y="75" width="36" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Loss:" id="6Hu-ZO-t9e">
<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>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="B0U-sm-QBD" customClass="LossDistributionPie" customModule="Graphic_Analysis_2" customModuleProvider="target">
<rect key="frame" x="20" y="10" width="37" height="37"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<customView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ftO-kx-Le5" customClass="LossDistributionPie" customModule="Graphic_Analysis_2" customModuleProvider="target">
<rect key="frame" x="78" y="10" width="37" height="37"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</customView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="nbG-Sm-rH7">
<rect key="frame" x="26" y="50" width="24" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="AM" id="xPq-iI-lK1">
<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>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="CuG-p6-mV1">
<rect key="frame" x="84" y="50" width="24" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="PM" id="SQW-qO-YRY">
<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>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4zV-3k-nlC">
<rect key="frame" x="18" y="100" width="73" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" id="3oV-8s-WLv">
<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>
<point key="canvasLocation" x="138.5" y="169"/>
</customView>
</objects>
</document>

View File

@ -0,0 +1,53 @@
//
// PDFTitle.swift
// Docsis Toolkit
//
// Created by Kilian Hofmann on 18.06.17.
// Copyright © 2017 Kilian Hofmann. All rights reserved.
//
import Cocoa
class PDFTitle: NSWindowController {
@IBOutlet var title: NSTextField!
@IBOutlet var date: NSTextField!
@IBOutlet var appName: NSTextField!
var titleString: String = ""
override func windowDidLoad() {
super.windowDidLoad()
let dateFormatter: DateFormatter = DateFormatter()
dateFormatter.timeZone = NSTimeZone.local
dateFormatter.dateFormat = "EEEE, dd MMMM yyyy 'at' HH:mm:ss zzzz"
dateFormatter.locale = Locale(identifier: "en_US")
let date: Date = Date()
// Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
title.stringValue = titleString
self.date.stringValue = "Generated on \(dateFormatter.string(from: date))"
appName.stringValue = "Graphic Analysis 2 Version \(version())"
}
override var windowNibName: String! {
return "PDFTitle"
}
required init?(coder: NSCoder)
{
super.init(coder: coder)
}
init(title: String) {
super.init(window: nil)
self.titleString = title
}
func version() -> String {
let dictionary = Bundle.main.infoDictionary!
let version = dictionary["CFBundleShortVersionString"] as! String
let build = dictionary["CFBundleVersion"] as! String
return "\(version) build \(build)"
}
}

View File

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="12121" systemVersion="16G16b" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="12121"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="PDFTitle" customModule="Graphic_Analysis_2" customModuleProvider="target">
<connections>
<outlet property="appName" destination="5tm-t6-d4d" id="6nq-vy-oSe"/>
<outlet property="date" destination="Lea-Qi-ioS" id="7eu-Wq-HTS"/>
<outlet property="title" destination="JNT-R2-rXy" id="Aag-Iq-Lwv"/>
<outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5">
<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="196" y="240" width="964" height="675"/>
<rect key="screenRect" x="0.0" y="0.0" width="1280" height="800"/>
<view key="contentView" wantsLayer="YES" id="se5-gp-TjO">
<rect key="frame" x="0.0" y="0.0" width="964" height="675"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JNT-R2-rXy">
<rect key="frame" x="18" y="342" width="928" height="70"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="center" id="b77-j2-0hH">
<font key="font" metaFont="system" size="58"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Lea-Qi-ioS">
<rect key="frame" x="18" y="264" width="928" height="70"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" alignment="center" id="Z6l-H4-APW">
<font key="font" metaFont="system" size="29"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5tm-t6-d4d">
<rect key="frame" x="661" y="20" width="285" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" id="xsO-tH-twa">
<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>
</view>
<connections>
<outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
</connections>
<point key="canvasLocation" x="139" y="161.5"/>
</window>
</objects>
</document>

View File

@ -1,2 +1,2 @@
version 2.0
build 297
build 411