From 43a9dbfb028e263811ba73f232844160154c1e40 Mon Sep 17 00:00:00 2001 From: Matthias Neeracher Date: Mon, 12 Jan 2015 04:24:29 +0100 Subject: [PATCH] Create Sketch --- AVRsack/ASApplication.swift | 17 +++++++++++ AVRsack/ASProjDoc.swift | 54 ++++++++++++++++++++++++++++++--- AVRsack/Base.lproj/MainMenu.xib | 20 +++++++++--- 3 files changed, 82 insertions(+), 9 deletions(-) diff --git a/AVRsack/ASApplication.swift b/AVRsack/ASApplication.swift index a1fcfd7..049b567 100644 --- a/AVRsack/ASApplication.swift +++ b/AVRsack/ASApplication.swift @@ -152,6 +152,23 @@ class ASApplication: NSObject, NSApplicationDelegate, NSMenuDelegate { let url = NSURL(fileURLWithPath: examples[item.tag])! openTemplate(url.URLByDeletingLastPathComponent!) } + + @IBAction func createSketch(AnyObject) { + ASApplication.newProjectLocation(nil, + message: "Create Project") + { (saveTo) -> Void in + let fileManager = NSFileManager.defaultManager() + fileManager.createDirectoryAtURL(saveTo, withIntermediateDirectories:false, attributes:nil, error:nil) + let proj = saveTo.URLByAppendingPathComponent(saveTo.lastPathComponent+".avrsackproj") + let docController = NSDocumentController.sharedDocumentController() as NSDocumentController + if let doc = docController.openUntitledDocumentAndDisplay(true, error:nil) as? ASProjDoc { + doc.fileURL = proj + doc.updateProjectURL() + doc.createFileAtURL(saveTo.URLByAppendingPathComponent(saveTo.lastPathComponent+".ino")) + doc.writeToURL(proj, ofType: "Project", forSaveOperation: .SaveAsOperation, originalContentsURL: nil, error: nil) + } + } + } class func newProjectLocation(documentWindow: NSWindow?, message: String, completion: (NSURL) -> ()) { let savePanel = NSSavePanel() diff --git a/AVRsack/ASProjDoc.swift b/AVRsack/ASProjDoc.swift index 6de436c..2d34b71 100644 --- a/AVRsack/ASProjDoc.swift +++ b/AVRsack/ASProjDoc.swift @@ -151,6 +151,11 @@ class ASProjDoc: NSDocument, NSOutlineViewDelegate, NSMenuDelegate, NSOpenSavePa return NSPropertyListSerialization.dataFromPropertyList(data, format: .XMLFormat_v1_0, errorDescription: nil) } + func updateProjectURL() { + files.setProjectURL(fileURL!) + builder.setProjectURL(fileURL!) + } + func importProject(url: NSURL, error outError: NSErrorPointer) -> Bool { let existingProject = url.URLByAppendingPathComponent(url.lastPathComponent+".avrsackproj") if existingProject.checkResourceIsReachableAndReturnError(nil) { @@ -160,7 +165,7 @@ class ASProjDoc: NSDocument, NSOutlineViewDelegate, NSMenuDelegate, NSOpenSavePa let filesInProject = NSFileManager.defaultManager().contentsOfDirectoryAtURL(url, includingPropertiesForKeys: nil, options: .SkipsHiddenFiles, error: nil)! - files.setProjectURL(fileURL!) + updateProjectURL() for file in filesInProject { files.addFileURL(file as NSURL) } @@ -173,8 +178,6 @@ class ASProjDoc: NSDocument, NSOutlineViewDelegate, NSMenuDelegate, NSOpenSavePa let projectURL = url.URLByDeletingPathExtension!.URLByAppendingPathExtension("avrsackproj") success = importProject(url.URLByDeletingLastPathComponent!, error: outError) if success { - files.setProjectURL(projectURL) - builder.setProjectURL(projectURL) fileURL = projectURL success = writeToURL(projectURL, ofType: "Project", forSaveOperation: .SaveAsOperation, originalContentsURL: nil, error: outError) } @@ -187,8 +190,7 @@ class ASProjDoc: NSDocument, NSOutlineViewDelegate, NSMenuDelegate, NSOpenSavePa if typeName != "Project" { return false } - files.setProjectURL(fileURL!) - builder.setProjectURL(fileURL!) + updateProjectURL() let projectData : NSDictionary = NSPropertyListSerialization.propertyListFromData(data, mutabilityOption: .Immutable, format: nil, errorDescription: nil) as NSDictionary let projectVersion = projectData[kVersionKey] as Double assert(projectVersion <= floor(kCurVersion+1.0), "Project version too new for this app") @@ -390,6 +392,48 @@ class ASProjDoc: NSDocument, NSOutlineViewDelegate, NSMenuDelegate, NSOpenSavePa return selectedFiles().count > 0 } + func createFileAtURL(url:NSURL) { + let type = ASFileType.guessForURL(url) + var firstPfx = "" + var prefix = "" + var lastPfx = "" + switch type { + case .Header, .CFile: + firstPfx = "/*" + prefix = " *" + lastPfx = " */" + case .CppFile, .Arduino: + prefix = "//" + case .AsmFile: + prefix = ";" + case .Markdown: + firstPfx = "" + default: + break + } + var header = "" + if prefix != "" { + if firstPfx == "" { + firstPfx = prefix + } + if lastPfx == "" { + lastPfx = prefix + } + let dateFmt = NSDateFormatter() + dateFmt.dateFormat = "yyyy-MM-dd" + header = firstPfx + "\n" + + prefix + " Project: " + fileURL!.URLByDeletingLastPathComponent!.lastPathComponent + "\n" + + prefix + " File: " + url.lastPathComponent + "\n" + + prefix + " Created: " + dateFmt.stringFromDate(NSDate()) + "\n" + + lastPfx + "\n\n" + } + header.writeToURL(url, atomically: true, encoding: NSUTF8StringEncoding, error: nil) + files.addFileURL(url) + outline.reloadData() + } + // MARK: Editor configuration @IBAction func changeTheme(item: NSMenuItem) { diff --git a/AVRsack/Base.lproj/MainMenu.xib b/AVRsack/Base.lproj/MainMenu.xib index b07b68b..fe4d80d 100644 --- a/AVRsack/Base.lproj/MainMenu.xib +++ b/AVRsack/Base.lproj/MainMenu.xib @@ -74,10 +74,22 @@ - - - - + + + + + + + + + + + + + + + +