Browse Source

Merge branch 'develop_PDFReaderProNew' of git.kdan.cc:Mac_PDF/PDF_Office into develop_PDFReaderProNew

# Conflicts:
#	PDF Office/PDF Reader Pro.xcodeproj/xcuserdata/kdanmobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
niehaoyu 1 year ago
parent
commit
503cb6a4b4
20 changed files with 718 additions and 743 deletions
  1. 3 3
      PDF Office/PDF Master/Class/ChromiumTabs/KMBrowserWindowController.swift
  2. 2 0
      PDF Office/PDF Master/Class/Common/DataManager/KMDataManager.swift
  3. 0 7
      PDF Office/PDF Master/Class/Common/Tools/KMTools.swift
  4. 112 78
      PDF Office/PDF Master/Class/Document/KMDocumentController.swift
  5. 3 3
      PDF Office/PDF Master/Class/Document/KMMainDocument.swift
  6. 3 3
      PDF Office/PDF Master/Class/Home/ViewController/KMHomeViewController+Action.swift
  7. 13 10
      PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Annotation/Controller/KMNoteOutlineFilterViewController.swift
  8. 10 330
      PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController+Action.swift
  9. 69 30
      PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController+Note.swift
  10. 2 0
      PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController+Outline.swift
  11. 5 4
      PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController+Search.swift
  12. 326 0
      PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController+Thumbnail.swift
  13. 8 100
      PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController.swift
  14. 49 2
      PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/AnnotationProperty/KMAnnotationPropertiesViewController.m
  15. 35 29
      PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/AnnotationProperty/ViewController/PageDisplay/KMPageDisplayPropertiesViewController.swift
  16. 3 9
      PDF Office/PDF Master/Class/PDFWindowController/Toolbar/KMToolbarViewController.swift
  17. 3 3
      PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift
  18. 0 32
      PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController.swift
  19. 46 90
      PDF Office/PDF Master/Class/Preference/Tools/KMPreferenceManager.swift
  20. 26 10
      PDF Office/PDF Reader Pro.xcodeproj/xcuserdata/kdanmobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

+ 3 - 3
PDF Office/PDF Master/Class/ChromiumTabs/KMBrowserWindowController.swift

