// // KMBookmark.swift // PDF Reader Pro // // Created by lizhe on 2024/2/5. // import Cocoa enum KMBookmarkType: Int { case bookmark = 0 case folder case session case separator } class KMBookmark: NSObject { var properties: NSDictionary? var bookmarkType: KMBookmarkType = .bookmark var label: String = "" var icon: NSImage = NSImage() var alternateIcon: NSImage = NSImage() var fileURL: URL? var pageIndex: UInt = 0 var pageNumber: NSNumber = 0 var documentSetup: [String: Any] = [:]//文档 var parent: KMBookmark? var children: [KMBookmark] = [] //子 static func bookmark(url: URL, pageIndex: UInt, label: String) -> KMBookmark { let bookmark = KMBookmark() bookmark.fileURL = url bookmark.pageIndex = pageIndex bookmark.label = label return bookmark } func initWithProperties(properties: NSDictionary) -> KMBookmark { return KMBookmark() } static func bookmark(properties: [String: Any]) -> KMBookmark { return KMBookmark() } // - (id)initWithProperties:(NSDictionary *)dictionary { // NSString *type = [dictionary objectForKey:TYPE_KEY]; // if ([type isEqualToString:SEPARATOR_STRING]) { // return (id)[[SKSeparatorBookmark alloc] init]; // } else if ([type isEqualToString:FOLDER_STRING] || [type isEqualToString:SESSION_STRING]) { // Class bookmarkClass = [type isEqualToString:FOLDER_STRING] ? [SKFolderBookmark class] : [SKSessionBookmark class]; // NSMutableArray *newChildren = [NSMutableArray array]; // SKBookmark *child; // for (NSDictionary *dict in [dictionary objectForKey:CHILDREN_KEY]) { // if ((child = [[SKBookmark alloc] initWithProperties:dict])) { // [newChildren addObject:child]; // [child release]; // } else // NSLog(@"Failed to read child bookmark: %@", dict); // } // return (id)[[bookmarkClass alloc] initFolderWithChildren:newChildren label:[dictionary objectForKey:LABEL_KEY]]; // } else if ([dictionary objectForKey:@"windowFrame"]) { // return (id)[[SKFileBookmark alloc] initWithSetup:dictionary label:[dictionary objectForKey:LABEL_KEY]]; // } else { // NSNumber *pageIndex = [dictionary objectForKey:PAGEINDEX_KEY]; // return (id)[[SKFileBookmark alloc] initWithAliasData:[dictionary objectForKey:ALIASDATA_KEY] pageIndex:(pageIndex ? [pageIndex unsignedIntegerValue] : NSNotFound) label:[dictionary objectForKey:LABEL_KEY]]; // } // } func insert(child: KMBookmark, atIndex: UInt) { children.insert(child, at: Int(atIndex)) child.parent = self } func isDescendant(of bookmark: KMBookmark) -> Bool { if self == bookmark { return true } for child in bookmark.children { if self.isDescendant(of: child) { return true } } return false } func isDescendant(ofArray bookmarks: [KMBookmark]) -> Bool { for bm in bookmarks { if self.isDescendant(of: bm) { return true } } return false } func removeObjectFromChildren(index: Int) { children[index].parent = nil children.remove(at: index) } } //MARK: Folder class KMFolderBookmark: KMBookmark { static func folderBookmark(label: String) -> KMFolderBookmark { let bookmark = KMFolderBookmark() bookmark.label = label return bookmark } override var bookmarkType: KMBookmarkType { get { return .folder } set { } } override func initWithProperties(properties: NSDictionary) -> KMBookmark { return KMFolderBookmark() } override var icon: NSImage { get { return NSImage(named: NSImage.folderName)! } set { } } override var alternateIcon: NSImage { get { return NSImage(named: NSImage.multipleDocumentsName)! } set { } } } class KMRootBookmark: KMFolderBookmark { static func bookmarkRoot(childrenProperties: NSArray) -> KMRootBookmark { let bookmark = KMRootBookmark() var childs: [KMBookmark] = [] for setup in childrenProperties { let bookmark = KMBookmark() bookmark.documentSetup = setup as! [String : Any] childs.append(bookmark) } bookmark.children = childs bookmark.label = NSLocalizedString("Bookmarks Menu", comment: "") return bookmark } override var icon: NSImage { get { var iconImage = NSImage() let iconSize = NSSize(width: 16.0, height: 16.0) let drawingHandler: (NSRect) -> Bool = { rect in NSColor(calibratedWhite: 0.0, alpha: 0.2).set() NSBezierPath(rect: NSRect(x: 1.0, y: 1.0, width: 14.0, height: 13.0)).fill() NSGraphicsContext.saveGraphicsState() let path = NSBezierPath() path.move(to: NSPoint(x: 2.0, y: 2.0)) path.line(to: NSPoint(x: 2.0, y: 15.0)) path.line(to: NSPoint(x: 7.0, y: 15.0)) path.line(to: NSPoint(x: 7.0, y: 13.0)) path.line(to: NSPoint(x: 14.0, y: 13.0)) path.line(to: NSPoint(x: 14.0, y: 2.0)) path.close() NSColor.white.set() NSShadow.setShadowWith(NSColor(calibratedWhite: 0.0, alpha: 0.33333), blurRadius: 2.0, yOffset: -1.0) path.fill() NSGraphicsContext.restoreGraphicsState() NSColor(calibratedRed: 0.162, green: 0.304, blue: 0.755, alpha: 1.0).set() NSRect(x: 2.0, y: 13.0, width: 5.0, height: 2.0).fill() NSColor(calibratedRed: 0.894, green: 0.396, blue: 0.202, alpha: 1.0).set() NSRect(x: 3.0, y: 4.0, width: 1.0, height: 1.0).fill() NSRect(x: 3.0, y: 7.0, width: 1.0, height: 1.0).fill() NSRect(x: 3.0, y: 10.0, width: 1.0, height: 1.0).fill() NSColor(calibratedWhite: 0.6, alpha: 1.0).set() NSRect(x: 5.0, y: 4.0, width: 1.0, height: 1.0).fill() NSRect(x: 5.0, y: 7.0, width: 1.0, height: 1.0).fill() NSRect(x: 5.0, y: 10.0, width: 1.0, height: 1.0).fill() for i in 0..<7 { for j in 0..<3 { NSColor(calibratedWhite: 0.45 + 0.1 * CGFloat(Float(arc4random()) / Float(UInt32.max)), alpha: 1.0).set() NSRect(x: 6.0 + CGFloat(i), y: 4.0 + CGFloat(3 * j), width: 1.0, height: 1.0).fill() } } let gradient = NSGradient(starting: NSColor(calibratedWhite: 0.0, alpha: 0.1), ending: NSColor(calibratedWhite: 0.0, alpha: 0.0)) gradient?.draw(in: NSRect(x: 2.0, y: 2.0, width: 12.0, height: 11.0), angle: 90.0) return true } iconImage = NSImage(size: iconSize, flipped: false, drawingHandler: drawingHandler) return iconImage } set { } } } //MARK: Session class KMSessionBookmark: KMBookmark { override var bookmarkType: KMBookmarkType { get { return .session } set { } } static func bookmarkSession(setups: NSArray, label: String) -> KMSessionBookmark { let bookmark = KMSessionBookmark() var childs: [KMBookmark] = [] for setup in setups { let bookmark = KMBookmark() bookmark.documentSetup = setup as! [String : String] childs.append(bookmark) } bookmark.children = childs bookmark.label = label return bookmark } override func initWithProperties(properties: NSDictionary) -> KMBookmark { return KMSessionBookmark() } } //MARK: Separator class KMSeparatorBookmark: KMBookmark { override var bookmarkType: KMBookmarkType { get { return .separator } set { } } override func initWithProperties(properties: NSDictionary) -> KMBookmark { return KMSeparatorBookmark() } }