diff --git a/AVRsack/ASApplication.swift b/AVRsack/ASApplication.swift index 46fa2f6..fd7cd2e 100644 --- a/AVRsack/ASApplication.swift +++ b/AVRsack/ASApplication.swift @@ -88,6 +88,12 @@ class ASApplication: NSObject, NSApplicationDelegate, NSMenuDelegate { let examplePath = arduinoPath.stringByAppendingPathComponent("Contents/Resources/Java/examples") ASSketchBook.addSketches(menu, target: self, action: "openExample:", path: examplePath, sketches: &examples) } + case "Import Standard Library": + menu.removeAllItems() + ASLibraries.instance().addStandardLibrariesToMenu(menu) + case "Import Contributed Library": + menu.removeAllItems() + ASLibraries.instance().addContribLibrariesToMenu(menu) case "Serial Monitor": menu.itemAtIndex(0)?.hidden = !hasDocument() while menu.numberOfItems > 2 { diff --git a/AVRsack/ASBuilder.swift b/AVRsack/ASBuilder.swift index 8b1aa70..3c1e627 100644 --- a/AVRsack/ASBuilder.swift +++ b/AVRsack/ASBuilder.swift @@ -134,7 +134,6 @@ class ASBuilder { return } - let libPath = (ASLibraries.instance().directories as NSArray).componentsJoinedByString(":") let boardProp = ASHardware.instance().boards[board]! let progProp = ASHardware.instance().programmers[programmer] let hasBootloader = !useProgrammer && boardProp["upload.protocol"] != nil diff --git a/AVRsack/ASHardware.swift b/AVRsack/ASHardware.swift index a915c66..c026950 100644 --- a/AVRsack/ASHardware.swift +++ b/AVRsack/ASHardware.swift @@ -143,31 +143,66 @@ class ASHardware { } private let librariesInstance = ASLibraries() -class ASLibraries { +class ASLibraries : NSObject { class func instance() -> ASLibraries { return librariesInstance } var directories = [String]() var libraries = [String]() - init() { + var standardLib = [String]() + var contribLib = [String]() + override init() { // // Gather hardware directories // let userDefaults = NSUserDefaults.standardUserDefaults() let fileManager = NSFileManager.defaultManager() - if let arduinoPath = userDefaults.stringForKey("Arduino") { - let arduinoLibrariesPath = arduinoPath + "/Contents/Resources/Java/libraries" - let dirs = subdirectories(arduinoLibrariesPath) - if dirs.count > 0 { - directories.append(arduinoLibrariesPath) - libraries += dirs - } - } for sketchDir in userDefaults.objectForKey("Sketchbooks") as! [String] { let librariesPath = sketchDir + "/libraries" let dirs = subdirectories(librariesPath) if dirs.count > 0 { directories.append(librariesPath) libraries += dirs + contribLib += dirs + } + } + if let arduinoPath = userDefaults.stringForKey("Arduino") { + let arduinoLibrariesPath = arduinoPath + "/Contents/Resources/Java/libraries" + let dirs = subdirectories(arduinoLibrariesPath) + if dirs.count > 0 { + directories.append(arduinoLibrariesPath) + libraries += dirs + standardLib += dirs } } } + func addStandardLibrariesToMenu(menu: NSMenu) { + for (index,lib) in enumerate(standardLib) { + let menuItem = menu.addItemWithTitle(lib.lastPathComponent, action: "importStandardLibrary:", keyEquivalent: "") + menuItem?.target = self + menuItem?.tag = index + } + } + func addContribLibrariesToMenu(menu: NSMenu) { + for (index,lib) in enumerate(contribLib) { + let menuItem = menu.addItemWithTitle(lib.lastPathComponent, action: "importContribLibrary:", keyEquivalent: "") + menuItem?.target = self + menuItem?.tag = index + } + } + @IBAction func importStandardLibrary(menuItem: AnyObject) { + if let tag = (menuItem as? NSMenuItem)?.tag { + NSApplication.sharedApplication().sendAction("importLibrary:", to: nil, from: standardLib[tag]) + } + } + @IBAction func importContribLibrary(menuItem: AnyObject) { + if let tag = (menuItem as? NSMenuItem)?.tag { + NSApplication.sharedApplication().sendAction("importLibrary:", to: nil, from: contribLib[tag]) + } + } + + func validateUserInterfaceItem(anItem: NSValidatedUserInterfaceItem) -> Bool { + if let validator = NSApplication.sharedApplication().targetForAction("importLibrary:") as? NSUserInterfaceValidations { + return validator.validateUserInterfaceItem(anItem) + } + return false + } } diff --git a/AVRsack/ASProjDoc.swift b/AVRsack/ASProjDoc.swift index 911c0a4..efb28a6 100644 --- a/AVRsack/ASProjDoc.swift +++ b/AVRsack/ASProjDoc.swift @@ -605,6 +605,29 @@ class ASProjDoc: NSDocument, NSOutlineViewDelegate, NSMenuDelegate, NSOpenSavePa }) } + func importLibrary(lib: String) { + var includes = "" + let fileManager = NSFileManager.defaultManager() + for file in fileManager.contentsOfDirectoryAtPath(lib, error: nil) as! [String] { + if file.hasSuffix(".h") { + includes += "#include <\(file)>\n" + } + } + var text = editor.string() as NSString + var insert = NSMakeRange(text.length, 0) + let postHeaderComments = NSRegularExpression(pattern: "((?:\\s+|/\\*.*?\\*/|//.*?\\n)*)(.*?\\n)", options: .DotMatchesLineSeparators, error: nil)! + if let match = postHeaderComments.firstMatchInString(text as String, options:.Anchored, range:NSMakeRange(0, text.length)) { + let range = match.rangeAtIndex(2) + insert.location = range.location + let content = text.substringWithRange(range) + if !content.hasPrefix("#include") { + includes += "\n" + } + } + + editor.setString(text.stringByReplacingCharactersInRange(insert, withString: includes)) + } + // MARK: Editor configuration @IBAction func changeTheme(item: NSMenuItem) { @@ -633,6 +656,10 @@ class ASProjDoc: NSDocument, NSOutlineViewDelegate, NSMenuDelegate, NSOpenSavePa menuItem.title = port return true + } else if menuItem.action == "importStandardLibrary:" || + menuItem.action == "importContribLibrary:" + { + return mainEditor is ASFileItem } } return super.validateUserInterfaceItem(anItem) diff --git a/AVRsack/ASSerialWin.xib b/AVRsack/ASSerialWin.xib index e920db2..3d9f2fd 100644 --- a/AVRsack/ASSerialWin.xib +++ b/AVRsack/ASSerialWin.xib @@ -1,7 +1,7 @@ - + - + diff --git a/AVRsack/Base.lproj/ASProjDoc.xib b/AVRsack/Base.lproj/ASProjDoc.xib index d900466..612e421 100644 --- a/AVRsack/Base.lproj/ASProjDoc.xib +++ b/AVRsack/Base.lproj/ASProjDoc.xib @@ -1,7 +1,7 @@ - + - + @@ -34,13 +34,13 @@ - + - + @@ -51,7 +51,7 @@ - + @@ -76,12 +76,12 @@ - - -