mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-11-27 12:15:19 +01:00
c8969630f3
Introduced a real Property List Editor. Fixed Theme manager engine. Other minor fixes
149 lines
5.4 KiB
Swift
149 lines
5.4 KiB
Swift
/*
|
|
* vector sigma (https://github.com/vectorsigma72)
|
|
* Copyright 2020 vector sigma All Rights Reserved.
|
|
*
|
|
* The source code contained or described herein and all documents related
|
|
* to the source code ("Material") are owned by vector sigma.
|
|
* Title to the Material remains with vector sigma or its suppliers and licensors.
|
|
* The Material is proprietary of vector sigma and is protected by worldwide copyright.
|
|
* No part of the Material may be used, copied, reproduced, modified, published,
|
|
* uploaded, posted, transmitted, distributed, or disclosed in any way without
|
|
* vector sigma's prior express written permission.
|
|
*
|
|
* No license under any patent, copyright, trade secret or other intellectual
|
|
* property right is granted to or conferred upon you by disclosure or delivery
|
|
* of the Materials, either expressly, by implication, inducement, estoppel or
|
|
* otherwise. Any license under such intellectual property rights must be
|
|
* express and approved by vector sigma in writing.
|
|
*
|
|
* Unless otherwise agreed by vector sigma in writing, you may not remove or alter
|
|
* this notice or any other notice embedded in Materials by vector sigma in any way.
|
|
*
|
|
* The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader)
|
|
* and all the users as long as the Material is used only within the
|
|
* source code and for the exclusive use of CloverBootloader, which must
|
|
* be free from any type of payment or commercial service for the license to be valid.
|
|
*/
|
|
|
|
import Cocoa
|
|
|
|
@available(OSX 10.11, *)
|
|
final class Document: NSDocument {
|
|
var data : Data?
|
|
var windowController : PlistEditorWC?
|
|
var contentViewController: PlistEditorVC!
|
|
|
|
override init() {
|
|
super.init()
|
|
self.undoManager?.disableUndoRegistration()
|
|
}
|
|
|
|
override class var autosavesInPlace: Bool {
|
|
return UDs.bool(forKey: kAutoSavePlistsKey)
|
|
}
|
|
|
|
override func canAsynchronouslyWrite(to url: URL,
|
|
ofType typeName: String,
|
|
for saveOperation: NSDocument.SaveOperationType) -> Bool {
|
|
return true
|
|
}
|
|
|
|
override class func canConcurrentlyReadDocuments(ofType: String) -> Bool {
|
|
return (ofType == "XML PropertyList v1" ||
|
|
ofType == "Binary PropertyList v1" ||
|
|
ofType == "XML")
|
|
}
|
|
|
|
override func removeWindowController(_ windowController: NSWindowController) {
|
|
super.removeWindowController(windowController)
|
|
let documents = NSDocumentController.shared.documents
|
|
if documents.count == 1 {
|
|
NSApp.setActivationPolicy(.accessory)
|
|
}
|
|
}
|
|
|
|
override func makeWindowControllers() {
|
|
var parser : PlistParser?
|
|
if self.data != nil && self.fileType != nil { // loading a file
|
|
parser = PlistParser(fromData: self.data!, fileType: PEFileType(rawValue: self.fileType!)!)
|
|
if (parser?.root == nil) {
|
|
Swift.print("Document " + ((self.fileURL?.absoluteString) ?? "Untitled".locale) + " was ureadable")
|
|
parser = nil // will beep
|
|
}
|
|
} else if self.data == nil && self.fileType != nil { // loading an empty document
|
|
// Empty document??
|
|
parser = PlistParser(fromPath: "")
|
|
}
|
|
|
|
if parser != nil {
|
|
if parser!.isBinary {
|
|
self.fileType = PEFileType.binaryPlistv1.rawValue
|
|
}
|
|
|
|
self.windowController = PlistEditorWC.loadFromNib(parser: parser!)
|
|
addWindowController(self.windowController!)
|
|
if (self.fileURL != nil) {
|
|
self.windowController?.window?.representedFilename = (self.fileURL?.path)!
|
|
self.windowController?.window?.setFrameAutosaveName(NSWindow.FrameAutosaveName((self.fileURL?.path)!))
|
|
}
|
|
if !NSDocumentController.shared.documents.contains(self) {
|
|
NSDocumentController.shared.addDocument(self)
|
|
}
|
|
|
|
if let vc = self.windowController?.contentViewController as? PlistEditorVC {
|
|
contentViewController = vc
|
|
vc.rootNode = parser?.root
|
|
}
|
|
} else {
|
|
NSSound.beep()
|
|
}
|
|
}
|
|
|
|
override func write(to url: URL, ofType typeName: String) throws {
|
|
if let vc = self.windowController?.contentViewController as? PlistEditorVC {
|
|
switch typeName {
|
|
case PEFileType.xmlPlistv1.rawValue:
|
|
do {
|
|
try vc.save().write(to: url, options: [])
|
|
} catch {
|
|
throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
|
|
}
|
|
break
|
|
case PEFileType.xml.rawValue:
|
|
do {
|
|
try vc.save().write(to: url, options: [])
|
|
|
|
} catch {
|
|
throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
|
|
}
|
|
break
|
|
case PEFileType.binaryPlistv1.rawValue:
|
|
let data = vc.convertToBinaryPlist()
|
|
if (data == nil) {
|
|
throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
|
|
}
|
|
do {
|
|
try data?.write(to: url, options: [])
|
|
} catch {
|
|
throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
|
|
}
|
|
break
|
|
default:
|
|
throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
|
|
}
|
|
}
|
|
}
|
|
|
|
override func read(from data: Data, ofType typeName: String) throws {
|
|
if typeName == PEFileType.xmlPlistv1.rawValue ||
|
|
typeName == PEFileType.binaryPlistv1.rawValue ||
|
|
typeName == PEFileType.xml.rawValue {
|
|
self.data = data
|
|
} else {
|
|
throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
|
|
}
|
|
}
|
|
}
|
|
|
|
|