@@ -327,12 +327,12 @@ import Cocoa
                 menuItemAction_newTagPageToNewWindow("")
             } else {
                 let window = NSWindow.currentWindow()
-                if !KMTools.defaultManager.isTabbingWin{
-                    KMTools.defaultManager.isTabbingWin = true
+                if !KMDataManager.default.isTabbingWin{
+                    KMDataManager.default.isTabbingWin = true
                     let tabbingWin: KMTabbingHintWindowController = KMTabbingHintWindowController()
                     tabbingWin.selectCallBack = { continueOrNot in
                         window.km_quick_endSheet()
-                        KMTools.defaultManager.isTabbingWin = false
+                        KMDataManager.default.isTabbingWin = false
                         if continueOrNot {
                             self.reopenDocument(forPaths: [])
                         } else {

+ 2 - 0
PDF Office/PDF Master/Class/Common/DataManager/KMDataManager.swift

@@ -12,6 +12,8 @@ import Cocoa
 class KMDataManager: NSObject {
     // 单例
     static let `default` = KMDataManager()
+    
+    var isTabbingWin = false  //多页签提示页是否展示中
 }
 
 // MARK: - UserDefault

+ 0 - 7
PDF Office/PDF Master/Class/Common/Tools/KMTools.swift

@@ -10,13 +10,6 @@ import Cocoa
 @objc class KMTools: NSObject {
     // MARK: - 获取已打开的文件
     
-    static let defaultManager: KMTools = {
-        let manager = KMTools()
-        return manager
-    }()
-    
-    var isTabbingWin = false  //多页签提示页是否展示中
-    
     @objc class func getOpenDocumentURLs() -> [URL] {
         var files:[URL] = []
         for window in NSApp.windows {

+ 112 - 78
PDF Office/PDF Master/Class/Document/KMDocumentController.swift

@@ -158,7 +158,7 @@ extension NSDocumentController {
             return nil
         }
         
-//        guard theURL.isFileURL else {
+//        guard (theURL as AnyObject).isFileURL else {
 //            if showNotes == false {
 //                return SKDownloadController.shared.addDownload(for: theURL)
 //            }
@@ -166,35 +166,37 @@ extension NSDocumentController {
 //        }
         
         var document: Any?
-//        do {
-//            let type = try self.type(forContentsOf: theURL)
-//            if showNotes == false || SKNotesDocument.readableTypes.contains(type) {
-//                document = try self.openDocument(withContentsOf: theURL, display: true)
-//            } else if SKMainDocument.readableTypes.contains(type) {
-//                for doc in self.documents {
-//                    if let sourceURL = (doc as? NSObject)?.value(forKey: "sourceFileURL") as? URL, sourceURL == theURL {
-//                        document = doc
-//                        break
-//                    }
-//                }
-//                if let existingDoc = document as? NSDocument {
-//                    existingDoc.showWindows()
-//                } else {
-//                    var error: NSError?
-//                    var data: Data?
-//                    
-//                    if NSWorkspace.shared.type(type, conformsToType: SKPDFBundleDocumentType) {
-//                        if let skimFileURL = try FileManager.default.bundledFileURL(withExtension: "skim", inPDFBundleAt: theURL) {
-//                            data = try Data(contentsOf: skimFileURL)
-//                        }
-//                    } else {
+        do {
+            let type = try self.typeForContents(of: theURL as! URL)
+//            if showNotes == false || KMNotesDocument.readableTypes.contains(type) {
+//                document = try self.openDocument(withContentsOf: theURL as! URL, display: true)
+//            } else 
+            if KMMainDocument.readableTypes.contains(type) {
+                for doc in self.documents {
+                    if let sourceURL = (doc as? NSObject)?.value(forKey: "sourceFileURL") as? URL, sourceURL == theURL as! URL {
+                        document = doc
+                        break
+                    }
+                }
+                if let existingDoc = document as? NSDocument {
+                    existingDoc.showWindows()
+                } else {
+                    var error: NSError?
+                    var data: Data?
+                    
+                    if NSWorkspace.shared.type(type, conformsToType: KMPDFBundleDocumentType) {
+                        let skimFileURL = try self.bundledFileURLWithExtension("skim", inPDFBundleAtURL: theURL as! URL)
+                        data = try Data(contentsOf: skimFileURL)
+                        
+                    } 
+//                    else {
 //                        data = try SKNExtendedAttributeManager.shared().extendedAttributeNamed(SKIM_NOTES_KEY, atPath: theURL.path, traverseLink: true)
 //                    }
-//                    
-//                    let newDocument = try makeUntitledDocument(ofType: SKNotesDocumentType)
+                    
+//                    let newDocument = try makeUntitledDocument(ofType: KMNotesDocumentType)
 //                    newDocument.sourceFileURL = theURL
-//                    
-//                    if data == nil || newDocument.read(from: data ?? Data(), ofType: SKNotesDocumentType) {
+//
+//                    if data == nil || newDocument.read(from: data ?? Data(), ofType: KMNotesDocumentType) {
 //                        self.addDocument(newDocument)
 //                        newDocument.makeWindowControllers()
 //                        newDocument.showWindows()
@@ -202,64 +204,96 @@ extension NSDocumentController {
 //                        document = nil
 //                        outError?.pointee = error
 //                    }
-//                }
-//            }
-//        } catch {
-//            outError?.pointee = error as NSError
-//        }
+                }
+            }
+        } catch {
+            outError?.pointee = error as NSError
+        }
         
         return document
     }
+    
+    func bundledFileURLWithExtension(_ extension: String, inPDFBundleAtURL theURL: URL) throws -> URL {
+        let bundleContents = try FileManager.default.contentsOfDirectory(at: theURL, includingPropertiesForKeys: nil, options: [])
+        for fileURL in bundleContents {
+            if fileURL.pathExtension == `extension` {
+                return fileURL
+            }
+        }
+        throw NSError(domain: "YourDomain", code: 404, userInfo: [NSLocalizedDescriptionKey: "File with extension not found in PDF bundle"])
+    }
 
     
     func openDocumentWithImageFromPasteboard(_ pboard: NSPasteboard, error outError: NSErrorPointer) -> Any? {
-        var document: Any?
-//        var data: Data?
-//        var type: String?
-//        
-//        if pboard.canReadItem(withDataConformingToTypes: [NSPasteboard.PasteboardType.PDF]) {
-//            pboard.types
-//            data = pboard.data(forType: NSPasteboard.PasteboardType.PDF)
-//            type = SKPDFDocumentType
-//        } else if pboard.canReadItem(withDataConformingToTypes: [SKPasteboardTypePostScript]) {
-//            pboard.types
-//            data = pboard.data(forType: SKPasteboardTypePostScript)
-//            type = isEncapsulatedPostScriptData(data) ? SKEncapsulatedPostScriptDocumentType : SKPostScriptDocumentType
-//        } else if pboard.canReadItem(withDataConformingToTypes: [NSPasteboard.PasteboardType.tiff]) {
-//            pboard.types
-//            data = convertTIFFDataToPDF(pboard.data(forType: NSPasteboard.PasteboardType.tiff))
-//            type = SKPDFDocumentType
-//        } else {
-//            let images = pboard.readObjects(forClasses: [NSImage.self], options: [:]) as? [NSImage]
-//            let strings = pboard.readObjects(forClasses: [NSAttributedString.self], options: [:]) as? [NSAttributedString]
-//            if let images = images, images.count > 0 {
-//                data = convertTIFFDataToPDF(images[0].tiffRepresentation)
-//                type = SKPDFDocumentType
-//            } else if let strings = strings, strings.count > 0 {
-//                data = convertStringsToPDF(strings)
-//                type = SKPDFDocumentType
-//            }
-//        }
-//        
-//        if let data = data, let type = type {
-//            var error: NSError?
-//            document = makeUntitledDocument(ofType: type, error: &error)
-//            
-//            if (document as? NSDocument)?.read(from: data, ofType: type, error: &error) ?? false {
-//                addDocument(document as! NSDocument)
-//                (document as! NSDocument).makeWindowControllers()
-//                (document as! NSDocument).showWindows()
-//            } else {
-//                document = nil
-//                if let outError = outError {
-//                    outError.pointee = error
-//                }
-//            }
-//        } else if let outError = outError {
-//            outError.pointee = NSError.readPasteboardError(withLocalizedDescription: NSLocalizedString("Unable to load data from clipboard", comment: "Error description"))
-//        }
-//        
+        var document: NSDocument?
+        var data: Data?
+        var type: String?
+        
+        if pboard.canReadItem(withDataConformingToTypes: [NSPasteboard.PasteboardType.pdf.rawValue]) {
+            pboard.types
+            data = pboard.data(forType: NSPasteboard.PasteboardType.pdf)
+            type = KMPDFDocumentType
+        } else if pboard.canReadItem(withDataConformingToTypes: [KMEncapsulatedPostScriptDocumentType]) {
+            pboard.types
+            data = pboard.data(forType: NSPasteboard.PasteboardType(rawValue: KMEncapsulatedPostScriptDocumentType))
+            type = isEncapsulatedPostScriptData(data!) ? KMEncapsulatedPostScriptDocumentType : KMPostScriptDocumentType
+        } else if pboard.canReadItem(withDataConformingToTypes: [NSPasteboard.PasteboardType.tiff.rawValue]) {
+            pboard.types
+            data = convertTIFFDataToPDF(pboard.data(forType: NSPasteboard.PasteboardType.tiff)!)
+            type = KMPDFDocumentType
+        } else {
+            let images = pboard.readObjects(forClasses: [NSImage.self], options: [:]) as? [NSImage]
+            let strings = pboard.readObjects(forClasses: [NSAttributedString.self], options: [:]) as? [NSAttributedString]
+            if let images = images, images.count > 0 {
+                data = convertTIFFDataToPDF(images[0].tiffRepresentation!)
+                type = KMPDFDocumentType
+            } else if let strings = strings, strings.count > 0 {
+                data = KMOCTool.convertStringsToPDF(withString: strings) // convertStringsToPDF(strings!)
+                type = KMPDFDocumentType
+            }
+        }
+        
+        if let data = data, let type = type {
+            var error: NSError?
+            
+            document = try?makeUntitledDocument(ofType: type)
+            
+            if ((try?document?.read(from: data, ofType:type)) != nil) {
+                addDocument(document!)
+                document?.makeWindowControllers()
+                document?.showWindows()
+            } else {
+                document = nil
+                if let outError = outError {
+                    outError.pointee = error
+                }
+            }
+        } else if let outError = outError {
+            outError.pointee = NSError.readPasteboardError(withLocalizedDescription: NSLocalizedString("Unable to load data from clipboard", comment: "Error description"))
+        }
+        
         return document
     }
+    
+    func isEncapsulatedPostScriptData(_ data: Data) -> Bool {
+        let epsHeaderData = Data(bytes: [69, 80, 83, 70, 45], count: 5)
+        let rg: Range = (14..<20)
+        return (data.count >= 20 && (data.range(of: epsHeaderData, options: .anchored, in: rg) != nil))
+    }
+    
+    func convertTIFFDataToPDF(_ tiffData: Data) -> Data? {
+        guard let imsrc = CGImageSourceCreateWithData(tiffData as CFData, [kCGImageSourceTypeIdentifierHint: kUTTypeTIFF] as CFDictionary), CGImageSourceGetCount(imsrc) > 0, let cgImage = CGImageSourceCreateImageAtIndex(imsrc, 0, nil) else { return nil }
+        let pdfData = NSMutableData(capacity: tiffData.count)
+        let consumer = CGDataConsumer(data: pdfData! as CFMutableData)!
+        
+        var rect = CGRect(x: 0, y: 0, width: CGFloat(cgImage.width), height: CGFloat(cgImage.height))
+        let ctxt = CGContext(consumer: consumer, mediaBox: &rect, nil)
+        ctxt!.beginPDFPage(nil)
+        ctxt!.draw(cgImage, in: rect)
+        ctxt!.endPDFPage()
+        ctxt!.flush()
+        
+        return pdfData as? Data
+    }
 
 }

+ 3 - 3
PDF Office/PDF Master/Class/Document/KMMainDocument.swift

@@ -214,12 +214,12 @@ typealias KMMainDocumentCloudUploadHanddler = (@escaping(Bool, String)->()) -> (
             } else {
                 if currentWindowController?.browser.tabCount() ?? 0 > 1{
                     let window = NSWindow.currentWindow()
-                    if !KMTools.defaultManager.isTabbingWin{
-                        KMTools.defaultManager.isTabbingWin = true
+                    if !KMDataManager.default.isTabbingWin{
+                        KMDataManager.default.isTabbingWin = true
                         let tabbingWin: KMTabbingHintWindowController = KMTabbingHintWindowController()
                         tabbingWin.selectCallBack = { continueOrNot in
                             window.km_quick_endSheet()
-                            KMTools.defaultManager.isTabbingWin = false
+                            KMDataManager.default.isTabbingWin = false
                             if continueOrNot {
                                 self.reopenDocument(forPaths: [])
                             } else {

+ 3 - 3
PDF Office/PDF Master/Class/Home/ViewController/KMHomeViewController+Action.swift

@@ -322,12 +322,12 @@ extension KMHomeViewController {
             menuItemAction_newTagPageToNewWindow("")
         } else {
             let window = NSWindow.currentWindow()
-            if !KMTools.defaultManager.isTabbingWin{
-                KMTools.defaultManager.isTabbingWin = true
+            if !KMDataManager.default.isTabbingWin{
+                KMDataManager.default.isTabbingWin = true
                 let tabbingWin: KMTabbingHintWindowController = KMTabbingHintWindowController()
                 tabbingWin.selectCallBack = { continueOrNot in
                     window.km_quick_endSheet()
-                    KMTools.defaultManager.isTabbingWin = false
+                    KMDataManager.default.isTabbingWin = false
                     if continueOrNot {
                         self.reopenDocument(forPaths: [])
                     } else {

+ 13 - 10
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Annotation/Controller/KMNoteOutlineFilterViewController.swift

@@ -7,6 +7,13 @@
 
 import Cocoa
 
+extension KMNoteOutlineFilterViewController {
+    static let filterSelectTypeKey = "KMNoteOutlineFilterSelectArray_Type"
+    static let filterSelectAuthorKey = "KMNoteOutlineFilterSelectArray_Author"
+    static let filterSelectColorKey = "KMNoteOutlineFilterSelectArray_Color"
+}
+
+typealias NoteFilterVC = KMNoteOutlineFilterViewController
 class KMNoteOutlineFilterViewController: NSViewController {
     
     @IBOutlet weak var cancelWidthConst: NSLayoutConstraint!
@@ -133,10 +140,6 @@ class KMNoteOutlineFilterViewController: NSViewController {
     var applyFilterCallback: ((_ authorArr: NSArray, _ colorArr: NSArray, _ typeArr: NSArray, _ isEmpty: Bool)->Void)?
     var cancelCallback: ((_ isCancel: Bool)->Void)?
     
-    private let KMNoteOutlineFilterSelectArray_Type = "KMNoteOutlineFilterSelectArray_Type"
-    private let KMNoteOutlineFilterSelectArray_Author = "KMNoteOutlineFilterSelectArray_Author"
-    private let KMNoteOutlineFilterSelectArray_Color = "KMNoteOutlineFilterSelectArray_Color"
-    
     deinit {
         KMPrint("KMNoteOutlineFilterViewController deinit.")
         
@@ -172,7 +175,7 @@ class KMNoteOutlineFilterViewController: NSViewController {
         self.OKButton.layer?.cornerRadius = 1.0
         
         let sud = UserDefaults.standard
-        if let typeData = sud.object(forKey: "KMNoteOutlineFilterSelectArray_Type" + (self.listView?.document?.documentURL.path ?? "")) as? NSData {
+        if let typeData = sud.object(forKey: Self.filterSelectTypeKey + (self.listView?.document?.documentURL.path ?? "")) as? NSData {
             if let typeArr = NSKeyedUnarchiver.unarchiveObject(with: typeData as Data) as? NSArray {
                 self.selectTypeArray = NSMutableArray(array: typeArr)
             }
@@ -181,7 +184,7 @@ class KMNoteOutlineFilterViewController: NSViewController {
             self.selectTypeArray = NSMutableArray()
         }
         
-        if let colorData = sud.object(forKey: "KMNoteOutlineFilterSelectArray_Color" + (self.listView?.document?.documentURL.path ?? "")) as? NSData {
+        if let colorData = sud.object(forKey: Self.filterSelectColorKey + (self.listView?.document?.documentURL.path ?? "")) as? NSData {
             if let colorArr = NSKeyedUnarchiver.unarchiveObject(with: colorData as Data) as? NSArray {
                 self.selectColorArray = NSMutableArray(array: colorArr)
             }
@@ -190,7 +193,7 @@ class KMNoteOutlineFilterViewController: NSViewController {
             self.selectColorArray = NSMutableArray()
         }
         
-        if let authorData = sud.object(forKey: "KMNoteOutlineFilterSelectArray_Author" + (self.listView?.document?.documentURL.path ?? "")) as? NSData {
+        if let authorData = sud.object(forKey: Self.filterSelectAuthorKey + (self.listView?.document?.documentURL.path ?? "")) as? NSData {
             if let authorArr = NSKeyedUnarchiver.unarchiveObject(with: authorData as Data) as? NSArray {
                 self.selectAuthorArray = NSMutableArray(array: authorArr)
             }
@@ -238,9 +241,9 @@ class KMNoteOutlineFilterViewController: NSViewController {
         let data3 = NSKeyedArchiver.archivedData(withRootObject: NSArray(array: self.selectAuthorArray!))
         
         let sud = UserDefaults.standard
-        sud.set(data1, forKey: KMNoteOutlineFilterSelectArray_Type + (self.listView?.document?.documentURL.path ?? ""))
-        sud.set(data2, forKey: KMNoteOutlineFilterSelectArray_Color + (self.listView?.document?.documentURL.path ?? ""))
-        sud.set(data3, forKey: KMNoteOutlineFilterSelectArray_Author + (self.listView?.document?.documentURL.path ?? ""))
+        sud.set(data1, forKey: Self.filterSelectTypeKey + (self.listView?.document?.documentURL.path ?? ""))
+        sud.set(data2, forKey: Self.filterSelectColorKey + (self.listView?.document?.documentURL.path ?? ""))
+        sud.set(data3, forKey: Self.filterSelectAuthorKey + (self.listView?.document?.documentURL.path ?? ""))
         sud.synchronize()
         
         var isEmpty = false

+ 10 - 330
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController+Action.swift

@@ -116,7 +116,7 @@ extension KMLeftSideViewController {
             let showAnnotationItem = menu.addItem(title: KMLocalizedString("Show Note", nil), action: nil, target: self)
             let subMenu = NSMenu()
             var t = subMenu.addItem(title: KMLocalizedString("Page", nil), action: #selector(noteShowNoteAction), target: self)
-            let pageKey = self.noteTypeDict[Self.noteFilterPageKey] as? Bool ?? false
+            let pageKey = self.noteTypeDict[Self.Key.noteFilterPage] as? Bool ?? false
             if pageKey {
                 t?.state = .off
             } else {
@@ -125,7 +125,7 @@ extension KMLeftSideViewController {
             t?.representedObject = self.noteOutlineView
             t?.tag = 101
             t = subMenu.addItem(title: KMLocalizedString("Time", nil) , action: #selector(noteShowNoteAction), target: self)
-            let timeKey = self.noteTypeDict[Self.noteFilterTimeKey] as? Bool ?? false
+            let timeKey = self.noteTypeDict[Self.Key.noteFilterTime] as? Bool ?? false
             if timeKey {
                 t?.state = .off
             } else {
@@ -134,7 +134,7 @@ extension KMLeftSideViewController {
             t?.representedObject = self.noteOutlineView
             t?.tag = 102
             t = subMenu.addItem(title: KMLocalizedString("Author", nil) , action: #selector(noteShowNoteAction), target: self)
-            let authorKey = self.noteTypeDict[Self.noteFilterAutherKey] as? Bool ?? false
+            let authorKey = self.noteTypeDict[Self.Key.noteFilterAuther] as? Bool ?? false
             if authorKey {
                 t?.state = .off
             } else {
@@ -713,7 +713,7 @@ extension KMLeftSideViewController: NSMenuItemValidation {
         //            return [[self pdfDocument] pageCount] > 1;
         //        } else
         if (action == #selector(toggleCaseInsensitiveSearch)) {
-            let state = UserDefaults.standard.integer(forKey: SKCaseInsensitiveSearchKey)
+            let state = KMDataManager.ud_integer(forKey: SKCaseInsensitiveSearchKey)
             menuItem.state = state == 1 ? .on : .off
             return true
         } else if (action == #selector(toggleWholeWordSearch)) {
@@ -886,9 +886,10 @@ extension KMLeftSideViewController: NSMenuItemValidation {
 //            return YES;
 //        } else if (action == @selector(addForm:)) {
 //            return YES;
-//        } else if (action == @selector(toggleOutlineCaseInsensitiveSearch:)){
-//            [menuItem setState:self.outlineIgnoreCaseFlag?NSControlStateValueOn:NSControlStateValueOff];
-//            return YES;
+        else if action == #selector(toggleOutlineCaseInsensitiveSearch) {
+            menuItem.state = self.outlineIgnoreCaseFlag ? .on : .off
+            return true
+        }
 //        } else if (action == @selector(note_expandAllComments:) ||
 //                   action == @selector(note_foldAllComments:) ||
 //                   action == @selector(exportAnnotationNotes:) ||
@@ -1086,334 +1087,13 @@ extension KMLeftSideViewController: NSTextFieldDelegate {
 
 // MARK: - Menu Item Actions
 
-extension KMLeftSideViewController {
-    @objc func cutPage(_ sender: AnyObject?) {
-        if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
-            return
-        }
-        self.tableView(self.thumbnailTableView, cutRowsWithIndexes: self.thumbnailTableView.selectedRowIndexes)
-    }
-    
-    @objc func copyPage(_ sender: AnyObject?) {
-        self.tableView(self.thumbnailTableView, copyRowsWithIndexes: self.thumbnailTableView.selectedRowIndexes)
-    }
-    
-    @objc func pastePage(_ sender: AnyObject?) {
-        self.tableView(self.thumbnailTableView, pasteFromPasteboard: nil)
-    }
-    
-    @objc func deletePage(_ sender: AnyObject?) {
-        if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
-            return
-        }
-        self.tableView(self.thumbnailTableView, deleteRowsWithIndexes: self.thumbnailTableView.selectedRowIndexes)
-    }
-    
-    @objc func rotatePageMenuAction(_ sender: AnyObject?) {
-        if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
-            return
-        }
-        self.tableView(self.thumbnailTableView, rotateRowsWithIndexes: self.thumbnailTableView.selectedRowIndexes as NSIndexSet)
-    }
-    
-    @objc func quickInsert(_ sender: AnyObject?) {
-        if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
-            return
-        }
-
-        let idx = self.thumbnailTableView.selectedRowIndexes.first ?? NSNotFound
-        if idx == NSNotFound || idx >= self.listView.document.pageCount {
-            return
-        }
-        
-        let result = self.listView.insertPage(KMNormalBlankSize, at: idx+1)
-        if result == false {
-            return
-        }
-        
-        var selectedIndexSet = IndexSet()
-        selectedIndexSet.insert(idx+1)
-        self.insertPages(selectedIndexSet, pageAt: idx)
-    }
-    
-    @objc func insert(_ sender: AnyObject?) {
-        if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
-            return
-        }
-        
-        guard let document = self.listView.document else {
-            return
-        }
-
-        let idx = self.thumbnailTableView.selectedRowIndexes.first ?? NSNotFound
-        if idx == NSNotFound || idx >= document.pageCount {
-            return
-        }
-        
-        if document.allowsCopying == false || document.allowsPrinting == false {
-            Task {
-                _ = await KMAlertTool.runModel(message: KMLocalizedString("This is a secured document. Editing is not permitted.", nil))
-            }
-            return
-        }
-
-        let insertVC = KMPDFEditInsertBlankPageWindow(document: document)
-        insertVC.insertLocation = 3
-        insertVC.currentPage = idx + 1
-        insertVC.callback = { [weak self] pdfDoc, _, pages, insertI in
-            if let _pages = pages {
-                // mm 单位的大小
-                guard let _winC = self?.kmCurrentWindowC as? KMPDFEditInsertBlankPageWindow else {
-                    self?.km_endSheet()
-                    return
-                }
-                var pageSize = _winC.pageSize
-                let direction = _winC.pageRotation == 0 ? 0 : 1
-
-                if (direction == 0) { // 纵向
-                    if (pageSize.width > pageSize.height) { // 需要交换
-                        let tmp = pageSize.width
-                        pageSize.width = pageSize.height
-                        pageSize.height = tmp
-                    } else {
-                        // no things.
-                    }
-                } else { // 横向
-                    if (pageSize.width > pageSize.height) {
-                        // no things.
-                    } else { // 需要交换
-                        let tmp = pageSize.width
-                        pageSize.width = pageSize.height
-                        pageSize.height = tmp
-                    }
-                }
-
-                /// 插入位置
-                let document = CPDFDocument()
-                document?.insertPage(pageSize, at: 0)
-                if let page: CPDFPage = (document?.page(at: 0)) {
-                    self?.insertPage(page, pageAt: insertI)
-                }
-            }
-            self?.km_quick_endSheet()
-        }
-        self.km_beginSheet(windowC: insertVC)
-    }
-    
-    @objc func insertPDF(_ sender: AnyObject?) {
-        if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
-            return
-        }
-                
-        guard let document = self.listView.document else {
-            return
-        }
-
-        let idx = self.thumbnailTableView.selectedRowIndexes.first ?? NSNotFound
-        if idx == NSNotFound || idx >= document.pageCount {
-            return
-        }
-                
-        if document.allowsCopying == false || document.allowsPrinting == false {
-            Task {
-                _ = await KMAlertTool.runModel(message: KMLocalizedString("This is a secured document. Editing is not permitted.", nil))
-            }
-            return
-        }
-        
-        let panel = NSOpenPanel()
-        panel.allowedFileTypes = ["pdf"]
-        panel.beginSheetModal(for: self.view.window!) { response in
-            if response == .cancel {
-                return
-            }
-            
-            for fileURL in panel.urls {
-                let pdfDoc = CPDFDocument(url: fileURL)
-                if let data = pdfDoc?.isLocked, data {
-                    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
-                        KMBaseWindowController.checkPassword(url: fileURL) { [unowned self] success, resultPassword in
-                            self.km_quick_endSheet()
-//                        }
-                            if (resultPassword.isEmpty == false) {
-                                
-                                let insertVC = KMPDFEditInsertPageWindow(document: document, path: fileURL, password: resultPassword)
-                                insertVC.insertLocation = 3
-                                insertVC.currentPage = idx + 1
-                                self.km_beginSheet(windowC: insertVC)
-                                insertVC.callback = { [weak self] pdfDoc, pwd, pages, insertIdx in
-                                    var indexs = IndexSet()
-                                    guard let _winC = self?.kmCurrentWindowC as? KMPDFEditInsertPageWindow, _winC.insertDocument != nil else {
-                                        self?.km_quick_endSheet()
-                                        return
-                                    }
-                                    let doc = _winC.insertDocument!
-                                    let fileAttribute = _winC.fileAttribute
-                                    var insertIndex = insertIdx
-                                    var insertPages: [CPDFPage] = []
-                                    for number in fileAttribute.fetchSelectPages() {
-                                        if let page = doc.page(at: UInt(number-1)) {
-                                            insertPages.append(page)
-                                            indexs.insert(insertIndex)
-                                            insertIndex += 1
-                                        }
-                                    }
-                                    for (i, page) in insertPages.enumerated() {
-                                        self?.listView.document.insertPageObject(page, at: UInt(insertIdx + i))
-                                    }
-                                    self?.insertPages(indexs, pageAt: insertIdx)
-                                    self?.km_quick_endSheet()
-                                }
-                            }
-                        }
-                    }
-                } else {
-                    let insertVC = KMPDFEditInsertPageWindow(document: document, path: fileURL)
-                    insertVC.insertLocation = 3
-                    insertVC.currentPage = idx + 1
-                    self.km_beginSheet(windowC: insertVC)
-                    insertVC.callback = { [weak self] pdfDoc, pwd, pages, insertIdx in
-                        var indexs = IndexSet()
-                        guard let _winC = self?.kmCurrentWindowC as? KMPDFEditInsertPageWindow, _winC.insertDocument != nil else {
-                            self?.km_quick_endSheet()
-                            return
-                        }
-                        let doc = _winC.insertDocument!
-                        let fileAttribute = _winC.fileAttribute
-                        var insertIndex = insertIdx
-                        var insertPages: [CPDFPage] = []
-                        for number in fileAttribute.fetchSelectPages() {
-                            if let page = doc.page(at: UInt(number-1)) {
-                                insertPages.append(page)
-                                indexs.insert(insertIndex)
-                                insertIndex += 1
-                            }
-                        }
-                        for (i, page) in insertPages.enumerated() {
-                            self?.listView.document.insertPageObject(page, at: UInt(insertIdx + i))
-                        }
-                        self?.insertPages(indexs, pageAt: insertIdx)
-                        self?.km_quick_endSheet()
-                    }
-                    
-                }
-            }
-        }
-    }
-    
-    @objc func extractPage(_ sender: AnyObject?) {
-        if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
-            return
-        }
-        self.tableView(self.thumbnailTableView, extractRowsWithIndexes: self.thumbnailTableView.selectedRowIndexes)
-    }
-    
-    @objc func pageEdit(_ sender: AnyObject?) {
-        self.delegate?.controller?(controller: self, itemClick: nil, itemKey: .pageEdit, params: nil)
-    }
-    
-    @objc func displayPageSize(_ sender: AnyObject?) {
-        if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
-            return
-        }
-        
-        self.isDisplayPageSize = !self.isDisplayPageSize;
-        UserDefaults.standard.setValue(self.isDisplayPageSize, forKey: "kKMThumbnailDisplayPageSizeKey")
-        UserDefaults.standard.synchronize()
-        
-        Task { @MainActor in
-            self.thumbnailTableView.reloadData()
-        }
-    }
-    
-    @objc func sharePage(_ sender: AnyObject?) {
-        if IAPProductsManager.default().isAvailableAllFunction() == false {
-            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
-            return
-        }
-        
-        guard let document = self.listView.document else {
-            return
-        }
-        var pages = NSMutableArray()
-        for idx in self.thumbnailTableView.selectedRowIndexes {
-            if (idx < document.pageCount) {
-                if let page = self.listView.document.page(at: UInt(idx)) {
-                    pages.add(page)
-                }
-            }
-        }
-        let pdf = CPDFDocument()
-        for page in pages {
-//            PDFPage *copyPage = [[page copy] autorelease];
-            if let _page = page as? CPDFPage {
-                pdf?.insertPageObject(_page, at: pdf?.pageCount ?? 0)
-            }
-        }
-        var fileName = ""
-//        NSString * = [self.pdfDocument.documentURL.lastPathComponent stringByDeletingPathExtension];
-        var documentFileName = document.documentURL?.deletingPathExtension().lastPathComponent ?? ""
-
-        var tName = self.fileNameWithSelectedPages(self.thumbnailTableView.selectedRowIndexes)
-        if (tName.count > 50) {
-            tName = tName.substring(to: 50)
-        }
-
-        if (pages.count > 1) {
-            fileName = String(format: "%@ pages %@", documentFileName, tName)
-        } else {
-            fileName = String(format: "%@ page %@", documentFileName, tName)
-        }
-
-        let paths = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)
-        var cachesDir = paths.first ?? ""
-        cachesDir = "\(cachesDir)/\(fileName).pdf"
-        var array = NSMutableArray()
-        let url = URL(fileURLWithPath: cachesDir)
-        array.add(url)
-        let vc = KMProgressWindowController()
-//    //    [NSApp beginSheet:[vc window]
-//    //       modalForWindow:self.window
-//    //        modalDelegate:nil
-//    //       didEndSelector:nil
-//    //          contextInfo:NULL];
-        self.view.window?.beginSheet(vc.window!, completionHandler: { [unowned self] returnCode in
-            NSApp.endSheet(self.view.window!, returnCode: returnCode.rawValue)
-        })
-
-        DispatchQueue.global().async {
-            let sucess = pdf?.write(toFile: cachesDir) ?? false
-            if (sucess) {
-                DispatchQueue.main.async {
-//                    [[sender representedObject] performWithItems:array];
-                    let represent : NSSharingService = (sender as! NSMenuItem).representedObject as! NSSharingService
-                    represent.perform(withItems: [url])
-                    
-                    NSApp.endSheet(vc.window!)
-                    vc.close()
-                }
-            } else {
-                NSApp.endSheet(vc.window!)
-                vc.close()
-            }
-        }
-//        [vc release];
-    }
-    
+extension KMLeftSideViewController { 
     @objc func toggleCaseInsensitiveNoteSearch(_ sender: AnyObject?) {
         self.caseInsensitiveNoteSearch = !self.caseInsensitiveNoteSearch
         if self.searchField.stringValue.isEmpty ==  false {
             self.searchNotes(self.searchField)
         }
-        UserDefaults.standard.sync_setValue(self.caseInsensitiveNoteSearch, forKey: SKCaseInsensitiveNoteSearchKey)
+        KMDataManager.ud_set(self.caseInsensitiveNoteSearch, forKey: SKCaseInsensitiveNoteSearchKey)
     }
     
     @objc func searchNotes(_ sender: AnyObject?) {

+ 69 - 30
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController+Note.swift

@@ -7,14 +7,19 @@
 
 import Foundation
 
-// Menu
+extension KMLeftSideViewController.Key {
+    static let noteAscendSortKey = "KMLeftSideViewAscendSortBoolKey"
+    static let noteSortTypeKey = "KMLeftSideViewNoteSortTypeKey"
+    
+    static let noteTableColumn = "KMNoteOutlineViewTableColumnKey"
+    static let noteFilterPage = "kKMNoteFilterAnnotationPageKey"
+    static let noteFilterTime = "kKMNoteFilterAnnotationTimeKey"
+    static let noteFilterAuther = "kKMNoteFilterAnnotationAutherKey"
+}
+
+// MARK: - Menu
 
 extension KMLeftSideViewController {
-    static let noteFilterDataKey        = "NoteFilterDataKey"
-    static let noteFilterPageKey        = "NoteFilterPageKey"
-    static let noteFilterTimeKey        = "NoteFilterTimeKey"
-    static let noteFilterAutherKey      = "NoteFilterAutherKey"
-    
     func note_initSubViews() {
         self.noteSearchField.backgroundColor = KMAppearance.Layout.l_1Color()
         self.noteSearchField.wantsLayer = true
@@ -89,15 +94,16 @@ extension KMLeftSideViewController {
         self.noteView.layer?.backgroundColor = KMAppearance.Layout.l0Color().cgColor
         
         let sud = UserDefaults.standard
-        if let dict = sud.dictionary(forKey: Self.noteFilterDataKey) {
+        if let dict = sud.dictionary(forKey: Self.Key.noteTableColumn) {
             self.noteTypeDict = dict
         } else {
-            self.noteTypeDict = [Self.noteFilterPageKey : false,
-                                 Self.noteFilterTimeKey : false,
-                                 Self.noteFilterAutherKey : false]
-            sud.sync_setValue(self.noteTypeDict, forKey: Self.noteFilterDataKey)
+            self.noteTypeDict = [Self.Key.noteFilterPage : false,
+                                 Self.Key.noteFilterTime : false,
+                                 Self.Key.noteFilterAuther : false]
+            sud.sync_setValue(self.noteTypeDict, forKey: Self.Key.noteTableColumn)
         }
         self.caseInsensitiveNoteSearch = sud.bool(forKey: SKCaseInsensitiveNoteSearchKey)
+        self.isAscendSort = KMDataManager.ud_bool(forKey: Self.Key.noteAscendSortKey)
         
         self.noteTitleLabel.stringValue = KMLocalizedString("Notes", nil);
         self.noteTitleLabel.textColor = KMAppearance.Layout.h0Color()
@@ -135,7 +141,7 @@ extension KMLeftSideViewController {
         self.noteHeaderView.wantsLayer = true
         self.noteHeaderView.layer?.backgroundColor = KMAppearance.Else.textTagColor().cgColor
         self.noteHeaderView.layer?.cornerRadius = 1.0
-        let sortType = sud.integer(forKey: Self.noteSortTypeKey)
+        let sortType = KMDataManager.ud_integer(forKey: Self.Key.noteSortTypeKey)
         if (sortType == 1) {
             self.noteSortType = KMNoteSortType(rawValue: sortType)!
             if (self.noteSortType == .time) {
@@ -183,16 +189,16 @@ extension KMLeftSideViewController {
         let tag = item?.tag ?? 0
         if (tag == 100) {
         } else if (tag == 101) {
-            let isPage = self.noteTypeDict[Self.noteFilterPageKey] as? Bool ?? false
-            self.noteTypeDict[Self.noteFilterPageKey] = !isPage
+            let isPage = self.noteTypeDict[Self.Key.noteFilterPage] as? Bool ?? false
+            self.noteTypeDict[Self.Key.noteFilterPage] = !isPage
         } else if (tag == 102) {
-            let isTime = self.noteTypeDict[Self.noteFilterTimeKey] as? Bool ?? false
-            self.noteTypeDict[Self.noteFilterTimeKey] = !isTime
+            let isTime = self.noteTypeDict[Self.Key.noteFilterTime] as? Bool ?? false
+            self.noteTypeDict[Self.Key.noteFilterTime] = !isTime
         } else if (tag == 103) {
-            let isAuther = self.noteTypeDict[Self.noteFilterAutherKey] as? Bool ?? false
-            self.noteTypeDict[Self.noteFilterAutherKey] = !isAuther
+            let isAuther = self.noteTypeDict[Self.Key.noteFilterAuther] as? Bool ?? false
+            self.noteTypeDict[Self.Key.noteFilterAuther] = !isAuther
         }
-        UserDefaults.standard.sync_setValue(self.noteTypeDict, forKey: Self.noteFilterDataKey)
+        UserDefaults.standard.sync_setValue(self.noteTypeDict, forKey: Self.Key.noteTableColumn)
             
         let selectRow = self.noteOutlineView.selectedRow
         self.noteOutlineView.reloadData()
@@ -327,8 +333,7 @@ extension KMLeftSideViewController {
             self.noteSortButton.image = NSImage(named: KMImageNameBtnSidebarRankReverse)
             self.noteSortButton.toolTip = KMLocalizedString("ascending sort", nil)
         }
-        UserDefaults.standard.setValue(self.isAscendSort, forKey: Self.ascendSorKey)
-        UserDefaults.standard.synchronize()
+        KMDataManager.ud_set(self.isAscendSort, forKey: Self.Key.noteAscendSortKey)
         
         self.annotationSort(sortArray: [])
     }
@@ -392,6 +397,29 @@ extension KMLeftSideViewController {
             return section?.annotations?.first?.annotation
         }
     }
+    
+    @IBAction @objc  func sortTypeAction(_ sender: NSMenuItem) {
+        let item = sender
+        let tag = item.tag
+        
+        if (item.state == .on) {
+            item.state = .off
+        } else {
+            item.state = .on
+        }
+        if (tag == 0) {
+            self.noteSortType = .page
+            self.sortTypeLabel.stringValue = KMLocalizedString("Page", nil)
+            self.sortTypeBox.toolTip = KMLocalizedString("Page", nil)
+        } else if (tag == 1) {
+            self.noteSortType = .time
+            self.sortTypeLabel.stringValue = KMLocalizedString("Time", nil)
+            self.sortTypeBox.toolTip = KMLocalizedString("Time", nil)
+        }
+        KMDataManager.ud_set(self.noteSortType.rawValue, forKey: Self.Key.noteSortTypeKey)
+        
+        self.annotationSort(sortArray: [])
+    }
 }
 
 // MARK: - Note
@@ -464,19 +492,20 @@ extension KMLeftSideViewController {
         
         let sud = UserDefaults.standard
         var typeArr = NSMutableArray()
-        if let typeData = sud.object(forKey: "KMNoteOutlineFilterSelectArray_Type") as? Data {
+        
+        if let typeData = KMDataManager.ud_object(forKey: NoteFilterVC.filterSelectTypeKey) as? Data {
             if let data = NSKeyedUnarchiver.unarchiveObject(with: typeData) as? NSArray {
                 typeArr = NSMutableArray(array: data)
             }
         }
         var colorArr = NSMutableArray()
-        if let colorData = sud.object(forKey: "KMNoteOutlineFilterSelectArray_Color") as? Data {
+        if let colorData = sud.object(forKey: NoteFilterVC.filterSelectColorKey) as? Data {
             if let data = NSKeyedUnarchiver.unarchiveObject(with: colorData) as? NSArray {
                 colorArr = NSMutableArray(array: data)
             }
         }
         var authorArr = NSMutableArray()
-        if let authorData = sud.object(forKey: "KMNoteOutlineFilterSelectArray_Author") as? Data {
+        if let authorData = sud.object(forKey: NoteFilterVC.filterSelectAuthorKey) as? Data {
             if let data = NSKeyedUnarchiver.unarchiveObject(with: authorData) as? NSArray {
                 authorArr = NSMutableArray(array: data)
             }
@@ -640,20 +669,17 @@ extension KMLeftSideViewController {
             var authorArr: [Any] = []
             
             let sud = UserDefaults.standard
-            let typeData = sud.object(forKey: "KMNoteOutlineFilterSelectArray_Type" + self.listView.document.documentURL.path) as? Data
-//            let typeData = sud.object(forKey: "KMNoteOutlineFilterSelectArray_Type") as? Data
+            let typeData = KMDataManager.ud_object(forKey: NoteFilterVC.filterSelectTypeKey + self.listView.document.documentURL.path) as? Data
             if typeData != nil {
                 typeArr = NSKeyedUnarchiver.unarchiveObject(with: typeData!) as! [Any]
             }
             
-            let colorData = sud.object(forKey: "KMNoteOutlineFilterSelectArray_Color" + self.listView.document.documentURL.path) as? Data
-//            let colorData = sud.object(forKey: "KMNoteOutlineFilterSelectArray_Color") as? Data
+            let colorData = sud.object(forKey: NoteFilterVC.filterSelectColorKey + self.listView.document.documentURL.path) as? Data
             if colorData != nil {
                 colorArr = NSKeyedUnarchiver.unarchiveObject(with: colorData!) as! [Any]
             }
             
-            let authorData = sud.object(forKey: "KMNoteOutlineFilterSelectArray_Author" + self.listView.document.documentURL.path) as? Data
-//            let authorData = sud.object(forKey: "KMNoteOutlineFilterSelectArray_Author") as? Data
+            let authorData = sud.object(forKey: NoteFilterVC.filterSelectAuthorKey + self.listView.document.documentURL.path) as? Data
             if authorData != nil {
                 authorArr = NSKeyedUnarchiver.unarchiveObject(with: authorData!) as! [Any]
             }
@@ -1009,4 +1035,17 @@ extension KMLeftSideViewController {
         }
         return selectedNotes
     }
+    
+    func clearAnnotationFilterData() {
+        if let _key = self.listView?.document?.documentURL?.path {
+            let userDefaults = UserDefaults.standard
+            let typeData = try?NSKeyedArchiver.archivedData(withRootObject: [Any](), requiringSecureCoding: false)
+            userDefaults.set(typeData, forKey: NoteFilterVC.filterSelectTypeKey + _key)
+            let colorData = try?NSKeyedArchiver.archivedData(withRootObject: [Any](), requiringSecureCoding: false)
+            userDefaults.set(colorData, forKey: NoteFilterVC.filterSelectColorKey + _key)
+            let authorData = try?NSKeyedArchiver.archivedData(withRootObject: [Any](), requiringSecureCoding: false)
+            userDefaults.set(authorData, forKey: NoteFilterVC.filterSelectAuthorKey + _key)
+            userDefaults.synchronize()
+        }
+    }
 }

+ 2 - 0
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController+Outline.swift

@@ -84,6 +84,8 @@ extension KMLeftSideViewController {
         self.tocOutlineView.autoresizesOutlineColumn = false
         self.tocOutlineView.allowsMultipleSelection = true
         self.tocOutlineView.allowsEmptySelection = true
+        self.tocOutlineView.focusRingType = .none
+        self.tocOutlineView.autoresizesSubviews = true
     }
     
     func updateOutlineSelection() {

+ 5 - 4
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController+Search.swift

@@ -63,6 +63,9 @@ extension KMLeftSideViewController {
     }
     
     func search_initDefalutValue() {
+        self.mwcFlags.wholeWordSearch = KMDataManager.ud_integer(forKey: SKWholeWordSearchKey)
+        self.mwcFlags.caseInsensitiveSearch = KMDataManager.ud_integer(forKey: SKCaseInsensitiveSearchKey)
+        
         self.findTableView.backgroundColor = KMAppearance.Layout.l0Color()
         self.groupedFindTableView.backgroundColor = KMAppearance.Layout.l0Color()
         
@@ -100,8 +103,7 @@ extension KMLeftSideViewController {
         if self.searchField.stringValue.isEmpty == false {
             self.search(self.searchField)
         }
-        UserDefaults.standard.setValue(self.mwcFlags.wholeWordSearch, forKey: SKWholeWordSearchKey)
-        UserDefaults.standard.synchronize()
+        KMDataManager.ud_set(self.mwcFlags.wholeWordSearch, forKey: SKWholeWordSearchKey)
     }
     
     @objc func toggleCaseInsensitiveSearch(_ sender: AnyObject?) {
@@ -114,7 +116,6 @@ extension KMLeftSideViewController {
         if self.searchField.stringValue.isEmpty == false {
             self.search(self.searchField)
         }
-        UserDefaults.standard.setValue(self.mwcFlags.caseInsensitiveSearch, forKey: SKCaseInsensitiveSearchKey)
-        UserDefaults.standard.synchronize()
+        KMDataManager.ud_set(self.mwcFlags.caseInsensitiveSearch, forKey: SKCaseInsensitiveSearchKey)
     }
 }

+ 326 - 0
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController+Thumbnail.swift

@@ -9,6 +9,7 @@ import Foundation
 
 extension KMLeftSideViewController.Key {
     static let thumbSizeScaling = "KMThumbnailSizeScalingKey"
+    static let thumbDisplayPageSizeKey = "kKMThumbnailDisplayPageSizeKey"
 }
 
 // MARK: - Actions
@@ -134,6 +135,8 @@ extension KMLeftSideViewController {
     }
     
     func thumb_initDefalutValue() {
+        self.isDisplayPageSize = KMDataManager.ud_bool(forKey: Self.Key.thumbDisplayPageSizeKey)
+        
         self.thumbnailView.wantsLayer = true
         self.thumbnailView.layer?.backgroundColor = KMAppearance.Layout.l0Color().cgColor
         
@@ -293,3 +296,326 @@ extension KMLeftSideViewController {
     }
 }
 
+// MARK: - Menu Actions
+
+extension KMLeftSideViewController {
+    @objc func cutPage(_ sender: AnyObject?) {
+        if IAPProductsManager.default().isAvailableAllFunction() == false {
+            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            return
+        }
+        self.tableView(self.thumbnailTableView, cutRowsWithIndexes: self.thumbnailTableView.selectedRowIndexes)
+    }
+    
+    @objc func copyPage(_ sender: AnyObject?) {
+        self.tableView(self.thumbnailTableView, copyRowsWithIndexes: self.thumbnailTableView.selectedRowIndexes)
+    }
+    
+    @objc func pastePage(_ sender: AnyObject?) {
+        self.tableView(self.thumbnailTableView, pasteFromPasteboard: nil)
+    }
+    
+    @objc func deletePage(_ sender: AnyObject?) {
+        if IAPProductsManager.default().isAvailableAllFunction() == false {
+            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            return
+        }
+        self.tableView(self.thumbnailTableView, deleteRowsWithIndexes: self.thumbnailTableView.selectedRowIndexes)
+    }
+    
+    @objc func rotatePageMenuAction(_ sender: AnyObject?) {
+        if IAPProductsManager.default().isAvailableAllFunction() == false {
+            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            return
+        }
+        self.tableView(self.thumbnailTableView, rotateRowsWithIndexes: self.thumbnailTableView.selectedRowIndexes as NSIndexSet)
+    }
+    
+    @objc func quickInsert(_ sender: AnyObject?) {
+        if IAPProductsManager.default().isAvailableAllFunction() == false {
+            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            return
+        }
+
+        let idx = self.thumbnailTableView.selectedRowIndexes.first ?? NSNotFound
+        if idx == NSNotFound || idx >= self.listView.document.pageCount {
+            return
+        }
+        
+        let result = self.listView.insertPage(KMNormalBlankSize, at: idx+1)
+        if result == false {
+            return
+        }
+        
+        var selectedIndexSet = IndexSet()
+        selectedIndexSet.insert(idx+1)
+        self.insertPages(selectedIndexSet, pageAt: idx)
+    }
+    
+    @objc func insert(_ sender: AnyObject?) {
+        if IAPProductsManager.default().isAvailableAllFunction() == false {
+            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            return
+        }
+        
+        guard let document = self.listView.document else {
+            return
+        }
+
+        let idx = self.thumbnailTableView.selectedRowIndexes.first ?? NSNotFound
+        if idx == NSNotFound || idx >= document.pageCount {
+            return
+        }
+        
+        if document.allowsCopying == false || document.allowsPrinting == false {
+            Task {
+                _ = await KMAlertTool.runModel(message: KMLocalizedString("This is a secured document. Editing is not permitted.", nil))
+            }
+            return
+        }
+
+        let insertVC = KMPDFEditInsertBlankPageWindow(document: document)
+        insertVC.insertLocation = 3
+        insertVC.currentPage = idx + 1
+        insertVC.callback = { [weak self] pdfDoc, _, pages, insertI in
+            if let _pages = pages {
+                // mm 单位的大小
+                guard let _winC = self?.kmCurrentWindowC as? KMPDFEditInsertBlankPageWindow else {
+                    self?.km_endSheet()
+                    return
+                }
+                var pageSize = _winC.pageSize
+                let direction = _winC.pageRotation == 0 ? 0 : 1
+
+                if (direction == 0) { // 纵向
+                    if (pageSize.width > pageSize.height) { // 需要交换
+                        let tmp = pageSize.width
+                        pageSize.width = pageSize.height
+                        pageSize.height = tmp
+                    } else {
+                        // no things.
+                    }
+                } else { // 横向
+                    if (pageSize.width > pageSize.height) {
+                        // no things.
+                    } else { // 需要交换
+                        let tmp = pageSize.width
+                        pageSize.width = pageSize.height
+                        pageSize.height = tmp
+                    }
+                }
+
+                /// 插入位置
+                let document = CPDFDocument()
+                document?.insertPage(pageSize, at: 0)
+                if let page: CPDFPage = (document?.page(at: 0)) {
+                    self?.insertPage(page, pageAt: insertI)
+                }
+            }
+            self?.km_quick_endSheet()
+        }
+        self.km_beginSheet(windowC: insertVC)
+    }
+    
+    @objc func insertPDF(_ sender: AnyObject?) {
+        if IAPProductsManager.default().isAvailableAllFunction() == false {
+            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            return
+        }
+                
+        guard let document = self.listView.document else {
+            return
+        }
+
+        let idx = self.thumbnailTableView.selectedRowIndexes.first ?? NSNotFound
+        if idx == NSNotFound || idx >= document.pageCount {
+            return
+        }
+                
+        if document.allowsCopying == false || document.allowsPrinting == false {
+            Task {
+                _ = await KMAlertTool.runModel(message: KMLocalizedString("This is a secured document. Editing is not permitted.", nil))
+            }
+            return
+        }
+        
+        let panel = NSOpenPanel()
+        panel.allowedFileTypes = ["pdf"]
+        panel.beginSheetModal(for: self.view.window!) { response in
+            if response == .cancel {
+                return
+            }
+            
+            for fileURL in panel.urls {
+                let pdfDoc = CPDFDocument(url: fileURL)
+                if let data = pdfDoc?.isLocked, data {
+                    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
+                        KMBaseWindowController.checkPassword(url: fileURL) { [unowned self] success, resultPassword in
+                            self.km_quick_endSheet()
+                            if (resultPassword.isEmpty == false) {
+                                
+                                let insertVC = KMPDFEditInsertPageWindow(document: document, path: fileURL, password: resultPassword)
+                                insertVC.insertLocation = 3
+                                insertVC.currentPage = idx + 1
+                                self.km_beginSheet(windowC: insertVC)
+                                insertVC.callback = { [weak self] pdfDoc, pwd, pages, insertIdx in
+                                    var indexs = IndexSet()
+                                    guard let _winC = self?.kmCurrentWindowC as? KMPDFEditInsertPageWindow, _winC.insertDocument != nil else {
+                                        self?.km_quick_endSheet()
+                                        return
+                                    }
+                                    let doc = _winC.insertDocument!
+                                    let fileAttribute = _winC.fileAttribute
+                                    var insertIndex = insertIdx
+                                    var insertPages: [CPDFPage] = []
+                                    for number in fileAttribute.fetchSelectPages() {
+                                        if let page = doc.page(at: UInt(number-1)) {
+                                            insertPages.append(page)
+                                            indexs.insert(insertIndex)
+                                            insertIndex += 1
+                                        }
+                                    }
+                                    for (i, page) in insertPages.enumerated() {
+                                        self?.listView.document.insertPageObject(page, at: UInt(insertIdx + i))
+                                    }
+                                    self?.insertPages(indexs, pageAt: insertIdx)
+                                    self?.km_quick_endSheet()
+                                }
+                            }
+                        }
+                    }
+                } else {
+                    let insertVC = KMPDFEditInsertPageWindow(document: document, path: fileURL)
+                    insertVC.insertLocation = 3
+                    insertVC.currentPage = idx + 1
+                    self.km_beginSheet(windowC: insertVC)
+                    insertVC.callback = { [weak self] pdfDoc, pwd, pages, insertIdx in
+                        var indexs = IndexSet()
+                        guard let _winC = self?.kmCurrentWindowC as? KMPDFEditInsertPageWindow, _winC.insertDocument != nil else {
+                            self?.km_quick_endSheet()
+                            return
+                        }
+                        let doc = _winC.insertDocument!
+                        let fileAttribute = _winC.fileAttribute
+                        var insertIndex = insertIdx
+                        var insertPages: [CPDFPage] = []
+                        for number in fileAttribute.fetchSelectPages() {
+                            if let page = doc.page(at: UInt(number-1)) {
+                                insertPages.append(page)
+                                indexs.insert(insertIndex)
+                                insertIndex += 1
+                            }
+                        }
+                        for (i, page) in insertPages.enumerated() {
+                            self?.listView.document.insertPageObject(page, at: UInt(insertIdx + i))
+                        }
+                        self?.insertPages(indexs, pageAt: insertIdx)
+                        self?.km_quick_endSheet()
+                    }
+                    
+                }
+            }
+        }
+    }
+    
+    @objc func extractPage(_ sender: AnyObject?) {
+        if IAPProductsManager.default().isAvailableAllFunction() == false {
+            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            return
+        }
+        self.tableView(self.thumbnailTableView, extractRowsWithIndexes: self.thumbnailTableView.selectedRowIndexes)
+    }
+    
+    @objc func pageEdit(_ sender: AnyObject?) {
+        self.delegate?.controller?(controller: self, itemClick: nil, itemKey: .pageEdit, params: nil)
+    }
+    
+    @objc func displayPageSize(_ sender: AnyObject?) {
+        if IAPProductsManager.default().isAvailableAllFunction() == false {
+            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            return
+        }
+        
+        self.isDisplayPageSize = !self.isDisplayPageSize
+        KMDataManager.ud_set(self.isDisplayPageSize, forKey: Self.Key.thumbDisplayPageSizeKey)
+        
+        Task { @MainActor in
+            self.thumbnailTableView.reloadData()
+        }
+    }
+    
+    @objc func sharePage(_ sender: AnyObject?) {
+        if IAPProductsManager.default().isAvailableAllFunction() == false {
+            KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+            return
+        }
+        
+        guard let document = self.listView.document else {
+            return
+        }
+        var pages = NSMutableArray()
+        for idx in self.thumbnailTableView.selectedRowIndexes {
+            if (idx < document.pageCount) {
+                if let page = self.listView.document.page(at: UInt(idx)) {
+                    pages.add(page)
+                }
+            }
+        }
+        let pdf = CPDFDocument()
+        for page in pages {
+//            PDFPage *copyPage = [[page copy] autorelease];
+            if let _page = page as? CPDFPage {
+                pdf?.insertPageObject(_page, at: pdf?.pageCount ?? 0)
+            }
+        }
+        var fileName = ""
+//        NSString * = [self.pdfDocument.documentURL.lastPathComponent stringByDeletingPathExtension];
+        var documentFileName = document.documentURL?.deletingPathExtension().lastPathComponent ?? ""
+
+        var tName = self.fileNameWithSelectedPages(self.thumbnailTableView.selectedRowIndexes)
+        if (tName.count > 50) {
+            tName = tName.substring(to: 50)
+        }
+
+        if (pages.count > 1) {
+            fileName = String(format: "%@ pages %@", documentFileName, tName)
+        } else {
+            fileName = String(format: "%@ page %@", documentFileName, tName)
+        }
+
+        let paths = NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)
+        var cachesDir = paths.first ?? ""
+        cachesDir = "\(cachesDir)/\(fileName).pdf"
+        var array = NSMutableArray()
+        let url = URL(fileURLWithPath: cachesDir)
+        array.add(url)
+        let vc = KMProgressWindowController()
+//    //    [NSApp beginSheet:[vc window]
+//    //       modalForWindow:self.window
+//    //        modalDelegate:nil
+//    //       didEndSelector:nil
+//    //          contextInfo:NULL];
+        self.view.window?.beginSheet(vc.window!, completionHandler: { [unowned self] returnCode in
+            NSApp.endSheet(self.view.window!, returnCode: returnCode.rawValue)
+        })
+
+        DispatchQueue.global().async {
+            let sucess = pdf?.write(toFile: cachesDir) ?? false
+            if (sucess) {
+                DispatchQueue.main.async {
+//                    [[sender representedObject] performWithItems:array];
+                    let represent : NSSharingService = (sender as! NSMenuItem).representedObject as! NSSharingService
+                    represent.perform(withItems: [url])
+                    
+                    NSApp.endSheet(vc.window!)
+                    vc.close()
+                }
+            } else {
+                NSApp.endSheet(vc.window!)
+                vc.close()
+            }
+        }
+//        [vc release];
+    }
+}
+

+ 8 - 100
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/KMLeftSideViewController.swift

@@ -7,9 +7,6 @@
 
 import Cocoa
 
-private let KMLeftSideViewNoteSortTypeKey = "KMLeftSideViewNoteSortTypeKey"
-private let KMLeftSideViewAscendSortBoolKey = "KMLeftSideViewAscendSortBoolKey"
-
 @objc protocol KMLeftSideViewControllerDelegate {
     @objc optional func controlStateChange(_ obj: KMLeftSideViewController,show:Bool)
     @objc optional func enterEditMode(_ obj: KMLeftSideViewController, _ pages: [Int])
@@ -22,6 +19,10 @@ private let KMLeftSideViewAscendSortBoolKey = "KMLeftSideViewAscendSortBoolKey"
     @objc optional func controller(controller: KMLeftSideViewController, rotateType: KMRotateType)
 }
 
+extension KMLeftSideViewController.Key {
+    static let disableTableToolTipsKey = "SKDisableTableToolTips"
+}
+
 class KMLeftSideViewController: KMSideViewController {
     var dataSource : [KMLeftMethodMode] = [KMLeftMethodMode]()
 
@@ -63,7 +64,6 @@ class KMLeftSideViewController: KMSideViewController {
         self.reloadSnapshotSize()
         
 //        DistributedNotificationCenter.default().addObserver(self, selector: #selector(interfaceThemeDidChanged), name: NSApplication.interfaceThemeChangedNotification, object: nil)
-        self.isDisplayPageSize = UserDefaults.standard.bool(forKey: "kKMThumbnailDisplayPageSizeKey")
     }
     
     func showPanelView(show: Bool) {
@@ -196,9 +196,6 @@ class KMLeftSideViewController: KMSideViewController {
     private let MIN_SIDE_PANE_WIDTH: CGFloat = 270
     private let LABEL_COLUMNID = "label"
     var foldType: KMFoldAllAnnotationType = .none
-    static let noteSortTypeKey = KMLeftSideViewNoteSortTypeKey
-    static let ascendSorKey = KMLeftSideViewAscendSortBoolKey
-    private let SKDisableTableToolTipsKey = "SKDisableTableToolTips"
     
     var tocType: KMFoldType = .none
     
@@ -391,7 +388,7 @@ class KMLeftSideViewController: KMSideViewController {
 //        NSSortDescriptor *countDescriptor = [[[NSSortDescriptor alloc] initWithKey:SKGroupedSearchResultCountKey ascending:NO] autorelease];
 //        [groupedFindArrayController setSortDescriptors:[NSArray arrayWithObjects:countDescriptor, nil]];
         
-        if UserDefaults.standard.bool(forKey: SKDisableTableToolTipsKey) == false {
+        if KMDataManager.ud_bool(forKey: Self.Key.disableTableToolTipsKey) == false {
             self.tocOutlineView.hasImageToolTips = true
             self.findTableView.hasImageToolTips = true
             self.groupedFindTableView.hasImageToolTips = true
@@ -415,12 +412,6 @@ class KMLeftSideViewController: KMSideViewController {
         self.view.wantsLayer = true
         self.view.layer?.backgroundColor = KMAppearance.Layout.l0Color().cgColor
         
-        let sud = UserDefaults.standard
-        self.isAscendSort = sud.bool(forKey: KMLeftSideViewAscendSortBoolKey)
-        
-        self.mwcFlags.wholeWordSearch = UserDefaults.standard.integer(forKey: SKWholeWordSearchKey)
-        self.mwcFlags.caseInsensitiveSearch = UserDefaults.standard.integer(forKey: SKCaseInsensitiveSearchKey)
-        
         self.leftView.wantsLayer = true
         self.leftView.layer?.backgroundColor = .white
 
@@ -742,30 +733,6 @@ class KMLeftSideViewController: KMSideViewController {
         }
     }
     
-    @IBAction @objc  func sortTypeAction(_ sender: NSMenuItem) {
-        let item = sender
-        let tag = item.tag
-        
-        if (item.state == .on) {
-            item.state = .off
-        } else {
-            item.state = .on
-        }
-        if (tag == 0) {
-            self.noteSortType = .page
-            self.sortTypeLabel.stringValue = KMLocalizedString("Page", nil)
-            self.sortTypeBox.toolTip = KMLocalizedString("Page", nil)
-        } else if (tag == 1) {
-            self.noteSortType = .time
-            self.sortTypeLabel.stringValue = KMLocalizedString("Time", nil)
-            self.sortTypeBox.toolTip = KMLocalizedString("Time", nil)
-        }
-        UserDefaults.standard.set(self.noteSortType.rawValue, forKey: KMLeftSideViewNoteSortTypeKey)
-        UserDefaults.standard.synchronize()
-        
-        self.annotationSort(sortArray: [])
-    }
-    
     @IBAction func leftSideViewDoneButtonAction(_ sender: AnyObject?) {
         let button = sender as? NSButton
         let tag = button?.tag ?? 0
@@ -1024,12 +991,6 @@ extension KMLeftSideViewController {
 //        self.updateViewButtonState()
         // 将事件传递出去
         self.delegate?.controlStateChange?(self,show:show)
-        if (index != NSNotFound) {
-            
-            // 记录当前选中
-            UserDefaults.standard.set(index, forKey: "KMBOTASelectedIndexKey")
-            UserDefaults.standard.synchronize()
-        }
     }
     
     private func getMethodMode(_ type: BotaType) -> KMLeftMethodMode {
@@ -1069,51 +1030,10 @@ extension KMLeftSideViewController {
 
 //MARK: Cache
 extension KMLeftSideViewController {
-    func clearAnnotationFilterData() {
-        if let _key = self.listView?.document?.documentURL?.path {
-            let userDefaults = UserDefaults.standard
-            let typeData = try?NSKeyedArchiver.archivedData(withRootObject: [Any](), requiringSecureCoding: false)
-            userDefaults.set(typeData, forKey: "KMNoteOutlineFilterSelectArray_Type" + _key)
-            let colorData = try?NSKeyedArchiver.archivedData(withRootObject: [Any](), requiringSecureCoding: false)
-            userDefaults.set(colorData, forKey: "KMNoteOutlineFilterSelectArray_Color" + _key)
-            let authorData = try?NSKeyedArchiver.archivedData(withRootObject: [Any](), requiringSecureCoding: false)
-            userDefaults.set(authorData, forKey: "KMNoteOutlineFilterSelectArray_Author" + _key)
-            userDefaults.synchronize()
-        }
-    }
-    
     func clearNotification() {
     }
 }
 
-// MARK: - Analytics (埋点)
-
-extension KMLeftSideViewController {
-    func trackEvent(type: BotaType) -> Void {
-        if (type == .Thumbnail) {
-            KMAnalytics.trackEvent(eventName: "Btn_LeftSideBar_Thumbnail", parameters: [
-                KMAnalytics.Parameter.categoryKey : KMAnalytics.Category.leftSideBar,
-                KMAnalytics.Parameter.labelKey : KMAnalytics.Label.leftSideBar_Btn], platform: .AppCenter, appTarget: .all)
-        } else if (type == .Outline) {
-            KMAnalytics.trackEvent(eventName: "Btn_LeftSideBar_Outline", parameters: [
-                KMAnalytics.Parameter.categoryKey : KMAnalytics.Category.leftSideBar,
-                KMAnalytics.Parameter.labelKey : KMAnalytics.Label.leftSideBar_Btn], platform: .AppCenter, appTarget: .all)
-        } else if (type == .BookMark) {
-            KMAnalytics.trackEvent(eventName: "Btn_LeftSideBar_BookMark", parameters: [
-                KMAnalytics.Parameter.categoryKey : KMAnalytics.Category.leftSideBar,
-                KMAnalytics.Parameter.labelKey : KMAnalytics.Label.leftSideBar_Btn], platform: .AppCenter, appTarget: .all)
-        } else if (type == .Annotation) {
-            KMAnalytics.trackEvent(eventName: "Btn_LeftSideBar_Annotation", parameters: [
-                KMAnalytics.Parameter.categoryKey : KMAnalytics.Category.leftSideBar,
-                KMAnalytics.Parameter.labelKey : KMAnalytics.Label.leftSideBar_Btn], platform: .AppCenter, appTarget: .all)
-        } else if (type == .Search) {
-            KMAnalytics.trackEvent(eventName: "Btn_LeftSideBar_Search", parameters: [
-                KMAnalytics.Parameter.categoryKey : KMAnalytics.Category.leftSideBar,
-                KMAnalytics.Parameter.labelKey : KMAnalytics.Label.leftSideBar_Btn], platform: .AppCenter, appTarget: .all)
-        }
-    }
-}
-
 // MARK: - Private Methods
 
 extension KMLeftSideViewController {
@@ -1378,9 +1298,6 @@ extension KMLeftSideViewController: NSTableViewDelegate, NSTableViewDataSource {
     func tableViewSelectionDidChange(_ notification: Notification) {
         if self.findTableView.isEqual(to: notification.object) {
             //            [self updateFindResultHighlightsForDirection:NSDirectSelection];
-            //
-            //            if ([self interactionMode] == SKPresentationMode && [[NSUserDefaults standardUserDefaults] boolForKey:SKAutoHidePresentationContentsKey])
-            //                [self hideLeftSideWindow];
             let row = self.findTableView.selectedRow
             if row >= 0 {
                 let model = self.searchResults[row]
@@ -1392,9 +1309,6 @@ extension KMLeftSideViewController: NSTableViewDelegate, NSTableViewDataSource {
             }
         } else if self.groupedFindTableView.isEqual(to: notification.object) {
             //            [self updateFindResultHighlightsForDirection:NSDirectSelection];
-            //
-            //            if ([self interactionMode] == SKPresentationMode && [[NSUserDefaults standardUserDefaults] boolForKey:SKAutoHidePresentationContentsKey])
-            //                [self hideLeftSideWindow];
         } else if self.thumbnailTableView.isEqual(to: notification.object) {
 //            if (mwcFlags.updatingThumbnailSelection == 0) {
             let row = self.thumbnailTableView.selectedRow
@@ -1404,10 +1318,6 @@ extension KMLeftSideViewController: NSTableViewDelegate, NSTableViewDataSource {
 //                [pdfView goToPage:[[pdfView document] pageAtIndex:row]];
                 self.listView.go(toPageIndex: row, animated: true)
             }
-                
-//                if ([self interactionMode] == SKPresentationMode && [[NSUserDefaults standardUserDefaults] boolForKey:SKAutoHidePresentationContentsKey])
-//                    [self hideLeftSideWindow];
-                
 //                thumbnailSelectCount = row;
 //            var rowIndexSet = IndexSet()
 //            for i in 0 ..< self.thumbnailTableView.numberOfRows {
@@ -2615,7 +2525,7 @@ extension KMLeftSideViewController: NSOutlineViewDelegate, NSOutlineViewDataSour
 //                noteString = @"Redact";
 //            }
 //
-            let timeKey = self.noteTypeDict[Self.noteFilterTimeKey] as? Bool
+            let timeKey = self.noteTypeDict[Self.Key.noteFilterTime] as? Bool
             if timeKey == nil || timeKey == false {
 //                if (date != nil) {
                     cell.timeLabel.stringValue =  dateString
@@ -2628,7 +2538,7 @@ extension KMLeftSideViewController: NSOutlineViewDelegate, NSOutlineViewDataSour
                 cell.timeLabel.isHidden = true
             }
             
-            let pageKey = self.noteTypeDict[Self.noteFilterPageKey] as? Bool
+            let pageKey = self.noteTypeDict[Self.Key.noteFilterPage] as? Bool
             if pageKey == nil || pageKey == false {
                 let labelsize = cell.pageLabel.stringValue.boundingRect(with: CGSizeMake(CGFloat(MAXFLOAT),CGRectGetHeight(cell.pageLabel.bounds)), options: [.usesLineFragmentOrigin, .usesFontLeading], attributes: [.font : NSFont.systemFont(ofSize: 12)])
                 cell.pageLabelWidthConstraint.constant = labelsize.size.width + 5
@@ -2638,7 +2548,7 @@ extension KMLeftSideViewController: NSOutlineViewDelegate, NSOutlineViewDataSour
                 cell.pageLabel.isHidden = true
             }
             
-            let autherKey = self.noteTypeDict[Self.noteFilterAutherKey] as? Bool
+            let autherKey = self.noteTypeDict[Self.Key.noteFilterAuther] as? Bool
             if autherKey == nil || autherKey == false {
                 cell.autherLabel.stringValue = authorString
                 cell.autherLabel.isHidden = false
@@ -2985,8 +2895,6 @@ extension KMLeftSideViewController: NSOutlineViewDelegate, NSOutlineViewDataSour
                 self.updatingOutlineSelection = true
                 self.goToSelectedOutlineItem(nil)
                 self.updatingOutlineSelection = false
-                //            if ([self interactionMode] == SKPresentationMode && [[NSUserDefaults standardUserDefaults] boolForKey:SKAutoHidePresentationContentsKey])
-                //                [self hideLeftSideWindow];
             }
         }
     }

+ 49 - 2
PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/AnnotationProperty/KMAnnotationPropertiesViewController.m

@@ -62,11 +62,57 @@
 
 #pragma mark - View Methods
 
+//func addNotification() {
+//    NotificationCenter.default.addObserver(self, selector: #selector(changeEffectiveAppearance), name: NSNotification.Name(rawValue: "kEffectiveAppearance"), object: nil)
+//}
+//
+//func removeNotification() {
+//    NotificationCenter.default.removeObserver(self)
+//    DistributedNotificationCenter.default().removeObserver(self)
+//}
+//
+//@objc func changeEffectiveAppearance() {
+//    let isDarkModel = KMAdvertisementConfig.isDarkModel()
+//    if isDarkModel {
+//        self.appearance = NSAppearance(named: .darkAqua)
+//    } else {
+//        self.appearance = NSAppearance(named: .aqua)
+//    }
+//    self.updateUI()
+//}
+
+- (void)dealloc {
+    [self removeNotification];
+}
+
+- (void)addNotification {
+    [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(changeEffectiveAppearance) name:@"kEffectiveAppearance" object:nil];
+}
+
+- (void)removeNotification {
+    [NSNotificationCenter.defaultCenter removeObserver:self];
+}
+
+- (void)changeEffectiveAppearance {
+    NSLog(@"changeEffectiveAppearance");
+    BOOL isDarkModel = [KMAdvertisementConfig isDarkModel];
+    if (isDarkModel) {
+        self.view.appearance = [NSAppearance appearanceNamed:NSAppearanceNameDarkAqua];
+        self.view.layer.backgroundColor = [NSColor km_initWithHex:@"#252526" alpha:1].CGColor;
+    } else {
+        self.view.appearance = [NSAppearance appearanceNamed:NSAppearanceNameAqua];
+        self.view.layer.backgroundColor = [NSColor km_initWithHex:@"#FAFAFA" alpha:1].CGColor;
+    }
+}
+
 - (void)loadView {
     [super loadView];
     
+    [self addNotification];
+    
     self.view.wantsLayer = YES;
-    self.view.layer.backgroundColor = [NSColor colorWithRed:247.0/255.0 green:248.0/255.0 blue:250.0/255.0 alpha:1].CGColor;
+    self.view.layer.backgroundColor = [KMAppearance viewBackgroundColor].CGColor;
+//    self.view.layer.backgroundColor = [NSColor colorWithRed:247.0/255.0 green:248.0/255.0 blue:250.0/255.0 alpha:1].CGColor;
     self.view.layer.shadowColor = [NSColor colorWithRed:0/255.0 green:0/255.0 blue:0/255.0 alpha:0.15].CGColor;
     self.view.layer.shadowOffset = NSMakeSize(0, 0);
     self.view.layer.shadowRadius = 4;
@@ -83,7 +129,8 @@
     self.subTitleLabel.textColor = [NSColor grayColor];
     
     self.titleLabel.font = [NSFont SFProTextSemiboldFont:14.0];
-    self.titleLabel.textColor = [NSColor colorWithRed:0.145 green:0.149 blue:0.161 alpha:1];
+    self.titleLabel.textColor = [KMAppearance KMColor_Layout_H0];
+//    [NSColor colorWithRed:0.145 green:0.149 blue:0.161 alpha:1];
     
     self.buttonView.hidden = YES;
     self.formGeneralButton.wantsLayer = YES;

+ 35 - 29
PDF Office/PDF Master/Class/PDFWindowController/Side/RightSide/AnnotationProperty/ViewController/PageDisplay/KMPageDisplayPropertiesViewController.swift

@@ -314,53 +314,51 @@ class KMPageDisplayPropertiesButton: NSButton {
     }
 
     private func reloadData() {
-        let pdf: CPDFView = CPDFView()
-        if displayType == .singlePage {
-            setDisplayMode(.singlePage)
-            continuousScrollButton.state = .off
-        } else if displayType == .singlePageContinuous {
-            setDisplayMode(.singlePage)
-            continuousScrollButton.state = .on
-            isContinuPage = true
-        } else if displayType == .twoUp {
-            if pdfView.displaysAsBook {
-                setDisplayMode(.coverPage)
+        let mode = self.pdfView?.displayMode() ?? .singlePage
+        let book = self.pdfView?.displaysAsBook ?? false
+        if mode == .singlePage {
+            self.setDisplayMode(.singlePage)
+            self.continuousScrollButton.state = .off
+        } else if mode == .singlePageContinuous {
+            self.setDisplayMode(.singlePage)
+            self.continuousScrollButton.state = .on
+            self.isContinuPage = true
+        } else if mode == .twoUp {
+            if book {
+                self.setDisplayMode(.coverPage)
             } else {
-                setDisplayMode(.twoPages)
+                self.setDisplayMode(.twoPages)
             }
-            continuousScrollButton.state = .off
-        } else if displayType == .twoUpContinuous {
-            if pdfView.displaysAsBook {
+            self.continuousScrollButton.state = .off
+        } else if mode == .twoUpContinuous {
+            if book {
                 setDisplayMode(.coverPage)
             } else {
                 setDisplayMode(.twoPages)
             }
-            continuousScrollButton.state = .on
-            isContinuPage = true
+            self.continuousScrollButton.state = .on
+            self.isContinuPage = true
         }
         
         isReaderMode = UserDefaults.standard.bool(forKey: "kKMPDFViewIsReadMode")
         if isReaderMode {
-            setDisplayMode(.readMode)
+            self.setDisplayMode(.readMode)
         }
         
-        if pdfView.displaysPageBreaks {
-            pageBreaksButton.state = .on
-        } else {
-            pageBreaksButton.state = .off
-        }
+        let `break` = self.pdfView?.displaysPageBreaks ?? false
+        self.pageBreaksButton.state = `break` ? .on : .off
         
         if !(mainController?.secondaryPdfView?.window != nil) {
-            setSplitViewType(.singleScreen)
+            self.setSplitViewType(.singleScreen)
         } else {
             if let data = mainController?.pdfSplitView.isVertical, data {
-                setSplitViewType(.verticalScreen)
+                self.setSplitViewType(.verticalScreen)
             } else {
-                setSplitViewType(.horizontalScreen)
+                self.setSplitViewType(.horizontalScreen)
             }
         }
         
-        themeCollectionView.reloadData()
+        self.themeCollectionView.reloadData()
     }
     
 //    private func setPdfView(_ pdfView: SKPDFView) {
@@ -501,13 +499,21 @@ class KMPageDisplayPropertiesButton: NSButton {
             if displayMode == KMDisplayModeType.singlePage {
                 self.mainController?.selectDisplay(display: .singlePageContinuous, viewSettingIsReload: false)
             } else {
-                self.mainController?.selectDisplay(display: .twoUpContinuous, viewSettingIsReload: false)
+                if self.displayMode == .twoPages {
+                    self.mainController?.selectDisplay(display: .twoUpContinuous, viewSettingIsReload: false)
+                } else if self.displayMode == .coverPage {
+                    self.mainController?.selectDisplay(display: .bookContinuous, viewSettingIsReload: false)
+                }
             }
         } else {
             if displayMode == KMDisplayModeType.singlePage {
                 self.mainController?.selectDisplay(display: .singlePage, viewSettingIsReload: false)
             } else {
-                self.mainController?.selectDisplay(display: .twoUp, viewSettingIsReload: false)
+                if self.displayMode == .twoPages {
+                    self.mainController?.selectDisplay(display: .twoUp, viewSettingIsReload: false)
+                } else if self.displayMode == .coverPage {
+                    self.mainController?.selectDisplay(display: .bookMode, viewSettingIsReload: false)
+                }
             }
         }
     }

+ 3 - 9
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/KMToolbarViewController.swift

@@ -509,14 +509,8 @@ class KMToolbarViewController: NSViewController, NSTextFieldDelegate {
     }
     
     @objc func toggleCaseInsensitiveSearch(_ sender: NSMenuItem) {
-        var value = UserDefaults.standard.integer(forKey: SKCaseInsensitiveSearchKey)
-        if value == 1 {
-            value = 0
-        } else {
-            value = 1
-        }
-        UserDefaults.standard.setValue(value, forKey: SKCaseInsensitiveSearchKey)
-        UserDefaults.standard.synchronize()
+        var value = KMDataManager.ud_integer(forKey: SKCaseInsensitiveSearchKey)
+        KMDataManager.ud_set(value == 0 ? 1 : 0, forKey: SKCaseInsensitiveSearchKey)
     }
     
     // MARK: - Private Methods
@@ -2062,7 +2056,7 @@ extension KMToolbarViewController {
 extension KMToolbarViewController: NSMenuItemValidation {
     func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
         if menuItem.action == #selector(toggleCaseInsensitiveSearch) {
-            menuItem.state = UserDefaults.standard.integer(forKey: SKCaseInsensitiveSearchKey) == 1 ? .on : .off
+            menuItem.state = KMDataManager.ud_integer(forKey: SKCaseInsensitiveSearchKey) == 1 ? .on : .off
         }
         return true
     }

+ 3 - 3
PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift

@@ -4594,12 +4594,12 @@ extension KMMainViewController : KMMainToolbarControllerDelegate {
                 menuItemAction_newTagPageToNewWindow("")
             } else {
                 let window = NSWindow.currentWindow()
-                if !KMTools.defaultManager.isTabbingWin{
-                    KMTools.defaultManager.isTabbingWin = true
+                if !KMDataManager.default.isTabbingWin{
+                    KMDataManager.default.isTabbingWin = true
                     let tabbingWin: KMTabbingHintWindowController = KMTabbingHintWindowController()
                     tabbingWin.selectCallBack = { continueOrNot in
                         window.km_quick_endSheet()
-                        KMTools.defaultManager.isTabbingWin = false
+                        KMDataManager.default.isTabbingWin = false
                         if continueOrNot {
                             self.reopenDocument(forPaths: [])
                         } else {

+ 0 - 32
PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController.swift

@@ -581,38 +581,6 @@ let LOCKED_KEY  = "locked"
     }
     
     func checkShouldAutoOpenLeftVC() {
-        //        if (KMPreferenceManager.shared.leftSideNeedCloseWhenOpenFile()) {
-        //            return
-        //        }
-        //        if (KMPreferenceManager.shared.leftSideDisplayType == .showOutlineIfHas) {
-        //            let outlineRoot = self.listView.document.outlineRoot()
-        //            let hasOutline = (outlineRoot != nil && outlineRoot!.numberOfChildren > 0)
-        //            if (hasOutline == false) {
-        //                return
-        //            }
-        //
-        //            DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) {
-        //                self.leftSideViewController.refreshMethodType(methodType: .Outline)
-        //            }
-        //            return
-        //        }
-        //        DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) {
-        //            let selectedIndex = UserDefaults.standard.integer(forKey: "KMBOTASelectedIndexKey")
-        //            let thumai = KMLeftMethodMode()
-        //            if selectedIndex == 0 {
-        //                thumai.methodType = .Thumbnail
-        //            } else if selectedIndex == 1 {
-        //                thumai.methodType = .Outline
-        //            } else if selectedIndex == 2 {
-        //                thumai.methodType = .BookMark
-        //            } else if selectedIndex == 3 {
-        //                thumai.methodType = .Annotation
-        //            } else if selectedIndex == 4 {
-        //                thumai.methodType = .Search
-        //            }
-        //
-        //            self.leftSideViewController.refreshMethodType(methodType: thumai.methodType)
-        //        }
         if KMPreference.shared.showLeftSideBar == false {
             return
         }

+ 46 - 90
PDF Office/PDF Master/Class/Preference/Tools/KMPreferenceManager.swift

@@ -844,9 +844,8 @@ extension KMPreferenceManager {
 //            return self.getData(forKey: KMGeneralAuthorNameKey) as! String
         }
         set {
-            let _ = self.setData(data: newValue, forKey: KMGeneralAuthorNameKey)
-            
             self._syncDataToUserDefault(newValue, forKey: KMGeneralAuthorNameKey)
+            let _ = self.setData(data: newValue, forKey: KMGeneralAuthorNameKey)
         }
     }
     
@@ -886,8 +885,6 @@ extension KMPreferenceManager {
         }
         set {
             if (newValue == .always || newValue == .never || newValue == .ask) {
-                let _ = self.setData(data: newValue.rawValue, forKey: KMSavePasswordTypeKey)
-                
                 var data: Int = 0
                 if newValue == .always {
                     data = 1
@@ -895,6 +892,7 @@ extension KMPreferenceManager {
                     data = -1
                 }
                 self._syncDataToUserDefault(data, forKey: KMSavePasswordTypeKey)
+                let _ = self.setData(data: newValue.rawValue, forKey: KMSavePasswordTypeKey)
             }
         }
     }
@@ -912,8 +910,8 @@ extension KMPreferenceManager {
         set {
             if (newValue == .inSameWindow || newValue == .newWindow) {
                 let pKey = KMOpenDocumentTypeKey
-                _ = self.setData(data: newValue.rawValue, forKey: pKey)
                 self._syncDataToUserDefault(NSNumber(value: newValue.rawValue), forKey: pKey)
+                _ = self.setData(data: newValue.rawValue, forKey: pKey)
             }
         }
     }
@@ -948,10 +946,9 @@ extension KMPreferenceManager {
         }
         set {
             if (newValue == .default || newValue == .maxim || newValue == .fit) {
-                let _ = self.setData(data: newValue.rawValue, forKey: KMOpenFileTypeKey)
-                
                 // 数据兼容
                 self._syncDataToUserDefault(newValue.rawValue, forKey: KMOpenFileTypeKey)
+                let _ = self.setData(data: newValue.rawValue, forKey: KMOpenFileTypeKey)
             }
         }
     }
@@ -962,9 +959,8 @@ extension KMPreferenceManager {
 //            return self.getData(forKey: KMShowLeftSideBarKey) as? Bool ?? self.showLeftSideBarDefaultValue
         }
         set {
-            _ = self.setData(data: newValue, forKey: KMShowLeftSideBarKey)
-            
             self._syncDataToUserDefault(newValue, forKey: KMShowLeftSideBarKey)
+            _ = self.setData(data: newValue, forKey: KMShowLeftSideBarKey)
         }
     }
     
@@ -974,9 +970,9 @@ extension KMPreferenceManager {
 //            return self.getData(forKey: KMRememberSnapshotKey) as? Bool ?? self.rememberSnapshotDefaultValue
         }
         set {
-            _ = self.setData(data: newValue, forKey: KMRememberSnapshotKey)
             // 数据兼容
             self._syncDataToUserDefault(newValue, forKey: KMRememberSnapshotKey)
+            _ = self.setData(data: newValue, forKey: KMRememberSnapshotKey)
         }
     }
     
@@ -1004,9 +1000,8 @@ extension KMPreferenceManager {
 //            return self.getData(forKey: KMAutoSaveNoteBackupKey) as? Bool ?? self.autoSaveNoteBackupDefaultValue
         }
         set {
-            _ = self.setData(data: newValue, forKey: KMAutoSaveNoteBackupKey)
-            
             self._syncDataToUserDefault(newValue, forKey: KMAutoSaveNoteBackupKey)
+            _ = self.setData(data: newValue, forKey: KMAutoSaveNoteBackupKey)
         }
     }
     
@@ -1016,10 +1011,9 @@ extension KMPreferenceManager {
 //            return self.getData(forKey: KMKeepSnapshotWindowToTopKey) as? Bool ?? self.keepSnapshotWindowToTopDefaultValue()
         }
         set {
-            _ = self.setData(data: newValue, forKey: KMKeepSnapshotWindowToTopKey)
-            
             // 数据兼容
             self._syncDataToUserDefault(newValue, forKey: KMKeepSnapshotWindowToTopKey)
+            _ = self.setData(data: newValue, forKey: KMKeepSnapshotWindowToTopKey)
         }
     }
 }
@@ -1172,9 +1166,8 @@ extension KMPreferenceManager {
             return self.getColor(forKey: KMDisplayBackgroundNormalColorKey)
         }
         set {
-            let _ = self.setColor(newValue, forKey: KMDisplayBackgroundNormalColorKey)
-            
             self._syncDataToUserDefault(newValue, forKey: KMDisplayBackgroundNormalColorKey)
+            let _ = self.setColor(newValue, forKey: KMDisplayBackgroundNormalColorKey)
         }
     }
     
@@ -1186,9 +1179,8 @@ extension KMPreferenceManager {
             return self.getColor(forKey: KMDisplayBackgroundFullScreenColorKey)
         }
         set {
-            let _ = self.setColor(newValue, forKey: KMDisplayBackgroundFullScreenColorKey)
-            
             self._syncDataToUserDefault(newValue, forKey: KMDisplayBackgroundFullScreenColorKey)
+            let _ = self.setColor(newValue, forKey: KMDisplayBackgroundFullScreenColorKey)
         }
     }
     
@@ -1230,9 +1222,8 @@ extension KMPreferenceManager {
             return num?.floatValue ?? self.thumbSnapshotSizeDefaultValue()
         }
         set {
-            let _ = self.setData(data: newValue, forKey: KMThumbSnapshotSizeKey)
-            
             self._syncDataToUserDefault(NSNumber(value: newValue), forKey: KMThumbSnapshotSizeKey)
+            let _ = self.setData(data: newValue, forKey: KMThumbSnapshotSizeKey)
         }
     }
     
@@ -1252,9 +1243,8 @@ extension KMPreferenceManager {
 //            return self.getData(forKey: KMOutlineFontSizeKey) as? Float ?? self.outlineFontSizeDefaultValue()
         }
         set {
-            let _ = self.setData(data: newValue, forKey: KMOutlineFontSizeKey)
-            
             self._syncDataToUserDefault(NSNumber(value: newValue), forKey: KMOutlineFontSizeKey)
+            let _ = self.setData(data: newValue, forKey: KMOutlineFontSizeKey)
         }
     }
     
@@ -1265,9 +1255,8 @@ extension KMPreferenceManager {
 //            return self.getData(forKey: KMGreekThresholdKey) as? Float ?? self.greekThresholdDefaultValue()
         }
         set {
-            let _ = self.setData(data: newValue, forKey: KMGreekThresholdKey)
-            
             self._syncDataToUserDefault(NSNumber(value: newValue), forKey: KMGreekThresholdKey)
+            let _ = self.setData(data: newValue, forKey: KMGreekThresholdKey)
         }
     }
     
@@ -1277,9 +1266,8 @@ extension KMPreferenceManager {
             return KMDataManager.ud_bool(forKey: KMShouldAntiAliasKey)
         }
         set {
-            let _ = self.setData(data: newValue, forKey: KMAntiAliasTextKey)
-            
             self._syncDataToUserDefault(newValue, forKey: KMAntiAliasTextKey)
+            let _ = self.setData(data: newValue, forKey: KMAntiAliasTextKey)
         }
     }
     
@@ -1291,9 +1279,8 @@ extension KMPreferenceManager {
             return self.getColor(forKey: KMReadBarColorKey)
         }
         set {
-            let _ = self.setColor(newValue, forKey: KMReadBarColorKey)
-            
             self._syncDataToUserDefault(newValue, forKey: KMReadBarColorKey)
+            let _ = self.setColor(newValue, forKey: KMReadBarColorKey)
         }
     }
     
@@ -1303,9 +1290,8 @@ extension KMPreferenceManager {
 //            return self.getData(forKey: KMInvertBarKey) as? Bool ?? self.invertBarDefaultValue()
         }
         set {
-            let _ = self.setData(data: newValue, forKey: KMInvertBarKey)
-            
             self._syncDataToUserDefault(newValue, forKey: KMInvertBarKey)
+            let _ = self.setData(data: newValue, forKey: KMInvertBarKey)
         }
     }
 }
@@ -1323,9 +1309,8 @@ extension KMPreferenceManager {
         }
         set {
             self.syncDataToPDFView(newValue, forKey: KMPreference.markupColorHighlightKey)
-            
-            let _ = self.setColor(newValue, forKey: KMPreference.markupColorHighlightKey)
             self._syncDataToUserDefault(newValue, forKey: KMPreference.markupColorHighlightKey)
+            let _ = self.setColor(newValue, forKey: KMPreference.markupColorHighlightKey)
         }
     }
     var markupStrikthroughColor: NSColor {
@@ -1355,9 +1340,8 @@ extension KMPreferenceManager {
         }
         set {
             self.syncDataToPDFView(newValue, forKey: KMPreference.markupColorUnderlineKey)
-            
-            let _ = self.setColor(newValue, forKey: KMPreference.markupColorUnderlineKey)
             self._syncDataToUserDefault(newValue, forKey: KMPreference.markupColorUnderlineKey)
+            let _ = self.setColor(newValue, forKey: KMPreference.markupColorUnderlineKey)
         }
     }
     var markupPenColor: NSColor {
@@ -1371,9 +1355,8 @@ extension KMPreferenceManager {
         }
         set {
             self.syncDataToPDFView(newValue, forKey: KMPreference.markupColorPenKey)
-            
-            let _ = self.setColor(newValue, forKey: KMPreference.markupColorPenKey)
             self._syncDataToUserDefault(newValue, forKey: KMPreference.markupColorPenKey)
+            let _ = self.setColor(newValue, forKey: KMPreference.markupColorPenKey)
         }
     }
     var markupTextColor: NSColor {
@@ -1387,9 +1370,8 @@ extension KMPreferenceManager {
         }
         set {
             self.syncDataToPDFView(newValue, forKey: KMPreference.markupColorTextKey)
-            
-            let _ = self.setColor(newValue, forKey: KMPreference.markupColorTextKey)
             self._syncDataToUserDefault(newValue, forKey: KMPreference.markupColorTextKey)
+            let _ = self.setColor(newValue, forKey: KMPreference.markupColorTextKey)
         }
     }
     var markupNoteColor: NSColor {
@@ -1403,9 +1385,8 @@ extension KMPreferenceManager {
         }
         set {
             self.syncDataToPDFView(newValue, forKey: KMPreference.markupColorNoteKey)
-            
-            let _ = self.setColor(newValue, forKey: KMPreference.markupColorNoteKey)
             self._syncDataToUserDefault(newValue, forKey: KMPreference.markupColorNoteKey)
+            let _ = self.setColor(newValue, forKey: KMPreference.markupColorNoteKey)
         }
     }
     var markupRectangleFillColor: NSColor {
@@ -1419,9 +1400,8 @@ extension KMPreferenceManager {
         }
         set {
             self.syncDataToPDFView(newValue, forKey: KMPreference.markupColorRectangleFillKey)
-            
-            let _ = self.setColor(newValue, forKey: KMPreference.markupColorRectangleFillKey)
             self._syncDataToUserDefault(newValue, forKey: KMPreference.markupColorRectangleFillKey)
+            let _ = self.setColor(newValue, forKey: KMPreference.markupColorRectangleFillKey)
         }
     }
     var markupRectangleBorderColor: NSColor {
@@ -1435,9 +1415,8 @@ extension KMPreferenceManager {
         }
         set {
             self.syncDataToPDFView(newValue, forKey: KMPreference.markupColorRectangleBorderKey)
-            
-            let _ = self.setColor(newValue, forKey: KMPreference.markupColorRectangleBorderKey)
             self._syncDataToUserDefault(newValue, forKey: KMPreference.markupColorRectangleBorderKey)
+            let _ = self.setColor(newValue, forKey: KMPreference.markupColorRectangleBorderKey)
         }
     }
     var markupCircleFillColor: NSColor {
@@ -1451,9 +1430,8 @@ extension KMPreferenceManager {
         }
         set {
             self.syncDataToPDFView(newValue, forKey: KMPreference.markupColorCircleFillKey)
-            
-            let _ = self.setColor(newValue, forKey: KMPreference.markupColorCircleFillKey)
             self._syncDataToUserDefault(newValue, forKey: KMPreference.markupColorCircleFillKey)
+            let _ = self.setColor(newValue, forKey: KMPreference.markupColorCircleFillKey)
         }
     }
     var markupCircleBorderColor: NSColor {
@@ -1467,9 +1445,8 @@ extension KMPreferenceManager {
         }
         set {
             self.syncDataToPDFView(newValue, forKey: KMPreference.markupColorCircleBorderKey)
-            
-            let _ = self.setColor(newValue, forKey: KMPreference.markupColorCircleBorderKey)
             self._syncDataToUserDefault(newValue, forKey: KMPreference.markupColorCircleBorderKey)
+            let _ = self.setColor(newValue, forKey: KMPreference.markupColorCircleBorderKey)
         }
     }
     var markupLineColor: NSColor {
@@ -1483,9 +1460,8 @@ extension KMPreferenceManager {
         }
         set {
             self.syncDataToPDFView(newValue, forKey: KMPreference.markupColorLineKey)
-            
-            let _ = self.setColor(newValue, forKey: KMPreference.markupColorLineKey)
             self._syncDataToUserDefault(newValue, forKey: KMPreference.markupColorLineKey)
+            let _ = self.setColor(newValue, forKey: KMPreference.markupColorLineKey)
         }
     }
     var markupArrowColor: NSColor {
@@ -1499,9 +1475,8 @@ extension KMPreferenceManager {
         }
         set {
             self.syncDataToPDFView(newValue, forKey: KMPreference.markupColorArrowKey)
-            
-            let _ = self.setColor(newValue, forKey: KMPreference.markupColorArrowKey)
             self._syncDataToUserDefault(newValue, forKey: KMPreference.markupColorArrowKey)
+            let _ = self.setColor(newValue, forKey: KMPreference.markupColorArrowKey)
         }
     }
     
@@ -1516,9 +1491,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.markupTextFontSizeKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(NSNumber(value: newValue), forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
     
@@ -1533,9 +1507,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.markupNoteFontSizeKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(NSNumber(value: newValue), forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
     
@@ -1550,9 +1523,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.freeTextNoteLineWidthKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(NSNumber(value: newValue), forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
     
@@ -1567,9 +1539,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.freeTextNoteLineStyleKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(NSNumber(value: newValue), forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
     
@@ -1583,9 +1554,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.freeTextNoteDashPatternKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(newValue, forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
     
@@ -1600,9 +1570,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.circleNoteLineWidthKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(NSNumber(value: newValue), forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
     
@@ -1617,9 +1586,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.circleNoteLineStyleKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(NSNumber(value: newValue), forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
     
@@ -1633,9 +1601,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.circleNoteDashPatternKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(newValue, forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
     
@@ -1650,9 +1617,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.squareNoteLineWidthKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(NSNumber(value: newValue), forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
     
@@ -1667,9 +1633,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.squareNoteLineStyleKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(NSNumber(value: newValue), forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
     
@@ -1683,9 +1648,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.squareNoteDashPatternKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(newValue, forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
     
@@ -1700,9 +1664,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.lineNoteLineWidthKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(NSNumber(value: newValue), forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
     
@@ -1717,9 +1680,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.lineNoteLineStyleKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(NSNumber(value: newValue), forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
     
@@ -1733,9 +1695,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.lineNoteDashPatternKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(newValue, forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
     
@@ -1750,9 +1711,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.lineNoteStartLineStyleKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(NSNumber(value: newValue), forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
     
@@ -1767,9 +1727,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.lineNoteEndLineStyleKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(NSNumber(value: newValue), forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
     
@@ -1784,9 +1743,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.inkNoteLineWidthKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(NSNumber(value: newValue), forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
     
@@ -1801,9 +1759,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.inkNoteLineStyleKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(NSNumber(value: newValue), forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
     
@@ -1817,9 +1774,8 @@ extension KMPreferenceManager {
         set {
             let pKey = KMPreference.inkNoteDashPatternKey
             self.syncDataToPDFView(newValue, forKey: pKey)
-            
-            _ = self.setData(data: newValue, forKey: pKey)
             self._syncDataToUserDefault(newValue, forKey: pKey)
+            _ = self.setData(data: newValue, forKey: pKey)
         }
     }
 }

+ 26 - 10
PDF Office/PDF Reader Pro.xcodeproj/xcuserdata/kdanmobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -847,32 +847,48 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "6D4BD3E7-505F-404D-A95E-5BBCE933EED9"
+            uuid = "67804CA5-D2E4-4EAE-B7B7-6478E95C27B2"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "PDF Master/Class/Document/KMMainDocument.swift"
+            filePath = "PDF Master/Class/PDFWindowController/Side/RightSide/AnnotationProperty/KMGeneralAnnotationViewController.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "174"
-            endingLineNumber = "174"
-            landmarkName = "makeWindowControllers()"
+            startingLineNumber = "601"
+            endingLineNumber = "601"
+            landmarkName = "updateannotationMode()"
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "BA22CC20-2FA1-42FF-9032-1F35A99317E4"
+            uuid = "399B1989-2FCA-4408-9A0E-4EEC63D41879"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "PDF Master/Class/Document/KMMainDocument.swift"
+            filePath = "PDF Master/Class/PDFWindowController/PDFListView/CPDFKitExtensions/CPDFAnnotationExtensions/CPDFAnnotationModel.m"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "183"
-            endingLineNumber = "183"
-            landmarkName = "makeWindowControllers()"
+            startingLineNumber = "1380"
+            endingLineNumber = "1380"
+            landmarkName = "-setFontSize:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "3523360C-AD89-4FEF-AF8C-A8AA3FB85F26"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "PDF Master/Class/PDFWindowController/PDFListView/CPDFKitExtensions/CPDFAnnotationExtensions/CPDFAnnotationModel.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "1337"
+            endingLineNumber = "1337"
+            landmarkName = "-fontSize"
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>