Browse Source

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

tangchao 1 year ago
parent
commit
625fab47ad

+ 32 - 0
PDF Office/PDF Master.xcodeproj/project.pbxproj

@@ -1906,6 +1906,12 @@
 		ADE86ACC2B034CC000414DFA /* KMAddBackgroundView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADE86ACB2B034CC000414DFA /* KMAddBackgroundView.xib */; };
 		ADE86ACD2B034CC000414DFA /* KMAddBackgroundView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADE86ACB2B034CC000414DFA /* KMAddBackgroundView.xib */; };
 		ADE86ACE2B034CC000414DFA /* KMAddBackgroundView.xib in Resources */ = {isa = PBXBuildFile; fileRef = ADE86ACB2B034CC000414DFA /* KMAddBackgroundView.xib */; };
+		ADE86AD12B04BAEA00414DFA /* KMCompareFilesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE86AD02B04BAEA00414DFA /* KMCompareFilesView.swift */; };
+		ADE86AD22B04BAEA00414DFA /* KMCompareFilesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE86AD02B04BAEA00414DFA /* KMCompareFilesView.swift */; };
+		ADE86AD32B04BAEA00414DFA /* KMCompareFilesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE86AD02B04BAEA00414DFA /* KMCompareFilesView.swift */; };
+		ADE86AD62B05A52B00414DFA /* KMCompareFilesConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE86AD52B05A52B00414DFA /* KMCompareFilesConfig.swift */; };
+		ADE86AD72B05A52B00414DFA /* KMCompareFilesConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE86AD52B05A52B00414DFA /* KMCompareFilesConfig.swift */; };
+		ADE86AD82B05A52B00414DFA /* KMCompareFilesConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE86AD52B05A52B00414DFA /* KMCompareFilesConfig.swift */; };
 		ADE8BC2529F7CCA600570F89 /* KMPageNumberDisplayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE8BC2429F7CCA600570F89 /* KMPageNumberDisplayView.swift */; };
 		ADE8BC2629F7CCA600570F89 /* KMPageNumberDisplayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE8BC2429F7CCA600570F89 /* KMPageNumberDisplayView.swift */; };
 		ADE8BC2729F7CCA600570F89 /* KMPageNumberDisplayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADE8BC2429F7CCA600570F89 /* KMPageNumberDisplayView.swift */; };
