AVRSack/AVRsack/ASFileTree.swift

115 lines
3.0 KiB
Swift
Raw Normal View History

2014-11-16 18:39:32 +00:00
//
// ASFileTree.swift
// AVRsack
//
// Created by Matthias Neeracher on 11/16/14.
// Copyright (c) 2014 Aere Perennius. All rights reserved.
//
import Foundation
enum ASFileType : String {
case Unknown = ""
case Header = "source.h"
case CFile = "source.c"
case Arduino = "source.ino"
case CppFile = "source.c++"
case AsmFile = "source.asm"
case Markdown = "doc.md"
static func guessForURL(url: NSURL) -> ASFileType {
switch url.pathExtension.lowercaseString {
case "hpp", "hh", "h":
return .Header
case "c":
return .CFile
case "ino":
return .Arduino
case "cpp", "c++", "cxx", "cc":
return .CppFile
case "s":
return .AsmFile
case "md":
return .Markdown
default:
return .Unknown
}
}
var aceMode : ACEMode {
switch self {
case .Header,.CFile,.CppFile,.Arduino:
return ACEModeCPP
case .Markdown:
return ACEModeMarkdown
default:
return ACEModeASCIIDoc
}
}
}
class ASFileNode {
func nodeName() -> String {
return ""
}
}
class ASFileGroup : ASFileNode {
var name : String
var children : [ASFileNode]
var expanded : Bool
init(name: String) {
self.name = name
self.children = []
self.expanded = true
}
convenience override init() {
self.init(name: "")
}
override func nodeName() -> String {
return (expanded ? "📂" : "📁")+" "+name
}
}
class ASFileItem : ASFileNode {
var url : NSURL
var type : ASFileType
init(url: NSURL, type: ASFileType) {
self.url = url
self.type = type
}
override func nodeName() -> String {
return "📄 "+url.lastPathComponent
}
}
class ASFileTree : NSObject, NSOutlineViewDataSource {
let root = ASFileGroup()
func addFileURL(url: NSURL, omitUnknown: Bool = true) {
let type = ASFileType.guessForURL(url)
if !omitUnknown || type != .Unknown {
root.children.append(ASFileItem(url: url, type: type))
}
}
func outlineView(outlineView: NSOutlineView, numberOfChildrenOfItem item: AnyObject?) -> Int {
if item == nil {
return root.children.count
} else {
return (item as ASFileGroup).children.count
}
}
func outlineView(outlineView: NSOutlineView, child index: Int, ofItem item: AnyObject?) -> AnyObject {
let group = (item == nil) ? root : (item as ASFileGroup)
return group.children[index]
}
func outlineView(outlineView: NSOutlineView, isItemExpandable item: AnyObject) -> Bool {
return item is ASFileGroup
}
func outlineView(outlineView: NSOutlineView, objectValueForTableColumn tableColumn: NSTableColumn?, byItem item: AnyObject?) -> AnyObject? {
return (item as ASFileItem).nodeName()
}
}