From 70867909ebdc89ba26bb7ce4454781d5bdde61d2 Mon Sep 17 00:00:00 2001 From: Kilian Hofmann Date: Sun, 18 Jun 2017 22:11:32 +0200 Subject: [PATCH] PDF Export done (actually increases load tim edge to memory and shit) --- Docsis Toolkit.xcodeproj/project.pbxproj | 80 +++++++- .../xcdebugger/Breakpoints_v2.xcbkptlist | 18 ++ Graphic Analysis 2/AppDelegate.swift | 3 +- Graphic Analysis 2/CollectionViewMonth.swift | 15 ++ Graphic Analysis 2/CollectionViewYear.swift | 2 + Graphic Analysis 2/Document.swift | 82 +++++++- Graphic Analysis 2/Document.xib | 83 ++++---- Graphic Analysis 2/Info.plist | 2 +- Graphic Analysis 2/MainMenu.xib | 13 +- Graphic Analysis 2/PDFDraw.swift | 130 ++++++++++++ Graphic Analysis 2/PDFDraw.xib | 186 ++++++++++++++++++ .../PDFItemViewController.swift | 66 +++++++ Graphic Analysis 2/PDFItemViewController.xib | 91 +++++++++ Graphic Analysis 2/PDFTitle.swift | 53 +++++ Graphic Analysis 2/PDFTitle.xib | 63 ++++++ Graphic Analysis 2/buildnum.ver | 2 +- 16 files changed, 825 insertions(+), 64 deletions(-) create mode 100644 Graphic Analysis 2/PDFDraw.swift create mode 100644 Graphic Analysis 2/PDFDraw.xib create mode 100644 Graphic Analysis 2/PDFItemViewController.swift create mode 100644 Graphic Analysis 2/PDFItemViewController.xib create mode 100644 Graphic Analysis 2/PDFTitle.swift create mode 100644 Graphic Analysis 2/PDFTitle.xib diff --git a/Docsis Toolkit.xcodeproj/project.pbxproj b/Docsis Toolkit.xcodeproj/project.pbxproj index 6f146aa..ba3abc0 100644 --- a/Docsis Toolkit.xcodeproj/project.pbxproj +++ b/Docsis Toolkit.xcodeproj/project.pbxproj @@ -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 = ""; }; E2218D631EF45F37004298F6 /* LossDistributionPie.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LossDistributionPie.swift; sourceTree = ""; }; 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 = ""; }; + E2268DF71EF7095100C97726 /* PDFTitle.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PDFTitle.xib; sourceTree = ""; }; E262463C1EF55BCE00EAA4A6 /* GraphWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GraphWindow.swift; sourceTree = ""; }; E262463D1EF55BCE00EAA4A6 /* GraphWindow.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = GraphWindow.xib; sourceTree = ""; }; + E26246421EF5E64900EAA4A6 /* PDFDraw.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PDFDraw.swift; sourceTree = ""; }; + E26246431EF5E64900EAA4A6 /* PDFDraw.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PDFDraw.xib; sourceTree = ""; }; + E26246461EF6684B00EAA4A6 /* PDFItemViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = PDFItemViewController.xib; sourceTree = ""; }; + E26246481EF6688400EAA4A6 /* PDFItemViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PDFItemViewController.swift; sourceTree = ""; }; /* 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 = ""; @@ -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 = ""; @@ -315,6 +325,54 @@ E2218D5F1EF40E23004298F6 /* CollectionViewYear.swift */, E2218D5B1EF3DD6F004298F6 /* CollectionViewItemMonth.swift */, E2218D551EF335E6004298F6 /* CollectionViewItemYear.swift */, + E2218D631EF45F37004298F6 /* LossDistributionPie.swift */, + ); + name = "Collection View"; + sourceTree = ""; + }; + E2268DF51EF7093600C97726 /* PDF Generation */ = { + isa = PBXGroup; + children = ( + E26246421EF5E64900EAA4A6 /* PDFDraw.swift */, + E26246481EF6688400EAA4A6 /* PDFItemViewController.swift */, + E2268DF61EF7095100C97726 /* PDFTitle.swift */, + ); + name = "PDF Generation"; + sourceTree = ""; + }; + E2268DFA1EF712D300C97726 /* Graph View */ = { + isa = PBXGroup; + children = ( + E2218D511EF32AC6004298F6 /* GraphDetailsController.swift */, + E262463C1EF55BCE00EAA4A6 /* GraphWindow.swift */, + ); + name = "Graph View"; + sourceTree = ""; + }; + E2268DFB1EF712F000C97726 /* PDF Generation */ = { + isa = PBXGroup; + children = ( + E26246431EF5E64900EAA4A6 /* PDFDraw.xib */, + E26246461EF6684B00EAA4A6 /* PDFItemViewController.xib */, + E2268DF71EF7095100C97726 /* PDFTitle.xib */, + ); + name = "PDF Generation"; + sourceTree = ""; + }; + E2268DFC1EF712F800C97726 /* Graph View */ = { + isa = PBXGroup; + children = ( + E2218D4B1EF329A6004298F6 /* GraphDetailsController.xib */, + E262463D1EF55BCE00EAA4A6 /* GraphWindow.xib */, + ); + name = "Graph View"; + sourceTree = ""; + }; + E2268DFD1EF712FF00C97726 /* Collection View */ = { + isa = PBXGroup; + children = ( + E2218D5C1EF3DD6F004298F6 /* CollectionViewItemMonth.xib */, + E2218D561EF335E6004298F6 /* CollectionViewItemYear.xib */, ); name = "Collection View"; sourceTree = ""; @@ -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 */, diff --git a/Docsis Toolkit.xcodeproj/xcuserdata/Kili2.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Docsis Toolkit.xcodeproj/xcuserdata/Kili2.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index fe2b454..8f73b99 100644 --- a/Docsis Toolkit.xcodeproj/xcuserdata/Kili2.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/Docsis Toolkit.xcodeproj/xcuserdata/Kili2.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -2,4 +2,22 @@ + + + + + + diff --git a/Graphic Analysis 2/AppDelegate.swift b/Graphic Analysis 2/AppDelegate.swift index ac48b76..cc7aacb 100644 --- a/Graphic Analysis 2/AppDelegate.swift +++ b/Graphic Analysis 2/AppDelegate.swift @@ -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) { diff --git a/Graphic Analysis 2/CollectionViewMonth.swift b/Graphic Analysis 2/CollectionViewMonth.swift index 3a69bfd..41bd894 100644 --- a/Graphic Analysis 2/CollectionViewMonth.swift +++ b/Graphic Analysis 2/CollectionViewMonth.swift @@ -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 diff --git a/Graphic Analysis 2/CollectionViewYear.swift b/Graphic Analysis 2/CollectionViewYear.swift index 1f68c90..cd7b467 100644 --- a/Graphic Analysis 2/CollectionViewYear.swift +++ b/Graphic Analysis 2/CollectionViewYear.swift @@ -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() } } diff --git a/Graphic Analysis 2/Document.swift b/Graphic Analysis 2/Document.swift index 48c8d2d..a7319f4 100644 --- a/Graphic Analysis 2/Document.swift +++ b/Graphic Analysis 2/Document.swift @@ -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 + } + } + } + } } diff --git a/Graphic Analysis 2/Document.xib b/Graphic Analysis 2/Document.xib index 55330b9..0ba2ac4 100644 --- a/Graphic Analysis 2/Document.xib +++ b/Graphic Analysis 2/Document.xib @@ -10,6 +10,7 @@ + @@ -19,21 +20,22 @@ - + - - + + - + - - - + + + + - + @@ -44,10 +46,6 @@ - - - - - - - + + + + - + @@ -74,10 +73,6 @@ - - - - - - - - - - + + + - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + diff --git a/Graphic Analysis 2/Info.plist b/Graphic Analysis 2/Info.plist index f8212ff..392ab50 100644 --- a/Graphic Analysis 2/Info.plist +++ b/Graphic Analysis 2/Info.plist @@ -44,7 +44,7 @@ CFBundleShortVersionString 2.0 CFBundleVersion - 297 + 411 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/Graphic Analysis 2/MainMenu.xib b/Graphic Analysis 2/MainMenu.xib index 15c54da..1400a27 100644 --- a/Graphic Analysis 2/MainMenu.xib +++ b/Graphic Analysis 2/MainMenu.xib @@ -14,11 +14,11 @@ - + - + @@ -55,7 +55,7 @@ - + @@ -82,6 +82,11 @@ + + + + + @@ -92,7 +97,7 @@ - + diff --git a/Graphic Analysis 2/PDFDraw.swift b/Graphic Analysis 2/PDFDraw.swift new file mode 100644 index 0000000..8ad1092 --- /dev/null +++ b/Graphic Analysis 2/PDFDraw.swift @@ -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) + } +} diff --git a/Graphic Analysis 2/PDFDraw.xib b/Graphic Analysis 2/PDFDraw.xib new file mode 100644 index 0000000..348f048 --- /dev/null +++ b/Graphic Analysis 2/PDFDraw.xib @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Graphic Analysis 2/PDFItemViewController.swift b/Graphic Analysis 2/PDFItemViewController.swift new file mode 100644 index 0000000..d4466b8 --- /dev/null +++ b/Graphic Analysis 2/PDFItemViewController.swift @@ -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 + } +} diff --git a/Graphic Analysis 2/PDFItemViewController.xib b/Graphic Analysis 2/PDFItemViewController.xib new file mode 100644 index 0000000..ee1650d --- /dev/null +++ b/Graphic Analysis 2/PDFItemViewController.xib @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Graphic Analysis 2/PDFTitle.swift b/Graphic Analysis 2/PDFTitle.swift new file mode 100644 index 0000000..cbb05c4 --- /dev/null +++ b/Graphic Analysis 2/PDFTitle.swift @@ -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)" + } +} diff --git a/Graphic Analysis 2/PDFTitle.xib b/Graphic Analysis 2/PDFTitle.xib new file mode 100644 index 0000000..6af4795 --- /dev/null +++ b/Graphic Analysis 2/PDFTitle.xib @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Graphic Analysis 2/buildnum.ver b/Graphic Analysis 2/buildnum.ver index 20335fc..474d811 100644 --- a/Graphic Analysis 2/buildnum.ver +++ b/Graphic Analysis 2/buildnum.ver @@ -1,2 +1,2 @@ version 2.0 -build 297 +build 411