@@ -4523,6 +4529,8 @@
 		ADE86ABF2B034C7100414DFA /* KMBackgroundWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMBackgroundWindowController.xib; sourceTree = "<group>"; };
 		ADE86AC72B034CB200414DFA /* KMAddBackgroundView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMAddBackgroundView.swift; sourceTree = "<group>"; };
 		ADE86ACB2B034CC000414DFA /* KMAddBackgroundView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMAddBackgroundView.xib; sourceTree = "<group>"; };
+		ADE86AD02B04BAEA00414DFA /* KMCompareFilesView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMCompareFilesView.swift; sourceTree = "<group>"; };
+		ADE86AD52B05A52B00414DFA /* KMCompareFilesConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMCompareFilesConfig.swift; sourceTree = "<group>"; };
 		ADE8BC2429F7CCA600570F89 /* KMPageNumberDisplayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPageNumberDisplayView.swift; sourceTree = "<group>"; };
 		ADE8BC2929F7CDB000570F89 /* KMPageNumberDisplayView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMPageNumberDisplayView.xib; sourceTree = "<group>"; };
 		ADE8BC2E29F8CD7200570F89 /* KMPDFThumbnailModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMPDFThumbnailModel.swift; sourceTree = "<group>"; };
@@ -7528,6 +7536,7 @@
 		ADE86A992B031FB500414DFA /* Compare */ = {
 			isa = PBXGroup;
 			children = (
+				ADE86AD42B05A4E700414DFA /* Model */,
 				ADE86A9A2B031FBC00414DFA /* View */,
 				ADE86A9B2B031FDB00414DFA /* KMCompareWindowController.swift */,
 				ADE86A9C2B031FDB00414DFA /* KMCompareWindowController.xib */,
@@ -7538,6 +7547,7 @@
 		ADE86A9A2B031FBC00414DFA /* View */ = {
 			isa = PBXGroup;
 			children = (
+				ADE86ACF2B04BAC800414DFA /* CompareFilesView */,
 				ADE86AA32B031FF000414DFA /* KMCompareView.swift */,
 				ADE86AA72B031FFA00414DFA /* KMCompareView.xib */,
 			);
@@ -7582,6 +7592,22 @@
 			path = View;
 			sourceTree = "<group>";
 		};
+		ADE86ACF2B04BAC800414DFA /* CompareFilesView */ = {
+			isa = PBXGroup;
+			children = (
+				ADE86AD02B04BAEA00414DFA /* KMCompareFilesView.swift */,
+			);
+			path = CompareFilesView;
+			sourceTree = "<group>";
+		};
+		ADE86AD42B05A4E700414DFA /* Model */ = {
+			isa = PBXGroup;
+			children = (
+				ADE86AD52B05A52B00414DFA /* KMCompareFilesConfig.swift */,
+			);
+			path = Model;
+			sourceTree = "<group>";
+		};
 		ADE8BC2329F7CA5900570F89 /* Views */ = {
 			isa = PBXGroup;
 			children = (
@@ -11912,6 +11938,7 @@
 				BBB1A3A629F6B66400E54E47 /* NSPanel+KMExtension.swift in Sources */,
 				BB3A81AC2AC2A4E4006FC66C /* NSTextView+KMExtension.swift in Sources */,
 				BB65A0802AF8FE7A003A27A0 /* KMBatchOperateRemoveHeaderFooterViewController.swift in Sources */,
+				ADE86AD62B05A52B00414DFA /* KMCompareFilesConfig.swift in Sources */,
 				BB147047299DC0D200784A6A /* OIDServiceConfiguration.m in Sources */,
 				BB89726D294DB67D0045787C /* KMWatermarkAdjectiveBaseView.swift in Sources */,
 				9F1FE4FF29406E4700E952CA /* CTTabStripModel.m in Sources */,
@@ -11943,6 +11970,7 @@
 				BB74DA772AC41182006EDFE7 /* NSFont+KMExtension.swift in Sources */,
 				BB6DD8252934D056001F0544 /* KMSecureEncryptSuccessTipView.swift in Sources */,
 				BB6B43662A04919200E02B54 /* KMBaseViewController.swift in Sources */,
+				ADE86AD12B04BAEA00414DFA /* KMCompareFilesView.swift in Sources */,
 				BB146FCF299DC0D100784A6A /* GTMMIMEDocument.m in Sources */,
 				9F1F82EA2935D02E0092C4B4 /* KMComboBox.swift in Sources */,
 				ADDEEA722AD3EFE200EF675D /* KMButton.swift in Sources */,
@@ -12168,6 +12196,7 @@
 				BB7648ED29ECEEF400931039 /* KMAppearance.swift in Sources */,
 				8997010728F4082C009AF911 /* KMFromViewController.swift in Sources */,
 				AD5999372AD7D9C200412F8B /* KMPropertiesViewPopController.swift in Sources */,
+				ADE86AD72B05A52B00414DFA /* KMCompareFilesConfig.swift in Sources */,
 				9F1F82F329373D6E0092C4B4 /* String+KMExtensions.swift in Sources */,
 				ADDEEA5F2AD39DC500EF675D /* KMSignatureManager.swift in Sources */,
 				9FD0FA4C29D43D6800F2AB0D /* KMDeviceBrowserWindowController.swift in Sources */,
@@ -12858,6 +12887,7 @@
 				BB146FEE299DC0D100784A6A /* GTLRBatchResult.m in Sources */,
 				ADE8BC3C29F9458700570F89 /* KMRecommondManager.m in Sources */,
 				BB897272294DB6BE0045787C /* KMWatermarkAdjectivePlainView.swift in Sources */,
+				ADE86AD22B04BAEA00414DFA /* KMCompareFilesView.swift in Sources */,
 				9F0CB49829683E1000007028 /* KMPropertiesPanelTextSubVC.swift in Sources */,
 				9F1FE4AC29406E4700E952CA /* CTBrowserWindow.m in Sources */,
 				9FF816DE2AFA5B8E0087EFC5 /* KMAnnotationTableViewController.swift in Sources */,
@@ -13145,6 +13175,7 @@
 				BB49ED1B293F4D4E00C82CA2 /* KMConvertCSVSettingView.swift in Sources */,
 				89752E1B2941FD48003FF08E /* KMSearchCellView.swift in Sources */,
 				BB146FC8299DC0D100784A6A /* GTMSessionFetcherService.m in Sources */,
+				ADE86AD82B05A52B00414DFA /* KMCompareFilesConfig.swift in Sources */,
 				BB6DD81E29348F31001F0544 /* KMSecureTextFiled.swift in Sources */,
 				BB2EDF7B296ECE17003BCF58 /* KMPageEditThumbnailItem.swift in Sources */,
 				9FD0FA4D29D43D6800F2AB0D /* KMDeviceBrowserWindowController.swift in Sources */,
@@ -13462,6 +13493,7 @@
 				9F0CB533298656EA00007028 /* KMDesignToken+BorderWidthBottom.swift in Sources */,
 				BB49ED23293F527700C82CA2 /* KMConvertExcelSettingView.swift in Sources */,
 				9F0CB52B298656C900007028 /* KMDesignToken+BorderWidthTop.swift in Sources */,
+				ADE86AD32B04BAEA00414DFA /* KMCompareFilesView.swift in Sources */,
 				ADA9102C2A272CE2003352F0 /* KMEditPDFTextManager.swift in Sources */,
 				BB146FD4299DC0D100784A6A /* GTLRDateTime.m in Sources */,
 				BB5F8A2129BB15AD00365ADB /* KMEmailSubWindowController.m in Sources */,

+ 231 - 0
PDF Office/PDF Master/Class/PDFTools/Compare/Model/KMCompareFilesConfig.swift

@@ -0,0 +1,231 @@
+//
+//  KMCompareFilesConfig.swift
+//  PDF Master
+//
+//  Created by lizhe on 2023/11/16.
+//
+
+import Cocoa
+let PDFCompareISCompareTextFilesKey =  "PDFCompareISCompareTextFiles1"
+let PDFCompareISCompareImageFilesKey = "PDFCompareISCompareImageFiles1"
+let PDFCompareInsertColorFilesKey =    "PDFCompareInsertColorFiles"
+let PDFCompareInsertOpacityFilesKey =    "PDFCompareInsertOpacityFiles"
+let PDFCompareDeleteColorFilesKey =    "PDFCompareDeleteColorFiles"
+let PDFCompareDeleteOpacityFilesKey =    "PDFCompareDeleteOpacityFiles"
+let PDFCompareReplaceColorFilesKey =   "PDFCompareReplaceColorFiles"
+let PDFCompareReplaceOpacityFilesKey =   "PDFCompareReplaceOpacityFiles"
+let PDFCompareOldStrokeColorFilesKey = "PDFCompareOldStrokeColorFiles"
+let PDFCompareNewStrokeColorFilesKey = "PDFCompareNewStrokeColorFiles"
+let PDFCompareNewStrokeOpacityFilesKey = "PDFCompareNewStrokeOpacityFiles"
+let PDFCompareOldStrokeOpacityFilesKey = "PDFCompareOldStrokeOpacityFiles"
+let PDFCompareNewFillOpacityFilesKey = "PDFCompareNewFillOpacityFiles"
+let PDFCompareOldFillOpacityFilesKey = "PDFCompareOldFillOpacityFiles"
+let PDFCompareIsNOFillFilesKey = "PDFCompareIsNOFillFiles"
+let PDFComparePDFBlendModeFilesKey = "PDFComparePDFBlendModeFiles"
+
+class KMCompareFilesConfig {
+
+    static let defaultConfig: KMCompareFilesConfig = KMCompareFilesConfig()
+
+    var fileNewAttribute: KMFileAttribute = KMFileAttribute()
+    var fileOldAttribute: KMFileAttribute = KMFileAttribute()
+    
+    func setColor(_ color: NSColor?, forKey key: String) {
+        let data = color != nil ? NSArchiver.archivedData(withRootObject: color!) : NSArchiver.archivedData(withRootObject: NSColor.red)
+        UserDefaults.standard.set(data, forKey: key)
+    }
+
+    func colorForKey(_ key: String) -> NSColor? {
+        var color: NSColor?
+        if let data = UserDefaults.standard.data(forKey: key) {
+            color = NSUnarchiver.unarchiveObject(with: data) as? NSColor
+        } else if let array = UserDefaults.standard.array(forKey: key), array.count > 0 {
+            var red, green, blue, alpha: CGFloat
+            red =  CGFloat(array[0] as! Double)
+            green = CGFloat(array[0] as! Double)
+            blue = CGFloat(array[0] as! Double)
+            
+            if array.count > 2 {
+                green = CGFloat(array[1] as! Double)
+                blue = CGFloat(array[2] as! Double)
+            }
+            if array.count == 2 {
+                alpha = CGFloat(array[1] as! Double)
+            } else if array.count > 3 {
+                alpha = CGFloat(array[3] as! Double)
+            } else {
+                alpha = 1.0
+            }
+            color = NSColor(calibratedRed: red, green: green, blue: blue, alpha: alpha)
+        }
+        return color
+    }
+
+    func setIsCompareText(_ isCompareText: Bool) {
+        UserDefaults.standard.set(isCompareText, forKey: PDFCompareISCompareTextFilesKey)
+    }
+
+    func isCompareText() -> Bool {
+        return UserDefaults.standard.bool(forKey: PDFCompareISCompareTextFilesKey)
+    }
+
+    func setIsCompareImage(_ isCompareImage: Bool) {
+        UserDefaults.standard.set(isCompareImage, forKey: PDFCompareISCompareImageFilesKey)
+    }
+
+    func isCompareImage() -> Bool {
+        return UserDefaults.standard.bool(forKey: PDFCompareISCompareImageFilesKey)
+    }
+
+    func setInsertColor(_ insertColor: NSColor?) {
+        setColor(insertColor, forKey: PDFCompareInsertColorFilesKey)
+    }
+
+    func insertColor() -> NSColor {
+        guard let color = colorForKey(PDFCompareInsertColorFilesKey) else {
+            return NSColor.green
+        }
+        return color
+    }
+
+    func setInsertOpacity(_ insertOpacity: CGFloat) {
+        UserDefaults.standard.set(insertOpacity, forKey: PDFCompareInsertOpacityFilesKey)
+    }
+
+    func insertOpacity() -> CGFloat {
+        if let value = UserDefaults.standard.value(forKey: PDFCompareInsertOpacityFilesKey) as? CGFloat {
+            return value
+        }
+        return 0.2
+    }
+
+    func setDeleteColor(_ deleteColor: NSColor?) {
+        setColor(deleteColor, forKey: PDFCompareDeleteColorFilesKey)
+    }
+
+    func deleteColor() -> NSColor {
+        guard let color = colorForKey(PDFCompareDeleteColorFilesKey) else {
+            return NSColor.red
+        }
+        return color
+    }
+
+    func setDeleteOpacity(_ deleteOpacity: CGFloat) {
+        UserDefaults.standard.set(deleteOpacity, forKey: PDFCompareDeleteOpacityFilesKey)
+    }
+
+    func deleteOpacity() -> CGFloat {
+        if let value = UserDefaults.standard.value(forKey: PDFCompareDeleteOpacityFilesKey) as? CGFloat {
+            return value
+        }
+        return 0.2
+    }
+
+    func setReplaceColor(_ replaceColor: NSColor?) {
+        setColor(replaceColor, forKey: PDFCompareReplaceColorFilesKey)
+    }
+
+    func replaceColor() -> NSColor {
+        guard let color = colorForKey(PDFCompareReplaceColorFilesKey) else {
+            return NSColor.blue
+        }
+        return color
+    }
+
+    func setReplaceOpacity(_ replaceOpacity: CGFloat) {
+        UserDefaults.standard.set(replaceOpacity, forKey: PDFCompareReplaceOpacityFilesKey)
+    }
+
+    func replaceOpacity() -> CGFloat {
+        if let value = UserDefaults.standard.value(forKey: PDFCompareReplaceOpacityFilesKey) as? CGFloat {
+            return value
+        }
+        return 0.2
+    }
+
+    func setOldStrokeColor(_ oldStrokeColor: NSColor?) {
+        setColor(oldStrokeColor, forKey: PDFCompareOldStrokeColorFilesKey)
+    }
+
+    func oldStrokeColor() -> NSColor {
+        guard let color = colorForKey(PDFCompareOldStrokeColorFilesKey) else {
+            return NSColor(calibratedRed: 245.0/255.0, green: 40.0/255.0, blue: 27.0/255.0, alpha: 1.0)
+        }
+        return color
+    }
+
+    func setNewStrokeColor(_ newStrokeColor: NSColor?) {
+        setColor(newStrokeColor, forKey: PDFCompareNewStrokeColorFilesKey)
+    }
+
+    func newStrokeColor() -> NSColor {
+        guard let color = colorForKey(PDFCompareNewStrokeColorFilesKey) else {
+            return NSColor(calibratedRed: 49.0/255.0, green: 193.0/255.0, blue: 255.0/255.0, alpha: 1.0)
+        }
+        return color
+    }
+
+    func setNewStrokeOpacity(_ newStrokeOpacity: CGFloat) {
+        UserDefaults.standard.set(newStrokeOpacity, forKey: PDFCompareNewStrokeOpacityFilesKey)
+    }
+
+    func newStrokeOpacity() -> CGFloat {
+        if let value = UserDefaults.standard.value(forKey: PDFCompareNewStrokeOpacityFilesKey) as? CGFloat {
+            return value
+        }
+        return 1.0
+    }
+
+    func setOldStrokeOpacity(_ oldStrokeOpacity: CGFloat) {
+        UserDefaults.standard.set(oldStrokeOpacity, forKey: PDFCompareOldStrokeOpacityFilesKey)
+    }
+
+    func oldStrokeOpacity() -> CGFloat {
+        if let value = UserDefaults.standard.value(forKey: PDFCompareOldStrokeOpacityFilesKey) as? CGFloat {
+            return value
+        }
+        return 1.0
+    }
+
+    func setNewFillOpacity(_ newFillOpacity: CGFloat) {
+        UserDefaults.standard.set(newFillOpacity, forKey: PDFCompareNewFillOpacityFilesKey)
+    }
+
+    func newFillOpacity() -> CGFloat {
+        if let value = UserDefaults.standard.value(forKey: PDFCompareNewFillOpacityFilesKey) as? CGFloat {
+            return value
+        }
+        return 1.0
+    }
+
+    func setOldFillOpacity(_ oldFillOpacity: CGFloat) {
+        UserDefaults.standard.set(oldFillOpacity, forKey: PDFCompareOldFillOpacityFilesKey)
+    }
+
+    func oldFillOpacity() -> CGFloat {
+        if let value = UserDefaults.standard.value(forKey: PDFCompareOldFillOpacityFilesKey) as? CGFloat {
+            return value
+        }
+        return 1.0
+    }
+
+    func setIsNOFill(_ isNOFill: Bool) {
+        UserDefaults.standard.set(isNOFill, forKey: PDFCompareIsNOFillFilesKey)
+    }
+
+    func isNOFill() -> Bool {
+        return UserDefaults.standard.bool(forKey: PDFCompareIsNOFillFilesKey)
+    }
+
+    func setBlendMod(_ blendMod: CPDFBlendMode) {
+        UserDefaults.standard.set(blendMod.rawValue, forKey: PDFComparePDFBlendModeFilesKey)
+    }
+
+    func blendMod() -> CPDFBlendMode {
+        if let value = UserDefaults.standard.value(forKey: PDFComparePDFBlendModeFilesKey) as? Int,
+           let blendMode = CPDFBlendMode(rawValue: value) {
+            return blendMode
+        }
+        return CPDFBlendMode.darken
+    }
+}

+ 76 - 0
PDF Office/PDF Master/Class/PDFTools/Compare/View/CompareFilesView/KMCompareFilesView.swift

@@ -0,0 +1,76 @@
+//
+//  KMCompareFilesView.swift
+//  PDF Master
+//
+//  Created by lizhe on 2023/11/15.
+//
+
+import Cocoa
+
+typealias KMCompareFilesViewDragEnteredCallBack = (Bool) -> Void
+typealias KMCompareFilesViewDragSuccessCallBack = (String) -> Void
+typealias KMCompareFilesViewMouseUpCallBack = (KMCompareFilesView) -> Void
+
+class KMCompareFilesView: NSView {
+
+    var dragEnteredBlock: KMCompareFilesViewDragEnteredCallBack?
+    var dragSuccessBlock: KMCompareFilesViewDragSuccessCallBack?
+    var mouseUpBack: KMCompareFilesViewMouseUpCallBack?
+
+    override func awakeFromNib() {
+        super.awakeFromNib()
+        registerForDraggedTypes([NSPasteboard.PasteboardType.fileURL])
+    }
+
+    override func draggingExited(_ sender: NSDraggingInfo?) {
+        if let block = dragEnteredBlock {
+            block(false)
+        }
+    }
+
+    override func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {
+        if let block = dragEnteredBlock {
+            block(true)
+        }
+
+        guard let pboard = sender.draggingPasteboard.propertyList(forType: NSPasteboard.PasteboardType.fileURL) as? [String: Any],
+              let fileNames = pboard[NSPasteboard.PasteboardType.fileURL.rawValue] as? [String],
+              let path = fileNames.first, (path as NSString).pathExtension.lowercased() == "pdf" else {
+            self.layer?.borderColor = NSColor.clear.cgColor
+            return []
+        }
+
+        return NSDragOperation.copy
+    }
+
+    override func prepareForDragOperation(_ sender: NSDraggingInfo) -> Bool {
+        guard let pboard = sender.draggingPasteboard.propertyList(forType: NSPasteboard.PasteboardType.fileURL) as? [String: Any],
+              let fileNames = pboard[NSPasteboard.PasteboardType.fileURL.rawValue] as? [String],
+              let path = fileNames.first, (path as NSString).pathExtension.lowercased() == "pdf" else {
+            return false
+        }
+
+        #if VERSION_DMG
+            // Add code for VERSION_DMG
+        #else
+//            let url = URL(fileURLWithPath: path)
+//            if let bookmarkData = try? url.bookmarkData(options: .withSecurityScope, includingResourceValuesForKeys: nil) {
+//                AppSandboxFileAccess.fileAccess().bookmarkPersistanceDelegate.setBookmarkData(bookmarkData, forURL: url)
+//                AppSandboxFileAccess.fileAccess().bookmarkPersistanceDelegate.setBookmarkData(bookmarkData, forURL: URL(fileURLWithPath: url.path ?? url.absoluteString))
+//            }
+        #endif
+
+        if let block = dragSuccessBlock {
+            block(path)
+        }
+
+        return true
+    }
+
+    override func mouseUp(with event: NSEvent) {
+        super.mouseUp(with: event)
+        if let block = mouseUpBack {
+            block(self)
+        }
+    }
+}

+ 466 - 3
PDF Office/PDF Master/Class/PDFTools/Compare/View/KMCompareView.swift

@@ -9,18 +9,438 @@ import Cocoa
 
 typealias KMCompareViewCancelAction = (_ view: KMCompareView) -> Void
 
+enum KMCompareFilesType {
+    case content
+    case coverting
+}
+
+let CPDFOldFileQKSelectedPathsKey = "CPDFOldFileQKSelectedPathsKey"
+let CPDFNewFileQKSelectedPathsKey = "CPDFNewFileQKSelectedPathsKey"
+let CPDFMaxQKSelectedPathsCount = 5
 
 class KMCompareView: KMBaseXibView {
 
     @IBOutlet weak var cancelButton: NSButton!
     @IBOutlet weak var doneButton: NSButton!
     
+    @IBOutlet weak var compareTypeSegment: NSSegmentedControl!
+    @IBOutlet weak var typeSegWidthConst: NSLayoutConstraint!
+    
+    @IBOutlet weak var comparePreviewBox: NSBox!
+    
+    @IBOutlet weak var oldDocumentsTitle: NSTextField!
+    
+    @IBOutlet weak var compareOldPreviewView: KMCompareFilesView!
+    @IBOutlet weak var oldFileQKSelectedBox: NSComboBox!
+    @IBOutlet weak var oldFileSelectBtn: NSButton!
+    @IBOutlet weak var oldPDFView: PDFView!
+    @IBOutlet weak var currentOldPageLabel: NSTextField!
+    @IBOutlet weak var totalPaOldgeLabel: NSTextField!
+    
+    @IBOutlet weak var compareNewPreviewView: KMCompareFilesView!
+    @IBOutlet weak var documentsNewTitle: NSTextField!
+    @IBOutlet weak var fileQKNewSelectedBox: NSComboBox!
+    @IBOutlet weak var fileSelectNewBtn: NSButton!
+    @IBOutlet weak var pdfNewView: PDFView!
+    @IBOutlet weak var addFileContentView: KMCompareFilesView!
+    @IBOutlet weak var addFileImageView: NSImageView!
+    @IBOutlet weak var addFileAddImageFramView: KMCompareFilesView!
+    @IBOutlet weak var currentNewPageLabel: NSTextField!
+    @IBOutlet weak var totalPaNewgeLabel: NSTextField!
+    
+    @IBOutlet weak var addFileTitle: NSTextField!
+    @IBOutlet weak var addFileMag: NSTextField!
+    
+    @IBOutlet weak var pageRangeField: NSTextField!
+    @IBOutlet weak var oldFileRangeField: NSTextField!
+    @IBOutlet weak var pageRangeOldComboBox: NSComboBox!
+    @IBOutlet weak var fileNewRangeField: NSTextField!
+    @IBOutlet weak var pageRangeNewComboBox: NSComboBox!
+    
+    @IBOutlet weak var compareTextTypeBtn: NSButton!
+    @IBOutlet weak var compareImageTypeBtn: NSButton!
+    
+    @IBOutlet weak var compareSettingsBtn: NSButton!
+    @IBOutlet weak var settingBtnTopLayout: NSLayoutConstraint!
+    
+    var pdfCompareContent: CPDFCompareContent?
+    
+    
+    var pdfOldDocument: PDFDocument?
+    var oldFileQKSelectedPaths: [String] = []
+    
+    var pdfNewDocument: PDFDocument?
+    var fileQKNewSelectedPaths: [String] = []
+    
+    var fileType: KMCompareFilesType = .content
     var cancelAction: KMCompareViewCancelAction?
     
-    override func draw(_ dirtyRect: NSRect) {
-        super.draw(dirtyRect)
+    convenience init(pdfDocument: PDFDocument) {
+        self.init()
+        self.pdfOldDocument = pdfDocument
+        let document: CPDFDocument = CPDFDocument.init(url: pdfDocument.documentURL)
+        
+        let file: KMFileAttribute = KMFileAttribute()
+        file.pdfDocument = document
+        
+        let config: KMCompareFilesConfig = KMCompareFilesConfig.init()
+        config.fileOldAttribute = file
+    }
+    
+    convenience init(filePath: String, password: String) {
+        self.init()
+        self.pdfOldDocument = PDFDocument.init(url: NSURL(fileURLWithPath: filePath) as URL)
+        let pdfDocument = CPDFDocument.init(url: NSURL(fileURLWithPath: filePath) as URL)
+        if pdfDocument!.isLocked {
+            pdfDocument!.unlock(withPassword: password)
+        }
+        
+        if self.pdfOldDocument!.isLocked {
+            self.pdfOldDocument!.unlock(withPassword: password)
+        }
+        
+        let file: KMFileAttribute = KMFileAttribute()
+        file.pdfDocument = pdfDocument
+        
+        let config = KMCompareFilesConfig.defaultConfig
+        config.fileOldAttribute = file
+        config.fileOldAttribute.password = password
+        
+    }
+    
+    override func setup() {
+        fileQKNewSelectedBox.delegate = self
+        oldFileQKSelectedBox.delegate = self
+        
+        compareTypeSegment.action =  #selector(segmentedControlClicked)
+        compareTypeSegment.target = self
+        
+        compareTypeSegment.wantsLayer = true
+        addFileContentView.wantsLayer = true
+        
+        addFileImageView.ignoresMultiClick = true
+        
+        fileQKNewSelectedBox.isEnabled = false
+        oldFileQKSelectedBox.isEnabled = false
+        fileQKNewSelectedBox.cell!.isEnabled = false
+        oldFileQKSelectedBox.cell!.isEnabled = false
+        
+        currentOldPageLabel.delegate = self
+        currentNewPageLabel.delegate = self
+        
+        oldPDFView.wantsLayer = true
+        pdfNewView.wantsLayer = true
+//        vsMaskView.wantsLayer = true;
+        oldPDFView.layer?.backgroundColor = NSColor.clear.cgColor
+        pdfNewView.layer?.backgroundColor = NSColor.clear.cgColor
+//        vsMaskView.layer.backgroundColor = NSColor.clear.CGColor
+        
+        compareTypeSegment.wantsLayer = true
+        compareTypeSegment.layer?.cornerRadius = 5.0
+        compareTypeSegment.layer?.masksToBounds = true
+        compareTypeSegment.layer?.backgroundColor = NSColor.clear.cgColor
+        addFileContentView.wantsLayer = true
+        
+        addFileAddImageFramView.wantsLayer = true
+        addFileAddImageFramView.layer?.backgroundColor = NSColor.clear.cgColor
+        
+        self.compareOldPreviewView.dragSuccessBlock = { [unowned self] filePath in
+            self.updateDocument(filePath: filePath) { fileAttitude in
+                
+            }
+        }
+        
+        self.compareNewPreviewView.dragSuccessBlock = { [unowned self] filePath in
+            self.updateDocument(filePath: filePath, isNew: true) { fileAttitude in
+                
+            }
+        }
+        
+        self.addFileContentView.dragSuccessBlock = { [unowned self] filePath in
+            self.updateDocument(filePath: filePath, isNew: true) { fileAttitude in
+                
+            }
+        }
+        
+        self.addFileAddImageFramView.dragSuccessBlock = { [unowned self] filePath in
+            self.updateDocument(filePath: filePath, isNew: true) { fileAttitude in
+                
+            }
+        }
+        
+        self.addFileContentView.mouseUpBack = { [unowned self] view in
+            self.chooseFileAction()
+        }
+    }
+    
+    override func updateLanguage() {
+        compareTypeSegment.setLabel(NSLocalizedString("Side-by-Side View", comment: ""), forSegment: 0)
+        compareTypeSegment.setLabel(NSLocalizedString("Compare by File Overlay", comment: ""), forSegment: 1)
+        
+        compareTypeSegment.setToolTip(NSLocalizedString("Side-by-Side View", comment: ""), forSegment: 0)
+        compareTypeSegment.setToolTip(NSLocalizedString("Compare by File Overlay", comment: ""), forSegment: 1)
+
+        oldDocumentsTitle.stringValue = NSLocalizedString("Old File", comment: "")
+        documentsNewTitle.stringValue = NSLocalizedString("New File", comment: "")
+        
+        oldFileSelectBtn.title = NSLocalizedString("Choose...", comment: "")
+        fileSelectNewBtn.title = NSLocalizedString("Choose...", comment: "")
+        
+        oldFileSelectBtn.toolTip = NSLocalizedString("Choose...", comment: "")
+        fileSelectNewBtn.toolTip = NSLocalizedString("Choose...", comment: "")
+            
+        addFileTitle.stringValue = NSLocalizedString("Select File", comment: "")
+        addFileMag.stringValue = NSLocalizedString("Click to add", comment: "")
+        
+        oldFileRangeField.stringValue = NSLocalizedString("Old File:", comment: "")
+        fileNewRangeField.stringValue = NSLocalizedString("New File:", comment: "")
+        
+        pageRangeField.stringValue = NSLocalizedString("Page Range", comment: "")
+        
+        pageRangeOldComboBox.removeAllItems()
+        pageRangeOldComboBox.addItems(withObjectValues: [NSLocalizedString("All Pages", comment: ""),
+                                                              NSLocalizedString("Odd Pages Only", comment: ""),
+                                                              NSLocalizedString("Even Pages Only",comment: ""),
+                                                              NSLocalizedString("e.g. 1,3-5,10",comment: "")])
+        pageRangeOldComboBox.placeholderString = NSLocalizedString("e.g. 1,3-5,10", comment: "")
+        
+        pageRangeNewComboBox.addItems(withObjectValues: [NSLocalizedString("All Pages", comment: ""),
+                                                              NSLocalizedString("Odd Pages Only", comment: ""),
+                                                              NSLocalizedString("Even Pages Only",comment: ""),
+                                                              NSLocalizedString("e.g. 1,3-5,10",comment: "")])
+        self.pageRangeNewComboBox.placeholderString = NSLocalizedString("e.g. 1,3-5,10", comment: "")
+        
+        self.compareTextTypeBtn.title = NSLocalizedString("Compare text", comment: "")
+        self.compareImageTypeBtn.title = NSLocalizedString("Compare image", comment: "")
+        
+        let settingsString = "  " + NSLocalizedString("Settings", comment: "")
+        compareSettingsBtn.title = settingsString
+        compareSettingsBtn.state = .off
+        compareSettingsBtn.setTitleColor(KMAppearance.Layout.h1Color())
+        
+        cancelButton.title = NSLocalizedString("Cancel", comment: "")
+        doneButton.title = NSLocalizedString("Compare", comment: "")
+    }
+    
+    override func updateUI() {
+        if KMAppearance.isDarkMode() {
+            self.compareTypeSegment.layer?.backgroundColor = NSColor(red: 50.0/255.0, green: 53.0/255.0, blue: 54.0/255.0, alpha: 1).cgColor
+            self.addFileContentView.layer?.backgroundColor = NSColor.black.cgColor
+        } else {
+            self.compareTypeSegment.layer?.backgroundColor = NSColor(red: 247.0/255.0, green: 247.0/255.0, blue: 247.0/255.0, alpha: 1).cgColor
+            self.addFileContentView.layer?.backgroundColor = NSColor.white.cgColor
+        }
+    }
+    
+    override func reloadData() {
+        if(pageRangeOldComboBox.indexOfSelectedItem == 3) {
+            self.window?.makeFirstResponder(pageRangeOldComboBox)
+            pageRangeOldComboBox.stringValue = ""
+            pageRangeOldComboBox.isSelectable = true
+        }
+        
+        self.updatePageRangeData(view: pageRangeNewComboBox, file: KMCompareFilesConfig.defaultConfig.fileNewAttribute, isNew: true)
+        self.updatePageRangeData(view: pageRangeOldComboBox, file: KMCompareFilesConfig.defaultConfig.fileOldAttribute)
+        
+        if (KMCompareFilesConfig.defaultConfig.isCompareText)() {
+            self.compareTextTypeBtn.state = .on;
+        } else {
+            self.compareTextTypeBtn.state = .off;
+        }
+        if (KMCompareFilesConfig.defaultConfig.isCompareImage)() {
+            self.compareImageTypeBtn.state = .on;
+        } else {
+            self.compareImageTypeBtn.state = .off;
+        }
+        
+        self.updateSelectBoxData()
+        
+        self.updatePageState()
+        self.updatePageState(isNew: true)
+    }
+}
+
+extension KMCompareView {
+    func addFileQKSelectPath(filePath: String, isNewFile: Bool = false) {
+        let pdfdocument = CPDFDocument(url: NSURL(fileURLWithPath: filePath) as URL)
+        guard let pdfdocument = pdfdocument else { return }
+        
+        var key = ""
+        if isNewFile {
+            key = CPDFNewFileQKSelectedPathsKey
+        } else {
+            key = CPDFOldFileQKSelectedPathsKey
+        }
+        
+        var filePaths: [String] = UserDefaults.standard.object(forKey: key) as? [String] ?? []
+        if filePaths.count > CPDFMaxQKSelectedPathsCount {
+            filePaths.removeLast()
+            
+        }
+        filePaths.insert(filePath, at: 0)
+    }
+    
+    func updateSelectBoxData() {
+        self.oldFileQKSelectedPaths = self.updateSelectBoxItemData()
+        self.oldFileQKSelectedBox.removeAllItems()
+        self.oldFileQKSelectedBox.addItems(withObjectValues: self.oldFileQKSelectedPaths)
+        
+        self.fileQKNewSelectedPaths = self.updateSelectBoxItemData(isNew: true)
+        self.fileQKNewSelectedBox.removeAllItems()
+        self.fileQKNewSelectedBox.addItems(withObjectValues: self.fileQKNewSelectedPaths)
+        
+        if self.fileQKNewSelectedPaths.count > 0 {
+            self.fileQKNewSelectedBox.isEnabled = true
+        } else {
+            self.fileQKNewSelectedBox.isEnabled = false
+        }
+    }
+    
+    func updateSelectBoxItemData(isNew: Bool = false) -> [String] {
+        let defaults = UserDefaults.standard
+        var fileSelectedCachePaths: [String] = []
+        if isNew {
+            fileSelectedCachePaths = defaults.value(forKey: CPDFOldFileQKSelectedPathsKey) as? [String] ?? []
+        } else {
+            fileSelectedCachePaths = defaults.value(forKey: CPDFNewFileQKSelectedPathsKey) as? [String] ?? []
+        }
+        
+        var fileSelectedPaths: [String] = []
 
-        // Drawing code here.
+        let fileManager = FileManager.default
+        for path in fileSelectedCachePaths {
+            if fileManager.fileExists(atPath: path) {
+//                #if VERSION_DMG
+                fileSelectedPaths.append(path)
+//                #else
+//                let url = URL(fileURLWithPath: path)
+//                
+//                if let bookmarkData = try? url.bookmarkData(options: .withSecurityScope, includingResourceValuesForKeys: nil) {
+//                    AppSandboxFileAccess.fileAccess().bookmarkPersistanceDelegate.setBookmarkData(bookmarkData, forURL: url)
+//                    AppSandboxFileAccess.fileAccess().bookmarkPersistanceDelegate.setBookmarkData(bookmarkData, forURL: URL(fileURLWithPath: url.path ?? url.absoluteString))
+//                    
+//                    fileOldSelectedPaths.append(path)
+//                } else {
+//                    AppSandboxFileAccess.fileAccess().accessFileURL(url, persistPermission: yearMask) {
+//                        if let bookmarkData = try? url.bookmarkData(options: .withSecurityScope, includingResourceValuesForKeys: nil) {
+//                            fileOldSelectedPaths.append(path)
+//                        }
+//                    }
+//                }
+//                #endif
+            }
+        }
+        return fileSelectedPaths
+    }
+    
+    func updatePageState(isNew: Bool = false) {
+        var pageDocument = PDFDocument()
+        var pdfView = PDFView()
+        var currentPageLabel = NSTextField()
+        var totalPageLabel = NSTextField()
+        
+        guard let pdfNewDocument = pdfNewDocument else { return }
+        guard let pdfOldDocument = pdfOldDocument else { return }
+        
+        if isNew {
+            pageDocument = pdfNewDocument
+            pdfView = pdfNewView
+            currentPageLabel = currentNewPageLabel
+            totalPageLabel = totalPaNewgeLabel
+        } else {
+            pageDocument = pdfOldDocument
+            pdfView = oldPDFView
+            currentPageLabel = currentOldPageLabel
+            totalPageLabel = totalPaOldgeLabel
+        }
+        // 隐藏PDFView滑动条
+        pdfView.documentView?.enclosingScrollView?.hasVerticalScroller = false
+        pdfView.documentView?.enclosingScrollView?.hasHorizontalScroller = false
+        let pageCount = pageDocument.pageCount
+        var currentPageIndex = 0
+        if(pdfView.currentPage != nil) {
+            currentPageIndex = pageDocument.index(for: pdfView.currentPage!)
+        }
+        
+        if(pageCount > 0) {
+            currentPageLabel.stringValue = "\(currentPageIndex + 1)"
+        } else {
+            currentPageLabel.stringValue = "\(currentPageIndex)"
+        }
+        totalPageLabel.stringValue = "/ \(pageCount)"
+    }
+    
+    func updateDocument(filePath: String, isNew: Bool = false, completion: @escaping (_ fileAttitude: KMFileAttribute?) -> Void) {
+        var pdfDocument = CPDFDocument()
+        if isNew {
+            pdfDocument = KMCompareFilesConfig.defaultConfig.fileOldAttribute.pdfDocument ?? CPDFDocument()
+        } else {
+            pdfDocument = KMCompareFilesConfig.defaultConfig.fileNewAttribute.pdfDocument ?? CPDFDocument()
+        }
+        
+        guard let pdfDocument = pdfDocument else {
+            completion(nil)
+            return
+        }
+        if (pdfDocument.documentURL.path == filePath) {
+            let alert = NSAlert()
+            alert.alertStyle = NSAlert.Style.critical
+            alert.messageText = NSLocalizedString("There is no difference between the two documents.", comment: "")
+            alert.runModal()
+            completion(nil)
+            return
+        } else {
+            KMBaseWindowController.checkPassword(url: NSURL(fileURLWithPath: filePath) as URL) { success, resultPassword in
+                if success {
+                    let file = KMFileAttribute()
+                    file.pdfDocument = pdfDocument
+                    file.password = resultPassword
+                    completion(file)
+                } else {
+                    completion(nil)
+                }
+            }
+        }
+    }
+    
+    func updatePageRangeData(view: NSComboBox, file: KMFileAttribute, isNew: Bool = false) {
+        switch (file.pagesType) {
+        case .all:
+            view.selectItem(at: 0)
+            view.isEditable = false
+            view.delegate = nil
+            break;
+        case .odd:
+            view.selectItem(at: 1)
+            view.isEditable = false
+            view.delegate = nil
+            break;
+            case .even:
+            view.selectItem(at: 2)
+            view.isEditable = false
+            view.delegate = nil
+            break;
+        case .custom:
+            view.delegate = self
+            view.stringValue = file.pagesString
+            view.isEditable = true
+                break;
+        default: break
+        }
+    }
+    
+    func updateFileCompareType(fileType: KMCompareFilesType) {
+        if fileType == .content {
+            compareTypeSegment.selectedSegment = 0
+            compareTextTypeBtn.isHidden = false
+            compareImageTypeBtn.isHidden = false
+            settingBtnTopLayout.constant = 81
+        } else {
+            compareTypeSegment.selectedSegment = 1
+            compareTextTypeBtn.isHidden = true
+            compareImageTypeBtn.isHidden = true
+            settingBtnTopLayout.constant = 20
+        }
     }
 }
 
@@ -34,4 +454,47 @@ extension KMCompareView {
     @IBAction func convertButtonAction(_ sender: Any) {
         
     }
+    
+    @objc func segmentedControlClicked(sender: NSSegmentedControl) {
+        
+    }
+    
+    func chooseFileAction(isNew: Bool = false) {
+//        fileQKNewSelectedBox.resignFirstResponder()
+        self.window?.makeFirstResponder(nil)
+
+        let openPanel = NSOpenPanel()
+        openPanel.allowedFileTypes = ["pdf"]
+        openPanel.allowsMultipleSelection = false
+        openPanel.beginSheetModal(for: self.window!) { (result) in
+            if result == NSApplication.ModalResponse.OK {
+                #if VERSION_DMG
+                    // Add code for VERSION_DMG
+                #else
+//                    if let url = openPanel.url {
+//                        do {
+//                            let bookmarkData = try url.bookmarkData(options: .withSecurityScope, includingResourceValuesForKeys: nil)
+//                            AppSandboxFileAccess.fileAccess().bookmarkPersistanceDelegate.setBookmarkData(bookmarkData, forURL: url)
+//                            AppSandboxFileAccess.fileAccess().bookmarkPersistanceDelegate.setBookmarkData(bookmarkData, forURL: URL(fileURLWithPath: url.path ?? url.absoluteString))
+//                        } catch {
+//                            // Handle error
+//                            print("Error creating bookmark data: \(error)")
+//                        }
+//                    }
+                #endif
+
+                if let filePath = openPanel.url?.path {
+                    self.updateDocument(filePath: filePath, isNew: isNew) { file in
+                        
+                    }
+                }
+            }
+        }
+
+    }
+}
+
+
+extension KMCompareView: NSComboBoxDelegate {
+    
 }

+ 37 - 6
PDF Office/PDF Master/Class/PDFTools/Compare/View/KMCompareView.xib

@@ -9,8 +9,39 @@
     <objects>
         <customObject id="-2" userLabel="File's Owner" customClass="KMCompareView" customModule="PDF_Master" customModuleProvider="target">
             <connections>
+                <outlet property="addFileAddImageFramView" destination="7T1-FJ-wtx" id="tPU-4J-IZd"/>
+                <outlet property="addFileContentView" destination="dU9-33-2cR" id="J7c-AP-uVZ"/>
+                <outlet property="addFileImageView" destination="LcR-ou-ANf" id="gcB-TA-0SA"/>
+                <outlet property="addFileMag" destination="3tv-r9-A6A" id="8bu-nJ-QnP"/>
+                <outlet property="addFileTitle" destination="Al8-hK-b6M" id="Rcc-KI-Hm9"/>
                 <outlet property="cancelButton" destination="VOf-35-kbQ" id="tzY-0g-1UZ"/>
+                <outlet property="compareImageTypeBtn" destination="Ry6-fx-Lsg" id="MKN-Dt-OAB"/>
+                <outlet property="compareNewPreviewView" destination="E6w-5x-3SO" id="iPv-jr-XwE"/>
+                <outlet property="compareOldPreviewView" destination="q2P-Ek-w51" id="ogk-N4-hbt"/>
+                <outlet property="comparePreviewBox" destination="Tju-1r-2vu" id="fzz-hk-rrR"/>
+                <outlet property="compareSettingsBtn" destination="ZWD-eI-OAU" id="bB2-Z7-9TS"/>
+                <outlet property="compareTextTypeBtn" destination="JAe-WW-HE0" id="mNJ-hx-LqZ"/>
+                <outlet property="compareTypeSegment" destination="Rea-rR-HQ2" id="k45-NN-wNZ"/>
+                <outlet property="currentNewPageLabel" destination="yVn-S7-pqM" id="IIj-e0-0mZ"/>
+                <outlet property="currentOldPageLabel" destination="GmQ-4n-VBd" id="SKg-Yf-Tgi"/>
+                <outlet property="documentsNewTitle" destination="CD7-aX-zab" id="5zZ-si-v3C"/>
                 <outlet property="doneButton" destination="8AD-rt-IgJ" id="xMG-Jd-7Ab"/>
+                <outlet property="fileNewRangeField" destination="H4A-gF-NRQ" id="Ftp-Y2-1DK"/>
+                <outlet property="fileQKNewSelectedBox" destination="uZv-wi-QyT" id="gNX-A6-s9A"/>
+                <outlet property="fileSelectNewBtn" destination="WSb-Q2-D3m" id="QNK-Fa-wDF"/>
+                <outlet property="oldDocumentsTitle" destination="kRr-R4-sGx" id="0sv-TO-70t"/>
+                <outlet property="oldFileQKSelectedBox" destination="jih-HW-8sA" id="NQ4-El-gOw"/>
+                <outlet property="oldFileRangeField" destination="PHA-ai-rJB" id="y8a-8f-V2L"/>
+                <outlet property="oldFileSelectBtn" destination="8h1-sv-nB8" id="i2E-kr-M8p"/>
+                <outlet property="oldPDFView" destination="jw7-gN-Ept" id="Mgz-GR-zoT"/>
+                <outlet property="pageRangeField" destination="cIk-7j-jC4" id="569-Dw-7uJ"/>
+                <outlet property="pageRangeNewComboBox" destination="edF-Wi-Can" id="F4f-yj-ecc"/>
+                <outlet property="pageRangeOldComboBox" destination="ItG-Sw-aXB" id="6S9-8T-Mq9"/>
+                <outlet property="pdfNewView" destination="O7G-En-YRx" id="bv9-cK-RJi"/>
+                <outlet property="settingBtnTopLayout" destination="kBr-3k-Ptc" id="eLk-wf-rDS"/>
+                <outlet property="totalPaNewgeLabel" destination="K8d-Wm-kVV" id="Xvz-C5-Aph"/>
+                <outlet property="totalPaOldgeLabel" destination="r1D-8W-ibR" id="4Eh-Qg-Fxo"/>
+                <outlet property="typeSegWidthConst" destination="jXd-Aa-UGk" id="ZU4-sL-okz"/>
             </connections>
         </customObject>
         <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
@@ -44,7 +75,7 @@
                                         <rect key="frame" x="0.0" y="0.0" width="490" height="395"/>
                                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                     </customView>
-                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="q2P-Ek-w51" customClass="PDFCompareFilesView">
+                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="q2P-Ek-w51" customClass="KMCompareFilesView" customModule="PDF_Master" customModuleProvider="target">
                                         <rect key="frame" x="10" y="16" width="204" height="352"/>
                                         <subviews>
                                             <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="kRr-R4-sGx">
@@ -59,7 +90,7 @@
                                                     <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                                                 </textFieldCell>
                                             </textField>
-                                            <comboBox focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="jih-HW-8sA" customClass="CPDFCompareComboBox">
+                                            <comboBox focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="jih-HW-8sA">
                                                 <rect key="frame" x="0.0" y="297" width="129" height="23"/>
                                                 <constraints>
                                                     <constraint firstAttribute="height" constant="20" id="3hW-jQ-ebr"/>
@@ -180,7 +211,7 @@
                                             <constraint firstItem="jw7-gN-Ept" firstAttribute="top" secondItem="jih-HW-8sA" secondAttribute="bottom" constant="10" id="wwo-3R-2ff"/>
                                         </constraints>
                                     </customView>
-                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="E6w-5x-3SO" customClass="PDFCompareFilesView">
+                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="E6w-5x-3SO" customClass="KMCompareFilesView" customModule="PDF_Master" customModuleProvider="target">
                                         <rect key="frame" x="276" y="16" width="204" height="352"/>
                                         <subviews>
                                             <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="CD7-aX-zab">
@@ -195,7 +226,7 @@
                                                     <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                                                 </textFieldCell>
                                             </textField>
-                                            <comboBox focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="uZv-wi-QyT" customClass="CPDFCompareComboBox">
+                                            <comboBox focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="uZv-wi-QyT">
                                                 <rect key="frame" x="0.0" y="297" width="129" height="23"/>
                                                 <constraints>
                                                     <constraint firstAttribute="width" constant="125" id="Or4-M7-RFg"/>
@@ -225,7 +256,7 @@
                                                     <constraint firstAttribute="height" constant="254" id="lYe-PP-dsH"/>
                                                 </constraints>
                                             </pdfView>
-                                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="dU9-33-2cR" customClass="PDFCompareFilesView">
+                                            <customView translatesAutoresizingMaskIntoConstraints="NO" id="dU9-33-2cR" customClass="KMCompareFilesView" customModule="PDF_Master" customModuleProvider="target">
                                                 <rect key="frame" x="5" y="35" width="194" height="254"/>
                                                 <subviews>
                                                     <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="LcR-ou-ANf">
@@ -260,7 +291,7 @@
                                                             <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                                                         </textFieldCell>
                                                     </textField>
-                                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="7T1-FJ-wtx" customClass="PDFCompareFilesView">
+                                                    <customView translatesAutoresizingMaskIntoConstraints="NO" id="7T1-FJ-wtx" customClass="KMCompareFilesView" customModule="PDF_Master" customModuleProvider="target">
                                                         <rect key="frame" x="49" y="105" width="96" height="96"/>
                                                     </customView>
                                                 </subviews>