Edit files, parse project folders
This commit is contained in:
parent
dd506616b3
commit
2c59b97dd9
|
@ -13,6 +13,7 @@
|
||||||
9501D8091A17025C0034C530 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9501D8081A17025C0034C530 /* Images.xcassets */; };
|
9501D8091A17025C0034C530 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9501D8081A17025C0034C530 /* Images.xcassets */; };
|
||||||
9501D80C1A17025C0034C530 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9501D80A1A17025C0034C530 /* MainMenu.xib */; };
|
9501D80C1A17025C0034C530 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9501D80A1A17025C0034C530 /* MainMenu.xib */; };
|
||||||
9501D8181A17025C0034C530 /* AVRsackTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9501D8171A17025C0034C530 /* AVRsackTests.swift */; };
|
9501D8181A17025C0034C530 /* AVRsackTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9501D8171A17025C0034C530 /* AVRsackTests.swift */; };
|
||||||
|
95BF80EB1A185C9E0004A693 /* ASFileTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95BF80EA1A185C9E0004A693 /* ASFileTree.swift */; };
|
||||||
95EA32621A17B90600F66EB0 /* ACEView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95EA325B1A17B8DA00F66EB0 /* ACEView.framework */; };
|
95EA32621A17B90600F66EB0 /* ACEView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95EA325B1A17B8DA00F66EB0 /* ACEView.framework */; };
|
||||||
95EA32651A17BA8C00F66EB0 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95EA32631A17BA8C00F66EB0 /* Cocoa.framework */; };
|
95EA32651A17BA8C00F66EB0 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95EA32631A17BA8C00F66EB0 /* Cocoa.framework */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
@ -67,6 +68,7 @@
|
||||||
9501D8161A17025C0034C530 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
9501D8161A17025C0034C530 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
9501D8171A17025C0034C530 /* AVRsackTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AVRsackTests.swift; sourceTree = "<group>"; };
|
9501D8171A17025C0034C530 /* AVRsackTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AVRsackTests.swift; sourceTree = "<group>"; };
|
||||||
958D76811A17DA1C00917D96 /* AVRsack-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AVRsack-Bridging-Header.h"; sourceTree = "<group>"; };
|
958D76811A17DA1C00917D96 /* AVRsack-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AVRsack-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||||
|
95BF80EA1A185C9E0004A693 /* ASFileTree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ASFileTree.swift; sourceTree = "<group>"; };
|
||||||
95EA32541A17B8DA00F66EB0 /* ACEView.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ACEView.xcodeproj; path = ../ACEView/ACEView.xcodeproj; sourceTree = "<group>"; };
|
95EA32541A17B8DA00F66EB0 /* ACEView.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ACEView.xcodeproj; path = ../ACEView/ACEView.xcodeproj; sourceTree = "<group>"; };
|
||||||
95EA32631A17BA8C00F66EB0 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
|
95EA32631A17BA8C00F66EB0 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
|
||||||
95EA32641A17BA8C00F66EB0 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
|
95EA32641A17BA8C00F66EB0 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
|
||||||
|
@ -117,9 +119,8 @@
|
||||||
958D76811A17DA1C00917D96 /* AVRsack-Bridging-Header.h */,
|
958D76811A17DA1C00917D96 /* AVRsack-Bridging-Header.h */,
|
||||||
9501D8011A17025C0034C530 /* ASApplication.swift */,
|
9501D8011A17025C0034C530 /* ASApplication.swift */,
|
||||||
9501D8031A17025C0034C530 /* ASProjDoc.swift */,
|
9501D8031A17025C0034C530 /* ASProjDoc.swift */,
|
||||||
9501D8051A17025C0034C530 /* ASProjDoc.xib */,
|
95BF80EA1A185C9E0004A693 /* ASFileTree.swift */,
|
||||||
9501D8081A17025C0034C530 /* Images.xcassets */,
|
95BF80EC1A185CD90004A693 /* Resources */,
|
||||||
9501D80A1A17025C0034C530 /* MainMenu.xib */,
|
|
||||||
9501D7FF1A17025C0034C530 /* Supporting Files */,
|
9501D7FF1A17025C0034C530 /* Supporting Files */,
|
||||||
95EA32671A17BAA600F66EB0 /* Frameworks */,
|
95EA32671A17BAA600F66EB0 /* Frameworks */,
|
||||||
);
|
);
|
||||||
|
@ -151,6 +152,16 @@
|
||||||
name = "Supporting Files";
|
name = "Supporting Files";
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
95BF80EC1A185CD90004A693 /* Resources */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
9501D8081A17025C0034C530 /* Images.xcassets */,
|
||||||
|
9501D80A1A17025C0034C530 /* MainMenu.xib */,
|
||||||
|
9501D8051A17025C0034C530 /* ASProjDoc.xib */,
|
||||||
|
);
|
||||||
|
name = Resources;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
95EA32551A17B8DA00F66EB0 /* Products */ = {
|
95EA32551A17B8DA00F66EB0 /* Products */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
@ -303,6 +314,7 @@
|
||||||
files = (
|
files = (
|
||||||
9501D8041A17025C0034C530 /* ASProjDoc.swift in Sources */,
|
9501D8041A17025C0034C530 /* ASProjDoc.swift in Sources */,
|
||||||
9501D8021A17025C0034C530 /* ASApplication.swift in Sources */,
|
9501D8021A17025C0034C530 /* ASApplication.swift in Sources */,
|
||||||
|
95BF80EB1A185C9E0004A693 /* ASFileTree.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
|
|
@ -10,9 +10,6 @@ import Cocoa
|
||||||
|
|
||||||
@NSApplicationMain
|
@NSApplicationMain
|
||||||
class ASApplication: NSObject, NSApplicationDelegate {
|
class ASApplication: NSObject, NSApplicationDelegate {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func applicationDidFinishLaunching(aNotification: NSNotification) {
|
func applicationDidFinishLaunching(aNotification: NSNotification) {
|
||||||
// Insert code here to initialize your application
|
// Insert code here to initialize your application
|
||||||
}
|
}
|
||||||
|
@ -20,7 +17,5 @@ class ASApplication: NSObject, NSApplicationDelegate {
|
||||||
func applicationWillTerminate(aNotification: NSNotification) {
|
func applicationWillTerminate(aNotification: NSNotification) {
|
||||||
// Insert code here to tear down your application
|
// Insert code here to tear down your application
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
115
AVRsack/ASFileTree.swift
Normal file
115
AVRsack/ASFileTree.swift
Normal file
|
@ -0,0 +1,115 @@
|
||||||
|
//
|
||||||
|
// 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()
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,9 +8,11 @@
|
||||||
|
|
||||||
import Cocoa
|
import Cocoa
|
||||||
|
|
||||||
class ASProjDoc: NSDocument {
|
class ASProjDoc: NSDocument, NSOutlineViewDelegate {
|
||||||
@IBOutlet weak var editor : ACEView!
|
@IBOutlet weak var editor : ACEView!
|
||||||
@IBOutlet weak var outline: NSOutlineView!
|
@IBOutlet weak var outline : NSOutlineView!
|
||||||
|
let files : ASFileTree = ASFileTree()
|
||||||
|
var mainEditor : ASFileNode?
|
||||||
|
|
||||||
override init() {
|
override init() {
|
||||||
super.init()
|
super.init()
|
||||||
|
@ -19,9 +21,7 @@ class ASProjDoc: NSDocument {
|
||||||
|
|
||||||
override func windowControllerDidLoadNib(aController: NSWindowController) {
|
override func windowControllerDidLoadNib(aController: NSWindowController) {
|
||||||
super.windowControllerDidLoadNib(aController)
|
super.windowControllerDidLoadNib(aController)
|
||||||
editor.setString("Here we go!")
|
outline.setDataSource(files)
|
||||||
editor.setMode(UInt(ACEModeASCIIDoc))
|
|
||||||
editor.setTheme(UInt(ACEThemeXcode))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override class func autosavesInPlace() -> Bool {
|
override class func autosavesInPlace() -> Bool {
|
||||||
|
@ -35,20 +35,53 @@ class ASProjDoc: NSDocument {
|
||||||
}
|
}
|
||||||
|
|
||||||
override func dataOfType(typeName: String, error outError: NSErrorPointer) -> NSData? {
|
override func dataOfType(typeName: String, error outError: NSErrorPointer) -> NSData? {
|
||||||
// Insert code here to write your document to data of the specified type. If outError != nil, ensure that you create and set an appropriate error when returning nil.
|
|
||||||
// You can also choose to override fileWrapperOfType:error:, writeToURL:ofType:error:, or writeToURL:ofType:forSaveOperation:originalContentsURL:error: instead.
|
|
||||||
outError.memory = NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
|
outError.memory = NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
override func readFromData(data: NSData, ofType typeName: String, error outError: NSErrorPointer) -> Bool {
|
func importProject(url: NSURL, error outError: NSErrorPointer) -> Bool {
|
||||||
// Insert code here to read your document from the given data of the specified type. If outError != nil, ensure that you create and set an appropriate error when returning false.
|
let existingProject = url.URLByAppendingPathComponent(url.lastPathComponent+".avrsackproj")
|
||||||
// You can also choose to override readFromFileWrapper:ofType:error: or readFromURL:ofType:error: instead.
|
if existingProject.checkResourceIsReachableAndReturnError(nil) {
|
||||||
// If you override either of these, you should also override -isEntireFileLoaded to return NO if the contents are lazily loaded.
|
fileURL = existingProject
|
||||||
outError.memory = NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
|
return readFromURL(existingProject, ofType:"Project", error:outError)
|
||||||
return false
|
}
|
||||||
|
let filesInProject =
|
||||||
|
NSFileManager.defaultManager().contentsOfDirectoryAtURL(url, includingPropertiesForKeys: nil,
|
||||||
|
options: .SkipsHiddenFiles, error: nil)!
|
||||||
|
for file in filesInProject {
|
||||||
|
files.addFileURL(file as NSURL)
|
||||||
|
}
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override func readFromURL(url: NSURL, ofType typeName: String, error outError: NSErrorPointer) -> Bool {
|
||||||
|
var success : Bool = false
|
||||||
|
if typeName == "Arduino Source File" {
|
||||||
|
let projectURL = url.URLByDeletingPathExtension!.URLByAppendingPathExtension("avrsackproj")
|
||||||
|
fileURL = projectURL
|
||||||
|
success = importProject(url.URLByDeletingLastPathComponent!, error: outError)
|
||||||
|
} else {
|
||||||
|
success = true
|
||||||
|
}
|
||||||
|
return success
|
||||||
|
}
|
||||||
|
|
||||||
|
func outlineViewSelectionDidChange(notification: NSNotification) {
|
||||||
|
let selection = outline.itemAtRow(outline.selectedRow) as ASFileNode?
|
||||||
|
if selection !== mainEditor {
|
||||||
|
saveCurEditor()
|
||||||
|
}
|
||||||
|
if let file = (selection as? ASFileItem) {
|
||||||
|
var enc : UInt = 0
|
||||||
|
editor.setString(NSString(contentsOfURL:file.url, usedEncoding:&enc, error:nil))
|
||||||
|
editor.setMode(UInt(file.type.aceMode))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func saveCurEditor() {
|
||||||
|
if let file = (mainEditor as? ASFileItem) {
|
||||||
|
editor.string().writeToURL(file.url, atomically: true, encoding: NSUTF8StringEncoding, error: nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,6 @@
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<outlineView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" indentationPerLevel="16" outlineTableColumn="89u-w6-f1G" id="nij-C2-Fna">
|
<outlineView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" indentationPerLevel="16" outlineTableColumn="89u-w6-f1G" id="nij-C2-Fna">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="238" height="134"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<size key="intercellSpacing" width="3" height="2"/>
|
<size key="intercellSpacing" width="3" height="2"/>
|
||||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||||
|
@ -52,27 +51,11 @@
|
||||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
|
||||||
<prototypeCellViews>
|
|
||||||
<tableCellView id="WhD-Fb-1Zu">
|
|
||||||
<rect key="frame" x="1" y="1" width="179" height="17"/>
|
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
|
||||||
<subviews>
|
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="3l3-7H-YtI">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="100" height="17"/>
|
|
||||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="VmI-Rd-18R">
|
|
||||||
<font key="font" metaFont="system"/>
|
|
||||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
|
||||||
</textFieldCell>
|
|
||||||
</textField>
|
|
||||||
</subviews>
|
|
||||||
<connections>
|
|
||||||
<outlet property="textField" destination="3l3-7H-YtI" id="Lvp-5L-4Ug"/>
|
|
||||||
</connections>
|
|
||||||
</tableCellView>
|
|
||||||
</prototypeCellViews>
|
|
||||||
</tableColumn>
|
</tableColumn>
|
||||||
</tableColumns>
|
</tableColumns>
|
||||||
|
<connections>
|
||||||
|
<outlet property="delegate" destination="-2" id="FXh-tV-xFH"/>
|
||||||
|
</connections>
|
||||||
</outlineView>
|
</outlineView>
|
||||||
</subviews>
|
</subviews>
|
||||||
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||||
|
|
|
@ -24,6 +24,22 @@
|
||||||
<key>NSDocumentClass</key>
|
<key>NSDocumentClass</key>
|
||||||
<string>AVRsack.ASProjDoc</string>
|
<string>AVRsack.ASProjDoc</string>
|
||||||
</dict>
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>ino</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeMIMETypes</key>
|
||||||
|
<array>
|
||||||
|
<string>text/plain</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>Arduino Source File</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
<key>NSDocumentClass</key>
|
||||||
|
<string>AVRsack.ASProjDoc</string>
|
||||||
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>$(EXECUTABLE_NAME)</string>
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user