Browse Source

【综合】合并代码

tangchao 1 year ago
parent
commit
240abc2af1
52 changed files with 2361 additions and 1862 deletions
  1. 4 0
      PDF Office/PDF Master.xcodeproj/project.pbxproj
  2. 40 0
      PDF Office/PDF Master.xcodeproj/xcuserdata/kdanmobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
  3. 1013 1421
      PDF Office/PDF Master.xcodeproj/xcuserdata/lizhe.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
  4. 65 30
      PDF Office/PDF Master/AppDelegate.swift
  5. 2 1
      PDF Office/PDF Master/Class/ChromiumTabs/KMToolbarRightView.swift
  6. 26 1
      PDF Office/PDF Master/Class/Home/ViewController/KMHomeViewController+Action.swift
  7. 27 1
      PDF Office/PDF Master/Class/Home/ViewController/KMHomeViewController+UI.swift
  8. 13 9
      PDF Office/PDF Master/Class/Home/WindowController/KMAITranslationConfirmWindowController.swift
  9. 22 22
      PDF Office/PDF Master/Class/KMLightMember/Config/KMLightMemberConfig.swift
  10. 6 2
      PDF Office/PDF Master/Class/KMLightMember/Controller/AccountInfo/KMAccountInfoWindowController.swift
  11. 7 3
      PDF Office/PDF Master/Class/KMLightMember/Controller/AccountInfo/View/KMAccountInfoView.swift
  12. 30 35
      PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/KMComparativeTableViewController.swift
  13. 1 10
      PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/Source/KMCompatative.xcassets/remove watermark.imageset/Contents.json
  14. 26 26
      PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/Source/KMCompatative.xcassets/remove watermark.imageset/remove watermark.pdf
  15. 22 10
      PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/View/KMComparativeView/KMComparativeView.swift
  16. 14 14
      PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/View/KMComparativeView/KMComparativeView.xib
  17. 31 0
      PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/View/KMComparativeView/View/KMComparativeGradientView.swift
  18. 3 1
      PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/View/KMComparativeView/View/KMComparativeViewCollectionItem.swift
  19. 13 14
      PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/View/KMComparativeView/View/KMComparativeViewCollectionItem.xib
  20. 12 8
      PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/View/KMComparativeView/View/KMComparativeViewCollectionItemItem.swift
  21. 2 2
      PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/View/KMComparativeView/View/KMComparativeViewCollectionItemItem.xib
  22. 5 1
      PDF Office/PDF Master/Class/KMLightMember/Controller/Login&Register/View/KMLoginLeftImageView.swift
  23. 15 4
      PDF Office/PDF Master/Class/KMLightMember/Controller/Login&Register/View/KMRegisterSuccessView.swift
  24. 16 22
      PDF Office/PDF Master/Class/KMLightMember/Controller/Login&Register/View/KMRegisterSuccessView.xib
  25. 71 30
      PDF Office/PDF Master/Class/KMLightMember/Controller/SubscriptionView/WaterMark/KMSubscribeWaterMarkWindowController.swift
  26. 4 4
      PDF Office/PDF Master/Class/KMLightMember/Controller/SubscriptionView/WaterMark/KMSubscribeWaterMarkWindowController.xib
  27. 50 27
      PDF Office/PDF Master/Class/KMLightMember/Controller/SubscriptionView/WaterMark/View/KMSubscribeWaterMarkView.swift
  28. 14 0
      PDF Office/PDF Master/Class/KMLightMember/Controller/SubscriptionView/WaterMark/View/KMSubscribeWaterMarkView.xib
  29. 63 38
      PDF Office/PDF Master/Class/KMLightMember/InAppPurchase/Appstore/KMInAppPurchaseManager.swift
  30. 30 0
      PDF Office/PDF Master/Class/KMLightMember/InAppPurchase/DMG/KMDMGPurchaseManager.swift
  31. 14 31
      PDF Office/PDF Master/Class/KMLightMember/InAppPurchase/KMPurchaseManager.swift
  32. 13 3
      PDF Office/PDF Master/Class/KMLightMember/Manager/KMLightMemberManager.swift
  33. 4 4
      PDF Office/PDF Master/Class/KMLightMember/Model/KMLightMemberUserInfo.swift
  34. 12 0
      PDF Office/PDF Master/Class/KMLightMember/Source/KMLightMember.xcassets/Image_PopupDMG.imageset/Contents.json
  35. BIN
      PDF Office/PDF Master/Class/KMLightMember/Source/KMLightMember.xcassets/Image_PopupDMG.imageset/Popup dmg.pdf
  36. 12 0
      PDF Office/PDF Master/Class/KMLightMember/Source/KMLightMember.xcassets/image_PopupAppstore.imageset/Contents.json
  37. BIN
      PDF Office/PDF Master/Class/KMLightMember/Source/KMLightMember.xcassets/image_PopupAppstore.imageset/Popup Appstore.pdf
  38. 124 27
      PDF Office/PDF Master/Class/Merge/OCPart/KMPDFEditAppendWindow.m
  39. 17 16
      PDF Office/PDF Master/Class/Merge/OCPart/KMPDFEditAppendWindow.xib
  40. 62 2
      PDF Office/PDF Master/Class/PDFTools/Convert/Controller/KMConvertBaseWindowController.swift
  41. 102 26
      PDF Office/PDF Master/Class/PDFTools/PageEdit/Controller/KMPDFEditViewController.swift
  42. 2 1
      PDF Office/PDF Master/Class/PDFTools/PageEdit/View/KMPageEditSplitSettingView.swift
  43. 3 3
      PDF Office/PDF Master/Class/PDFTools/PageEdit/View/KMPageEditThumbnailItem.xib
  44. 6 0
      PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Search/KMSearchViewController.swift
  45. 136 1
      PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Thumbnail/Base/KMPDFThumbViewBaseController.swift
  46. 4 0
      PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Thumbnail/KMPDFThumbnailView.swift
  47. 69 6
      PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Thumbnail/KMThumbnailViewController.swift
  48. 8 0
      PDF Office/PDF Master/Class/PDFWindowController/Toolbar/KMToolbarController.swift
  49. 7 0
      PDF Office/PDF Master/Class/PDFWindowController/Toolbar/KMToolbarViewController.swift
  50. 85 2
      PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift
  51. 30 0
      PDF Office/PDF Master/Class/PDFWindowController/ViewController/KMMainViewController+MenuAction.swift
  52. 4 4
      PDF Office/PDF Master/Strings/en.lproj/Localizable.strings

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

@@ -1267,6 +1267,7 @@
 		AD53B70529ACC65500D61E81 /* KMMailHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = AD53B70429ACC65500D61E81 /* KMMailHelper.m */; };
 		AD53B70629ACC65500D61E81 /* KMMailHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = AD53B70429ACC65500D61E81 /* KMMailHelper.m */; };
 		AD53B70729ACC65500D61E81 /* KMMailHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = AD53B70429ACC65500D61E81 /* KMMailHelper.m */; };
+		AD6218D42A7D29F40088475C /* KMComparativeGradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD6218D32A7D29F40088475C /* KMComparativeGradientView.swift */; };
 		AD68782129A5FADC005B5210 /* KMLightMemberCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD68782029A5FADC005B5210 /* KMLightMemberCache.swift */; };
 		AD68782229A5FADC005B5210 /* KMLightMemberCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD68782029A5FADC005B5210 /* KMLightMemberCache.swift */; };
 		AD68782329A5FADC005B5210 /* KMLightMemberCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD68782029A5FADC005B5210 /* KMLightMemberCache.swift */; };
@@ -4093,6 +4094,7 @@
 		AD53B6FD29AC5FCD00D61E81 /* KMLightMemberToken.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMLightMemberToken.swift; sourceTree = "<group>"; };
 		AD53B70329ACC65500D61E81 /* KMMailHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMMailHelper.h; sourceTree = "<group>"; };
 		AD53B70429ACC65500D61E81 /* KMMailHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KMMailHelper.m; sourceTree = "<group>"; };
+		AD6218D32A7D29F40088475C /* KMComparativeGradientView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMComparativeGradientView.swift; sourceTree = "<group>"; };
 		AD68782029A5FADC005B5210 /* KMLightMemberCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMLightMemberCache.swift; sourceTree = "<group>"; };
 		AD68783229A60FA7005B5210 /* KMLoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMLoginView.swift; sourceTree = "<group>"; };
 		AD68783729A60FC0005B5210 /* KMLoginView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMLoginView.xib; sourceTree = "<group>"; };
@@ -7590,6 +7592,7 @@
 		ADF6B8732A48153E0090CB78 /* View */ = {
 			isa = PBXGroup;
 			children = (
+				AD6218D32A7D29F40088475C /* KMComparativeGradientView.swift */,
 				ADF6B8742A48155E0090CB78 /* KMComparativeViewCollectionItem.swift */,
 				ADF6B8752A48155E0090CB78 /* KMComparativeViewCollectionItem.xib */,
 				ADF6B87C2A485A8F0090CB78 /* KMComparativeViewCollectionItemItem.swift */,
@@ -11115,6 +11118,7 @@
 				AD71E7C42990A8A4001C5D3F /* KMBatchRemoveViewModel.swift in Sources */,
 				BB162E92294FFE020088E9D1 /* KMWatermarkModel.swift in Sources */,
 				9FDD0F842952FC9C000C4DAD /* KMAliasLightParser.swift in Sources */,
+				AD6218D42A7D29F40088475C /* KMComparativeGradientView.swift in Sources */,
 				BBFE6E5D2930809A00142C01 /* KMMergeCollectionPageViewItem.swift in Sources */,
 				89E4E7132963D7FF002DBA6F /* NSFont_SKExtensions.m in Sources */,
 				89316849296E436B0073EA59 /* KMSignatureManager.m in Sources */,

+ 40 - 0
PDF Office/PDF Master.xcodeproj/xcuserdata/kdanmobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -7,6 +7,7 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
+<<<<<<< HEAD
             uuid = "A7ACDD2F-B42B-4BBD-932D-3FDEF2524998"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
@@ -17,12 +18,25 @@
             startingLineNumber = "288"
             endingLineNumber = "288"
             landmarkName = "openFile(withFilePath:)"
+=======
+            uuid = "8158ADB6-5705-4EED-BF1D-B34E68C76962"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "PDF Master/Class/KMLightMember/Controller/ComparativeTable/KMComparativeTableViewController.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "181"
+            endingLineNumber = "181"
+            landmarkName = "subscribeAction(controller:isRestore:)"
+>>>>>>> develop
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
+<<<<<<< HEAD
             uuid = "EBBB4FDA-05E9-4C31-A7DD-B14B9A396755"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
@@ -50,12 +64,25 @@
             startingLineNumber = "250"
             endingLineNumber = "250"
             landmarkName = "isSampleController()"
+=======
+            uuid = "A6E177AA-36E9-4680-8477-CBFAA745EEE1"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "PDF Master/Class/KMLightMember/Controller/ComparativeTable/KMComparativeTableViewController.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "198"
+            endingLineNumber = "198"
+            landmarkName = "subscribeAction(controller:isRestore:)"
+>>>>>>> develop
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
+<<<<<<< HEAD
 <<<<<<< HEAD
             uuid = "2F73CA33-14D7-434F-A2C2-7267A1A1E1F3"
             shouldBeEnabled = "Yes"
@@ -201,6 +228,19 @@
 =======
             landmarkType = "3">
 >>>>>>> dev_dmg_v1.2
+=======
+            uuid = "1D42B63E-3E64-4C58-BB41-A7DC4E7F81A9"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "PDF Master/Class/KMLightMember/InAppPurchase/Appstore/KMInAppPurchaseManager.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "108"
+            endingLineNumber = "108"
+            landmarkName = "purchaseProduct(productIdentifier:orderId:completion:)"
+            landmarkType = "7">
+>>>>>>> develop
          </BreakpointContent>
       </BreakpointProxy>
    </Breakpoints>

File diff suppressed because it is too large
+ 1013 - 1421
PDF Office/PDF Master.xcodeproj/xcuserdata/lizhe.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist


+ 65 - 30
PDF Office/PDF Master/AppDelegate.swift

@@ -74,6 +74,12 @@ class AppDelegate: NSObject, NSApplicationDelegate {
         UserDefaults.standard.set(count, forKey: "kFirstOpenAppCount")
         UserDefaults.standard.synchronize()
         
+        //restore
+        KMPurchaseManager.manager.restorePurchases { isSuccess, error in
+            
+        }
+        
+        
         self.initMainMenu()
         /// pro
         //    [DBClientsManager setupWithAppKeyDesktop:@"amipzwtlg9lrwyl"];
@@ -91,15 +97,31 @@ class AppDelegate: NSObject, NSApplicationDelegate {
     }
     
     @objc func handleGetURLEvent(_ event: NSAppleEventDescriptor, withReplyEvent replyEvent: NSAppleEventDescriptor) {
-            if let urlString = event.paramDescriptor(forKeyword: AEKeyword(keyDirectObject))?.stringValue,
-               let url = URL(string: urlString) {
-                // 在这里处理收到的 URL Scheme
-                KMPrint("Received URL Scheme: \(url.scheme ?? "")")
-                KMPrint("Path: \(url.path)")
-                
-                #if VERSION_DMG
-                // 执行相应的操作
-                if url.scheme == "subscriptiondmgSchemes" {
+        if let urlString = event.paramDescriptor(forKeyword: AEKeyword(keyDirectObject))?.stringValue,
+           let url = URL(string: urlString) {
+            // 在这里处理收到的 URL Scheme
+            KMPrint("Received URL Scheme: \(url.scheme ?? "")")
+            KMPrint("Path: \(url.path)")
+            
+            if NSApp.mainWindow == nil {
+                let bundleIdentifier: String = Bundle.main.bundleIdentifier ?? ""
+                launchApp(bundleIdentifier: bundleIdentifier)
+            }
+            
+            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.3) {
+            #if VERSION_DMG
+            // 执行相应的操作
+            if url.scheme == "subscriptiondmgschemes" {
+                if urlString.contains("open=expired") {
+                    KMPrint("刷新用户信息")
+                    if !KMLightMemberManager.manager.isLogin() && NSApp.mainWindow != nil {
+                        KMLoginWindowController.show(window: NSApp.mainWindow!)
+                    } else {
+                        if NSApp.mainWindow != nil && KMLightMemberManager.manager.isLogin() {
+                            KMAccountInfoWindowController.show(window: NSApp.mainWindow!)
+                        }
+                    }
+                } else if urlString.contains("open=success") {
                     if !KMLightMemberManager.manager.isLogin() && NSApp.mainWindow != nil {
                         KMLoginWindowController.show(window: NSApp.mainWindow!)
                     } else {
@@ -111,32 +133,45 @@ class AppDelegate: NSObject, NSApplicationDelegate {
                             }
                         }
                     }
-                    
-                    if url.path == "/open" {
-                        // 执行打开操作
-                    } else if url.path == "/close" {
-                        // 执行关闭操作
-                    }
                 }
-                #endif
-                
-                #if VERSION_FREE
-                // 执行相应的操作
-                if url.scheme == "subscriptionSchemes" {
-                    //刷新用户信息
-                    KMRequestServerManager.manager.getUserInfo { [weak self] success, data, error, isLocal in
+            }
+            #endif
+
+            #if VERSION_FREE
+            // 执行相应的操作
+            if url.scheme == "subscriptionSchemes" {
+                //刷新用户信息
+                KMRequestServerManager.manager.getUserInfo { [weak self] success, data, error, isLocal in
 
-                    }
-                    
-                    if url.path == "/open" {
-                        // 执行打开操作
-                    } else if url.path == "/close" {
-                        // 执行关闭操作
-                    }
                 }
-                #endif
+                
+                if url.path == "/open" {
+                    // 执行打开操作
+                } else if url.path == "/close" {
+                    // 执行关闭操作
+                }
+            }
+            #endif
+            }
+        }
+    }
+    
+    func launchApp(bundleIdentifier: String) {
+        let workspace = NSWorkspace.shared
+
+        // Launch the application with the specified bundle identifier
+        if let appURL = NSWorkspace.shared.urlForApplication(withBundleIdentifier: bundleIdentifier) {
+            do {
+                try workspace.launchApplication(at: appURL, options: .default, configuration: [:])
+            } catch {
+                print("Error launching the application: \(error)")
             }
+        } else {
+            print("Application with bundle identifier '\(bundleIdentifier)' not found.")
         }
+    }
+
+
     
     func application(_ application: NSApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
         

+ 2 - 1
PDF Office/PDF Master/Class/ChromiumTabs/KMToolbarRightView.swift

@@ -93,7 +93,8 @@ import Cocoa
     
     func canShowAdvanced() -> Bool {
         #if VERSION_FREE
-        return (KMLightMemberManager.manager.isLogin() &&
+        return (
+            //KMLightMemberManager.manager.isLogin() &&
              (KMLightMemberManager.manager.purchaseState != .subscription &&
               KMLightMemberManager.manager.purchaseState != .trial))
         #else

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

@@ -951,7 +951,25 @@ extension KMHomeViewController {
     }
     
     func fastTool_MergePDF() {  // MergePDF
-        self.km_open_pdf_merge()
+        Task { @MainActor in
+//            #if VERSION_DMG
+//            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+//                let _ = KMComparativeTableViewController.show(window: self.view.window!, .merge)
+//                return
+//            }
+//            #endif
+
+//            if await (KMLightMemberManager.manager.canPayFunction() == false) {
+//                let _ = KMSubscribeWaterMarkWindowController.show(window: self.view.window!, isContinue: true, type: .merge) { isSubscribeSuccess, isWaterMarkExport, isClose in
+//                    if (isClose) {
+//                        return
+//                    }
+//                    self.km_open_pdf_merge()
+//                }
+//                return
+//            }
+            self.km_open_pdf_merge()
+        }
     }
     
     func km_open_pdf_merge() {
@@ -974,6 +992,13 @@ extension KMHomeViewController {
     
     func fastTool_Compression() {   // 压缩
         Task { @MainActor in
+//            #if VERSION_DMG
+//            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+//                let _ = KMComparativeTableViewController.show(window: self.view.window!, .merge)
+//                return
+//            }
+//            #endif
+
             self.km_secure_openPanel_compress()
         }
     }

+ 27 - 1
PDF Office/PDF Master/Class/Home/ViewController/KMHomeViewController+UI.swift

@@ -173,7 +173,26 @@ extension KMHomeViewController {
     }
     
     func showConvertWindow(type: KMPDFConvertType) {
-        self.km_secure_openPanel_convert(type: type)
+        Task { @MainActor in
+//            #if VERSION_DMG
+//            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+//                let _ = KMComparativeTableViewController.show(window: self.view.window!, .merge)
+//                return
+//            }
+//            #endif
+
+//            if await (KMLightMemberManager.manager.canPayFunction() == false) {
+//                let _ = KMSubscribeWaterMarkWindowController.show(window: self.view.window!, isContinue: true, type: type.toSubscribeWaterMarkType()) { isSubscribeSuccess, isWaterMarkExport, isClose in
+//                    if (isClose) {
+//                        return
+//                    }
+//                    self.km_secure_openPanel_convert(type: type)
+//                }
+//                return
+//            }
+            
+            self.km_secure_openPanel_convert(type: type)
+        }
     }
     
     func km_secure_openPanel_convert(type: KMPDFConvertType) {
@@ -194,6 +213,13 @@ extension KMHomeViewController {
     
     func showSecurityWindow() {
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!, .merge)
+                return
+            }
+            #endif
+
             if await (KMLightMemberManager.manager.canPayFunction() == false) {
                 let _ = KMSubscribeWaterMarkWindowController.show(window: self.view.window!, isContinue: true) { isSubscribeSuccess, isWaterMarkExport, isClose in
                     if (isClose) {

+ 13 - 9
PDF Office/PDF Master/Class/Home/WindowController/KMAITranslationConfirmWindowController.swift

@@ -131,13 +131,13 @@ class KMAITranslationConfirmWindowController: NSWindowController {
     // MARK: Action Methods
 
     @IBAction func translateAction(_ sender: NSButton) {
-        if !KMLightMemberManager.manager.isLogin() {
-            KMLoginWindowController.show(window: NSApp.mainWindow!)
-
-            return
-        }
-        self._translateAction(sender)
-//        Task { @MainActor in
+//        if !KMLightMemberManager.manager.isLogin() {
+//            KMLoginWindowController.show(window: NSApp.mainWindow!)
+//
+//            return
+//        }
+//        self._translateAction(sender)
+        Task { @MainActor in
 //            if await (KMLightMemberManager.manager.canPayFunction() == false) {
 //                let _ = KMSubscribeWaterMarkWindowController.show(window: self.window!, type: .aiTranslate) { isSubscribeSuccess, _, isClose in
 //                    if (isClose) {
@@ -150,8 +150,12 @@ class KMAITranslationConfirmWindowController: NSWindowController {
 //                }
 //                return
 //            }
-//            self._translateAction(sender)
-//        }
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                _ = KMComparativeTableViewController.show(window: self.window!, inputType: .aiTranslate)
+                return
+            }
+            self._translateAction(sender)
+        }
     }
     
     private func _translateAction(_ sender: NSButton) {

+ 22 - 22
PDF Office/PDF Master/Class/KMLightMember/Config/KMLightMemberConfig.swift

@@ -9,38 +9,38 @@ import Cocoa
 
 class KMLightMemberConfig: NSObject {
     var isDebug: Bool = true
-    var kServerURL: String {
+    var kServerURL: String { // 会员
         get {
-//            #if DEBUG
-//            if self.isDebug {
+            #if DEBUG
+            if self.isDebug {
 //                测试服务器
                 return "http://139.196.160.101:8081"
-//            } else {
-//                //正式服务器
-//                return "https://pdfmaster.pdfreaderpro.com"
-//            }
-//            #else
-//            //正式服务器
-//            return "https://pdfmaster.pdfreaderpro.com"
-//            #endif
+            } else {
+                //正式服务器
+                return "https://pdfmaster.pdfreaderpro.com"
+            }
+            #else
+            //正式服务器
+            return "https://pdfmaster.pdfreaderpro.com"
+            #endif
             
         }
     }
     
-    var kStoreServerURL: String {
+    var kStoreServerURL: String { // 网页跳转
         get {
-//            #if DEBUG
-//            if self.isDebug {
+            #if DEBUG
+            if self.isDebug {
 //                测试服务器
                 return "http://test-pdf-pro.kdan.cn:3021"
-//            } else {
-//                //正式服务器
-//                return "https://pdfmaster.pdfreaderpro.com"
-//            }
-//            #else
-//            //正式服务器
-//            return "https://pdfmaster.pdfreaderpro.com"
-//            #endif
+            } else {
+                //正式服务器
+                return "https://www.pdfreaderpro.com"
+            }
+            #else
+            //正式服务器
+            return "https://www.pdfreaderpro.com"
+            #endif
             
         }
     }

+ 6 - 2
PDF Office/PDF Master/Class/KMLightMember/Controller/AccountInfo/KMAccountInfoWindowController.swift

@@ -164,7 +164,7 @@ class KMAccountInfoWindowController: NSWindowController {
     }
     
     func reloadData() {
-        let state = KMLightMemberManager.manager.purchaseState
+        let state = KMDMGPurchaseManager.manager.state
         if state == .unknow {
             self.accountViewHeightConstraint.constant = 274
 #if VERSION_DMG
@@ -176,7 +176,11 @@ class KMAccountInfoWindowController: NSWindowController {
                     state == .trial {
             self.accountViewHeightConstraint.constant = 411 - 60
 #if VERSION_DMG
-            self.accountViewHeightConstraint.constant = 483 - 52 - 20
+            if KMLightMemberManager.manager.info.subscriptionInfoList[0].payType == 1 {
+                self.accountViewHeightConstraint.constant = 483 - 52 - 20
+            } else {
+                self.accountViewHeightConstraint.constant = 483
+            }
 #endif
         } else if state == .subscriptionExpired ||
                     state == .trialExpired {

+ 7 - 3
PDF Office/PDF Master/Class/KMLightMember/Controller/AccountInfo/View/KMAccountInfoView.swift

@@ -131,7 +131,7 @@ class KMAccountInfoView: KMBaseXibView {
             self.accountLabel.stringValue = userInfo!.email
             self.imageViewButton.title = userInfo?.email.substring(to: 1) ?? ""
             
-            if userInfo?.subscriptionInfoList[0].payType == 1 {
+            if KMLightMemberManager.manager.info.subscriptionInfoList[0].payType == 1 {
                 self.tagContentView.isHidden = false
             } else {
                 self.tagContentView.isHidden = true
@@ -162,11 +162,13 @@ class KMAccountInfoView: KMBaseXibView {
             self.statusContentView.isHidden = false
 #if VERSION_DMG
             self.purchaseInfoContentView.isHidden = false
-            if userInfo?.subscriptionInfoList[0].payType == 1 {
+            if KMLightMemberManager.manager.info.subscriptionInfoList[0].payType == 1 {
                 self.subscribeButtonContentView.isHidden = true
             } else {
                 self.subscribeButtonContentView.isHidden = false
             }
+#else
+            self.purchaseInfoContentView.isHidden = true
 #endif
             self.statusLabel.stringValue = NSLocalizedString("On Subscription", comment: "")
             if purchaseState == .trial {
@@ -182,6 +184,8 @@ class KMAccountInfoView: KMBaseXibView {
             
 #if VERSION_DMG
             self.purchaseInfoContentView.isHidden = false
+#else
+            self.purchaseInfoContentView.isHidden = true
 #endif
             self.statusLabel.stringValue = NSLocalizedString("Expired", comment: "")
             self.statusLabel.textColor = NSColor(hex: "#F3465B")
@@ -191,7 +195,7 @@ class KMAccountInfoView: KMBaseXibView {
         }
         
         if self.userInfo != nil {
-            if userInfo?.subscriptionInfoList[0].payType == 1 {
+            if KMLightMemberManager.manager.info.subscriptionInfoList[0].payType == 1 {
                 let dateString = userInfo?.subscriptionInfoList[0].endDate ?? ""
                 self.statusTimeLabel.stringValue = "\(self.fetchDate(dateString: dateString))\n\(NSLocalizedString("Subscription renewal date", comment: ""))"
             }

+ 30 - 35
PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/KMComparativeTableViewController.swift

@@ -15,7 +15,7 @@ typealias KMComparativeTableViewControllerRestoreAction = (_ controller: KMCompa
 var comparativeController: KMComparativeTableViewController?
 var comparativeMainWindow: NSWindow?
 
-enum KMComparativeInputType: Int {
+@objc enum KMComparativeInputType: Int {
     case unknown = 0
     case login = 1 //登录界面
     case register = 2 //注册界面
@@ -41,7 +41,7 @@ enum KMComparativeInputType: Int {
     case equity = 19 //权益弹窗
 }
 
-class KMComparativeTableViewController: NSWindowController {
+@objcMembers class KMComparativeTableViewController: NSWindowController {
 
     @IBOutlet weak var comparativeTableView: KMComparativeTableView!
     @IBOutlet weak var comparativeView: KMComparativeView!
@@ -65,10 +65,10 @@ class KMComparativeTableViewController: NSWindowController {
      */
     static func show(window: NSWindow, _ type: KMComparativeInputType = .unknown, inputType: KMSubscribeWaterMarkType = .none) -> KMComparativeTableViewController? {
 #if VERSION_DMG
-        if KMLightMemberManager.manager.isLogin() {
+        if KMLightMemberManager.manager.isLogin() || type == .upgrade {
             KMPurchaseManager.manager.showStore()
         } else {
-            KMLoginWindowController.show(window: NSApp.mainWindow!)
+            KMLoginWindowController.show(window: window)
         }
 #endif
         
@@ -179,43 +179,38 @@ class KMComparativeTableViewController: NSWindowController {
     func subscribeAction(controller: KMComparativeTableViewController, isRestore: Bool = false) {
         //loading
         controller.comparativeView.beginLoading(backgroundColor: NSColor.black.withAlphaComponent(0.2))
-
-        if KMLightMemberManager.manager.isLogin() {
-            if isRestore {
-                KMPurchaseManager.manager.restorePurchases { isSuccess, error in
-                    if isSuccess {
-                        comparativeController = nil
-                        comparativeMainWindow?.endSheet(controller.window!)
-                        comparativeMainWindow = nil
-                        controller.close()
-                    } else {
-                        if error != .restoreSuccess {
-                            KMComparativeTableViewController.purchasefailed(view: comparativeController?.comparativeView, state: error)
-                        }
+        if isRestore {
+            KMPurchaseManager.manager.restorePurchases { isSuccess, error in
+                if isSuccess {
+                    comparativeController = nil
+                    comparativeMainWindow?.endSheet(controller.window!)
+                    comparativeMainWindow = nil
+                    controller.close()
+                } else {
+                    if error != .restoreSuccess {
+                        KMComparativeTableViewController.purchasefailed(view: comparativeController?.comparativeView, state: error)
                     }
-                    controller.comparativeView.endLoading()
                 }
-            } else {
-                KMPurchaseManager.manager.purchaseProduct(productIdentifier: PRODUCT_1) { isSuccess, error in
-                    if isSuccess {
-                        KMPrint("订阅成功")
-                        comparativeController = nil
-                        comparativeMainWindow?.endSheet(controller.window!)
-                        controller.close()
+                controller.comparativeView.endLoading()
+            }
+        } else {
+            KMPurchaseManager.manager.purchaseProduct(productIdentifier: PRODUCT_1) { isSuccess, error in
+                if isSuccess {
+                    KMPrint("订阅成功")
+                    comparativeController = nil
+                    comparativeMainWindow?.endSheet(controller.window!)
+                    controller.close()
 
-                        if comparativeMainWindow != nil {
-                            _ = KMSubscribeSuccessWindowController.show(window: comparativeMainWindow!)
-                            comparativeMainWindow = nil
-                        }
-                    } else {
-                        KMComparativeTableViewController.purchasefailed(view: comparativeController?.comparativeView, state: error)
+                    if comparativeMainWindow != nil {
+                        _ = KMSubscribeSuccessWindowController.show(window: comparativeMainWindow!)
+                        comparativeMainWindow = nil
                     }
-                    //loading
-                    controller.comparativeView.endLoading()
+                } else {
+                    KMComparativeTableViewController.purchasefailed(view: comparativeController?.comparativeView, state: error)
                 }
+                //loading
+                controller.comparativeView.endLoading()
             }
-        } else {
-            KMComparativeTableViewController.loginAlertView()
         }
     }
     

+ 1 - 10
PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/Source/KMCompatative.xcassets/remove watermark.imageset/Contents.json

@@ -2,16 +2,7 @@
   "images" : [
     {
       "filename" : "remove watermark.pdf",
-      "idiom" : "universal",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "universal",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "universal",
-      "scale" : "3x"
+      "idiom" : "universal"
     }
   ],
   "info" : {

+ 26 - 26
PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/Source/KMCompatative.xcassets/remove watermark.imageset/remove watermark.pdf

@@ -7,7 +7,7 @@
      /FunctionType 4
   >>
 stream
-{  0.312500 exch 0.463750 exch 1.000000 exch dup 0.000000 gt { exch pop exch pop exch pop dup 0.000000 sub 0.107108 mul 0.312500 add exch dup 0.000000 sub 0.180172 mul 0.463750 add exch dup 0.000000 sub -0.019608 mul 1.000000 add exch } if dup 1.000000 gt { exch pop exch pop exch pop 0.419608 exch 0.643922 exch 0.980392 exch } if pop }
+{  0.414080 exch 0.395312 exch 0.958333 exch dup 0.000000 gt { exch pop exch pop exch pop dup 0.000000 sub 0.309087 mul 0.414080 add exch dup 0.000000 sub -0.024479 mul 0.395312 add exch dup 0.000000 sub 0.041667 mul 0.958333 add exch } if dup 1.000000 gt { exch pop exch pop exch pop 0.723167 exch 0.370833 exch 1.000000 exch } if pop }
 endstream
 endobj
 
@@ -16,7 +16,7 @@ endobj
 endobj
 
 3 0 obj
-  << /Pattern << /P1 << /Matrix [ 17.399105 -18.357592 18.357592 17.399105 -7.573900 9.163639 ]
+  << /Pattern << /P1 << /Matrix [ 17.289862 -7.466401 7.466401 17.289862 5.729766 9.966242 ]
                         /Shading << /Coords [ 0.000000 0.000000 1.000000 0.000000 ]
                                     /ColorSpace /DeviceRGB
                                     /Function 1 0 R
@@ -35,27 +35,27 @@ stream
 /DeviceRGB CS
 /DeviceRGB cs
 q
-1.000000 0.000000 -0.000000 1.000000 8.000000 6.252075 cm
+1.000000 0.000000 -0.000000 1.000000 8.000000 6.252197 cm
 /Pattern cs
 /P1 scn
-20.000000 9.409721 m
-20.000000 8.078160 19.665043 6.817276 19.067095 5.692083 c
-5.519455 18.515961 l
-7.127116 20.445585 8.765280 22.052492 9.698698 22.926748 c
-10.146873 23.346518 10.821943 23.356161 11.280507 22.947765 c
-13.573334 20.905779 20.000000 14.709504 20.000000 9.409721 c
+20.000000 9.409599 m
+20.000000 8.078038 19.665043 6.817154 19.067095 5.691961 c
+5.519455 18.515839 l
+7.127116 20.445463 8.765280 22.052370 9.698698 22.926626 c
+10.146873 23.346395 10.821943 23.356039 11.280507 22.947643 c
+13.573334 20.905657 20.000000 14.709382 20.000000 9.409599 c
 h
-2.449738 14.146850 m
-0.442254 16.047087 l
--0.147419 16.605257 -0.147417 17.510231 0.442256 18.068401 c
-1.031929 18.626572 1.987979 18.626572 2.577653 18.068401 c
-18.826254 2.687859 l
-19.415926 2.129686 19.415924 1.224714 18.826252 0.666542 c
-18.236578 0.108372 17.280527 0.108372 16.690855 0.666542 c
-15.294358 1.988434 l
-13.881817 1.238922 12.236346 0.809141 10.479762 0.809141 c
-5.221880 0.809141 0.959524 4.659752 0.959524 9.409721 c
-0.959524 10.898039 1.555729 12.532537 2.449738 14.146850 c
+2.449738 14.146728 m
+0.442254 16.046965 l
+-0.147419 16.605135 -0.147417 17.510109 0.442256 18.068279 c
+1.031929 18.626450 1.987979 18.626450 2.577653 18.068279 c
+18.826254 2.687737 l
+19.415926 2.129564 19.415924 1.224592 18.826252 0.666420 c
+18.236578 0.108250 17.280527 0.108250 16.690855 0.666420 c
+15.294358 1.988312 l
+13.881817 1.238800 12.236346 0.809019 10.479762 0.809019 c
+5.221880 0.809019 0.959524 4.659630 0.959524 9.409599 c
+0.959524 10.897917 1.555729 12.532415 2.449738 14.146728 c
 h
 f*
 n
@@ -119,16 +119,16 @@ xref
 0000000010 00000 n
 0000000531 00000 n
 0000000553 00000 n
-0000001179 00000 n
-0000002718 00000 n
-0000002741 00000 n
-0000002914 00000 n
-0000002988 00000 n
+0000001176 00000 n
+0000002715 00000 n
+0000002738 00000 n
+0000002911 00000 n
+0000002985 00000 n
 trailer
 << /ID [ (some) (id) ]
    /Root 8 0 R
    /Size 9
 >>
 startxref
-3047
+3044
 %%EOF

+ 22 - 10
PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/View/KMComparativeView/KMComparativeView.swift

@@ -40,20 +40,26 @@ class KMComparativeView: KMBaseXibView {
             "subtitle": "Free Plan",
             "describe": "Simply log in and get benefits.",
             "content": [
-                ["title": "AI translate, rewrite, correction",
+                ["title": "AI translate",
+                 "state": 1,
+                 "color": "#551CCD"],
+                ["title": "AI rewrite, AI correction (5 times per month for each function)",
                  "state": 1,
                  "color": "#551CCD"],
                 ["title": "Save without watermark",
                  "state": 0,
-                 "color": "#252629"],
-                ["title": "Basic functions like annotation and viewing",
+                 "color": "#F3465B"],
+                ["title": "Convert PDF to Office (Only first 10 pages), unlimited times",
                  "state": 2,
                  "color": "#252629"],
-                ["title": "Convert PDF to Office (Only first 10 pages)",
+                ["title": "Merge 2 files at once, unlimited times",
                  "state": 2,
                  "color": "#252629"],
-                ["title": "Merge only 2 files for free",
+                ["title": "Basic functions like annotation and viewing",
                  "state": 2,
+                 "color": "#252629"],
+                ["title": "",
+                 "state": 0,
                  "color": "#252629"]
             ],
             "buttonTitle": "Free Trial"
@@ -65,23 +71,29 @@ class KMComparativeView: KMBaseXibView {
             "describe": "Save 50%@ for the first year, auto-renew at %@. Billed yearly.",
             "productId": PRODUCT_1,
             "content": [
-                ["title": "AI translate, rewrite, correction",
+                ["title": "AI translate",
+                 "state": 1,
+                 "color": "#551CCD"],
+                ["title": "AI rewrite, AI correction (5 times per month for each function)",
                  "state": 1,
                  "color": "#551CCD"],
                 ["title": "Save without watermark",
                  "state": 1,
                  "color": "#252629"],
-                ["title": "Unlock all premium features",
+                ["title": "Convert PDF to Office without any limitation",
                  "state": 1,
                  "color": "#252629"],
-                ["title": "Convert PDF to Office without limitation",
+                ["title": "Batch merge files without any limitation",
                  "state": 1,
                  "color": "#252629"],
-                ["title": "Batch merge files without limitation",
+                ["title": "Unlock all premium features",
                  "state": 1,
+                 "color": "#252629"],
+                ["title": "",
+                 "state": 0,
                  "color": "#252629"]
             ],
-            "buttonTitle": "Buy Now"
+            "buttonTitle": "Subscribe"
         ]
     ]
     

+ 14 - 14
PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/View/KMComparativeView/KMComparativeView.xib

@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21701" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22146" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
     <dependencies>
         <deployment identifier="macosx"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21701"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22146"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
@@ -51,14 +51,14 @@
                         </box>
                         <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="eN5-5g-Ftd">
                             <rect key="frame" x="8" y="8" width="12" height="12"/>
-                            <constraints>
-                                <constraint firstAttribute="width" constant="12" id="hHP-Pp-ky2"/>
-                                <constraint firstAttribute="height" constant="12" id="mIP-CG-QlM"/>
-                            </constraints>
                             <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="control_btn_icon_close" imagePosition="only" alignment="center" imageScaling="proportionallyDown" inset="2" id="x0u-hh-567">
                                 <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
                                 <font key="font" metaFont="system"/>
                             </buttonCell>
+                            <constraints>
+                                <constraint firstAttribute="width" constant="12" id="hHP-Pp-ky2"/>
+                                <constraint firstAttribute="height" constant="12" id="mIP-CG-QlM"/>
+                            </constraints>
                             <connections>
                                 <action selector="closeButtonAction:" target="-2" id="ugN-d6-a63"/>
                             </connections>
@@ -79,7 +79,7 @@
                             <rect key="frame" x="40" y="20" width="727" height="20"/>
                             <subviews>
                                 <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rP2-sO-AA6">
-                                    <rect key="frame" x="384" y="2" width="106" height="16"/>
+                                    <rect key="frame" x="384" y="2" width="107" height="16"/>
                                     <buttonCell key="cell" type="square" title="Terms of Service" bezelStyle="shadowlessSquare" alignment="center" imageScaling="proportionallyDown" inset="2" id="ply-Hb-Jcv">
                                         <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
                                         <font key="font" metaFont="system"/>
@@ -96,7 +96,7 @@
                                     </constraints>
                                 </customView>
                                 <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="hY1-Tk-GCi">
-                                    <rect key="frame" x="255" y="2" width="88" height="16"/>
+                                    <rect key="frame" x="254" y="2" width="89" height="16"/>
                                     <buttonCell key="cell" type="square" title="Privacy Policy" bezelStyle="shadowlessSquare" alignment="center" imageScaling="proportionallyDown" inset="2" id="Z32-Nt-dbF">
                                         <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
                                         <font key="font" metaFont="system"/>
@@ -128,7 +128,7 @@
                                     <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="Upgrade your plan" id="Qxe-i0-Wsc"/>
                                 </imageView>
                                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="MnS-Io-H7L">
-                                    <rect key="frame" x="82" y="8" width="116" height="16"/>
+                                    <rect key="frame" x="82" y="8" width="117" height="16"/>
                                     <textFieldCell key="cell" lineBreakMode="clipping" title="Upgrade your plan" id="YKh-hc-g1N">
                                         <font key="font" metaFont="system"/>
                                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@@ -146,15 +146,15 @@
                                     </connections>
                                 </button>
                                 <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="t36-hD-ZhM">
-                                    <rect key="frame" x="204" y="8" width="16" height="16"/>
-                                    <constraints>
-                                        <constraint firstAttribute="height" constant="16" id="ANF-bC-Abf"/>
-                                        <constraint firstAttribute="width" constant="16" id="YSy-2J-4ZD"/>
-                                    </constraints>
+                                    <rect key="frame" x="205" y="8" width="16" height="16"/>
                                     <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="icon_info" imagePosition="only" alignment="center" imageScaling="proportionallyDown" inset="2" id="bFX-Ce-vIG">
                                         <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
                                         <font key="font" metaFont="system"/>
                                     </buttonCell>
+                                    <constraints>
+                                        <constraint firstAttribute="height" constant="16" id="ANF-bC-Abf"/>
+                                        <constraint firstAttribute="width" constant="16" id="YSy-2J-4ZD"/>
+                                    </constraints>
                                     <connections>
                                         <action selector="infoButtonAction:" target="-2" id="XeA-K0-PqQ"/>
                                     </connections>

+ 31 - 0
PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/View/KMComparativeView/View/KMComparativeGradientView.swift

@@ -0,0 +1,31 @@
+//
+//  KMComparativeGradientView.swift
+//  PDF Master
+//
+//  Created by lizhe on 2023/8/4.
+//
+
+import Cocoa
+
+class KMComparativeGradientView: NSView {
+
+    override func draw(_ dirtyRect: NSRect) {
+        super.draw(dirtyRect)
+        
+        // Create a CAGradientLayer
+        let gradientLayer = CAGradientLayer()
+        
+        // Set the colors of the gradient (from transparent to white)
+        gradientLayer.colors = [NSColor.white.withAlphaComponent(0).cgColor, NSColor.white.withAlphaComponent(1).cgColor]
+        
+        // Set the start and end points of the gradient (left to right in this case)
+        gradientLayer.startPoint = CGPoint(x: 0.5, y: 1.0)
+        gradientLayer.endPoint = CGPoint(x: 0.5, y: 0.0)
+        
+        // Set the frame of the gradient layer to fill the view
+        gradientLayer.frame = self.bounds
+        
+        // Add the gradient layer to the layer hierarchy of the view
+        self.layer?.addSublayer(gradientLayer)
+    }
+}

+ 3 - 1
PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/View/KMComparativeView/View/KMComparativeViewCollectionItem.swift

@@ -13,6 +13,7 @@ class KMComparativeViewCollectionItem: NSCollectionViewItem {
     @IBOutlet weak var titleLabel: NSTextField!
     @IBOutlet weak var subtitleLabel: NSTextField!
     @IBOutlet weak var lineView: NSView!
+    @IBOutlet weak var collectionViewContentView: NSView!
     @IBOutlet weak var scrollView: NSScrollView!
     @IBOutlet weak var contentCollectionView: NSCollectionView!
     @IBOutlet weak var doneBox: KMBox!
@@ -156,6 +157,8 @@ class KMComparativeViewCollectionItem: NSCollectionViewItem {
             }
             self.contentCollectionView.reloadData()
         }
+        
+//        self.collectionViewContentView.addSubview(blurImageView, positioned: .above, relativeTo: scrollView)
     }
     
     func updatePrice() {
@@ -240,7 +243,6 @@ extension KMComparativeViewCollectionItem: NSCollectionViewDelegate {
 }
 
 extension KMComparativeViewCollectionItem: NSCollectionViewDelegateFlowLayout {
-    
     public func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> NSSize {
         let array: [[String: Any]] = self.data["content"] as! [[String : Any]]
         let data = array[indexPath.section]

+ 13 - 14
PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/View/KMComparativeView/View/KMComparativeViewCollectionItem.xib

@@ -1,13 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21701" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22146" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
     <dependencies>
         <deployment identifier="macosx"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21701"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22146"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
         <customObject id="-2" userLabel="File's Owner" customClass="KMComparativeViewCollectionItem" customModule="PDF_Master" customModuleProvider="target">
             <connections>
+                <outlet property="collectionViewContentView" destination="JU3-B0-lwD" id="CDu-IW-nP6"/>
                 <outlet property="contentCollectionView" destination="9Pp-ih-jEG" id="z5w-fy-VHk"/>
                 <outlet property="describeLabel" destination="3TK-IO-Uc2" id="KKA-ma-4Aj"/>
                 <outlet property="doneBox" destination="jrx-sF-eiw" id="QsK-zK-ZTG"/>
@@ -27,7 +28,7 @@
             <rect key="frame" x="0.0" y="0.0" width="348" height="467"/>
             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
             <subviews>
-                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Aal-EW-4N2">
+                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Aal-EW-4N2">
                     <rect key="frame" x="30" y="419" width="288" height="16"/>
                     <textFieldCell key="cell" lineBreakMode="clipping" title="Register Member" id="u25-eB-jIR">
                         <font key="font" usesAppearanceFont="YES"/>
@@ -35,7 +36,7 @@
                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                     </textFieldCell>
                 </textField>
-                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="y61-y9-dAw">
+                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="y61-y9-dAw">
                     <rect key="frame" x="30" y="387" width="31" height="16"/>
                     <textFieldCell key="cell" lineBreakMode="clipping" title="Free" id="Nmm-Ii-aJs">
                         <font key="font" metaFont="system"/>
@@ -72,22 +73,21 @@
                                 <autoresizingMask key="autoresizingMask"/>
                             </scroller>
                         </scrollView>
-                        <imageView hidden="YES" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="kad-Jv-Qsg">
+                        <customView translatesAutoresizingMaskIntoConstraints="NO" id="gkc-pg-xk3" customClass="KMComparativeGradientView" customModule="PDF_Master" customModuleProvider="target">
                             <rect key="frame" x="0.0" y="0.0" width="284" height="40"/>
                             <constraints>
-                                <constraint firstAttribute="height" constant="40" id="eDk-1b-RHY"/>
+                                <constraint firstAttribute="height" constant="40" id="k6w-lh-S8U"/>
                             </constraints>
-                            <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="渐变" id="6xK-SX-U6z"/>
-                        </imageView>
+                        </customView>
                     </subviews>
                     <constraints>
                         <constraint firstItem="2qF-pT-dP8" firstAttribute="top" secondItem="JU3-B0-lwD" secondAttribute="top" id="19V-04-40u"/>
-                        <constraint firstItem="kad-Jv-Qsg" firstAttribute="leading" secondItem="JU3-B0-lwD" secondAttribute="leading" id="St4-s0-ukx"/>
+                        <constraint firstItem="gkc-pg-xk3" firstAttribute="leading" secondItem="JU3-B0-lwD" secondAttribute="leading" id="5qG-ZN-HSb"/>
+                        <constraint firstAttribute="bottom" secondItem="gkc-pg-xk3" secondAttribute="bottom" id="eyR-Va-GWE"/>
                         <constraint firstAttribute="trailing" secondItem="2qF-pT-dP8" secondAttribute="trailing" id="g5f-fd-e2B"/>
                         <constraint firstItem="2qF-pT-dP8" firstAttribute="leading" secondItem="JU3-B0-lwD" secondAttribute="leading" id="pHP-gP-r3J"/>
-                        <constraint firstAttribute="trailing" secondItem="kad-Jv-Qsg" secondAttribute="trailing" id="q6G-00-GXv"/>
                         <constraint firstAttribute="height" constant="180" id="sUt-m6-Pqi"/>
-                        <constraint firstAttribute="bottom" secondItem="kad-Jv-Qsg" secondAttribute="bottom" id="uXc-Mf-3MM"/>
+                        <constraint firstAttribute="trailing" secondItem="gkc-pg-xk3" secondAttribute="trailing" id="yrx-L3-QeM"/>
                         <constraint firstAttribute="bottom" secondItem="2qF-pT-dP8" secondAttribute="bottom" id="zna-H1-Nwa"/>
                     </constraints>
                 </customView>
@@ -100,7 +100,7 @@
                 <customView translatesAutoresizingMaskIntoConstraints="NO" id="BFX-df-wDy">
                     <rect key="frame" x="32" y="28" width="284" height="40"/>
                     <subviews>
-                        <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="tFQ-Lt-4na">
+                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="tFQ-Lt-4na">
                             <rect key="frame" x="122" y="12" width="41" height="16"/>
                             <textFieldCell key="cell" lineBreakMode="clipping" enabled="NO" alignment="center" title="Label" id="91P-uq-jcS">
                                 <font key="font" metaFont="system"/>
@@ -126,7 +126,7 @@
                         <constraint firstItem="jrx-sF-eiw" firstAttribute="leading" secondItem="BFX-df-wDy" secondAttribute="leading" id="qvq-Mx-kLI"/>
                     </constraints>
                 </customView>
-                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3TK-IO-Uc2">
+                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="3TK-IO-Uc2">
                     <rect key="frame" x="30" y="367" width="288" height="16"/>
                     <textFieldCell key="cell" alignment="left" title="Label" id="tUs-FK-WKB">
                         <font key="font" metaFont="system"/>
@@ -165,6 +165,5 @@
     </objects>
     <resources>
         <image name="Badge" width="80" height="24"/>
-        <image name="渐变" width="284" height="40"/>
     </resources>
 </document>

+ 12 - 8
PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/View/KMComparativeView/View/KMComparativeViewCollectionItemItem.swift

@@ -27,18 +27,22 @@ class KMComparativeViewCollectionItemItem: NSCollectionViewItem {
         if data.count != 0 {
             let color = NSColor(hex: data["color"] as! String)
             let state: Int = data["state"] as? Int ?? 0
-            if state == 2 {
-                self.iconImageView.image = NSImage(named: "icon_info")
-            } else if state == 1 {
-                self.iconImageView.image = NSImage(named: "tips")
-            } else if state == 0 {
-                self.iconImageView.image = NSImage(named: "tips 1")
+            let string = NSLocalizedString(data["title"] as! String, comment: "")
+            
+            if string.count > 0 {
+                if state == 2 {
+                    self.iconImageView.image = NSImage(named: "icon_info")
+                } else if state == 1 {
+                    self.iconImageView.image = NSImage(named: "tips")
+                } else if state == 0 {
+                    self.iconImageView.image = NSImage(named: "tips 1")
+                }
+            } else {
+                self.iconImageView.image = NSImage(named: "")
             }
             
             self.titleLabel.textColor = color
             
-            let string = NSLocalizedString(data["title"] as! String, comment: "")
-            
             let paragraphStyle = NSMutableParagraphStyle()
             paragraphStyle.lineHeightMultiple = 1.32
             paragraphStyle.alignment = .left

+ 2 - 2
PDF Office/PDF Master/Class/KMLightMember/Controller/ComparativeTable/View/KMComparativeView/View/KMComparativeViewCollectionItemItem.xib

@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21701" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22146" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
     <dependencies>
         <deployment identifier="macosx"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21701"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22146"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>

+ 5 - 1
PDF Office/PDF Master/Class/KMLightMember/Controller/Login&Register/View/KMLoginLeftImageView.swift

@@ -62,7 +62,11 @@ class KMLoginLeftImageView: KMBaseXibView {
             image = NSImage(named: "image_registerSuccess")!
 //            self.subscriptionButton.isHidden = true
         default:
-            image = NSImage(named: "image_Popup")!
+            #if VERSION_FREE
+            image = NSImage(named: "image_PopupAppstore") ?? NSImage()
+            #else
+            image = NSImage(named: "Image_PopupDMG") ?? NSImage()
+            #endif
 //            self.subscriptionButton.isHidden = false
         }
         self.imageView.image = image

+ 15 - 4
PDF Office/PDF Master/Class/KMLightMember/Controller/Login&Register/View/KMRegisterSuccessView.swift

@@ -52,6 +52,7 @@ class KMRegisterSuccessView: KMBaseXibView {
         self.doneButton.border(.white,0, 20)
         self.doneButton.backgroundColor(NSColor(hex: "#FF852E"))
         self.doneButton.contentTintColor = NSColor(hex: "#FFFFFF")
+        self.doneButton.font = NSFont.SFProTextSemibold(16)
         
         self.textView.delegate = self
         self.textView.isEditable = false
@@ -69,16 +70,26 @@ class KMRegisterSuccessView: KMBaseXibView {
     
     override func reloadData() {
         super.reloadData()
-        
+        if KMLightMemberManager.manager.purchaseState == .subscription {
+            self.doneButton.isEnabled = false
+            self.doneButton.title = NSLocalizedString("Already Subscribed", comment: "")
+            self.doneButton.backgroundColor(NSColor(hex: "#FFD09E"))
+            self.doneButton.contentTintColor = NSColor(hex: "#F7F8FA")
+        } else {
+            self.doneButton.isEnabled = true
+            self.doneButton.title = NSLocalizedString("Subscribe", comment: "")
+            self.doneButton.backgroundColor(NSColor(hex: "#FF852E"))
+            self.doneButton.contentTintColor = NSColor(hex: "#FFFFFF")
+        }
     }
     
     override func updateLanguage() {
         super.updateLanguage()
         self.label1.stringValue = NSLocalizedString("AI robot", comment: "")
-        self.label2.stringValue = NSLocalizedString("Unlimited conversion", comment: "")
-        self.label3.stringValue = NSLocalizedString("Save without watermark", comment: "")
+        self.label2.stringValue = NSLocalizedString("Unlimited Conversion", comment: "")
+        self.label3.stringValue = NSLocalizedString("Save without Watermark", comment: "")
         
-        self.doneButton.title = NSLocalizedString("Subscribe", comment: "")
+//        self.doneButton.title = NSLocalizedString("Subscribe", comment: "")
         
         let string1 = NSLocalizedString("Welcome to Join PDF Master!", comment: "")
         let ParagraphStyle1 = NSMutableParagraphStyle()

+ 16 - 22
PDF Office/PDF Master/Class/KMLightMember/Controller/Login&Register/View/KMRegisterSuccessView.xib

@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21701" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22146" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
     <dependencies>
         <deployment identifier="macosx"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21701"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22146"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
@@ -25,11 +25,7 @@
             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
             <subviews>
                 <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="BHA-OV-pZP">
-                    <rect key="frame" x="71" y="56" width="262" height="40"/>
-                    <constraints>
-                        <constraint firstAttribute="height" constant="40" id="ZuO-mp-mLq"/>
-                        <constraint firstAttribute="width" constant="262" id="a4o-9T-Y67"/>
-                    </constraints>
+                    <rect key="frame" x="32" y="56" width="262" height="40"/>
                     <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" alignment="center" imageScaling="proportionallyDown" inset="2" id="Z4z-3P-BWh">
                         <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
                         <font key="font" metaFont="system"/>
@@ -37,6 +33,10 @@
 DQ
 </string>
                     </buttonCell>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="40" id="ZuO-mp-mLq"/>
+                        <constraint firstAttribute="width" constant="262" id="a4o-9T-Y67"/>
+                    </constraints>
                     <connections>
                         <action selector="doneButtonAction:" target="-2" id="eP8-c5-eUn"/>
                     </connections>
@@ -70,7 +70,7 @@ DQ
                         <autoresizingMask key="autoresizingMask"/>
                     </scroller>
                 </scrollView>
-                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Kzs-j2-9SX">
+                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Kzs-j2-9SX">
                     <rect key="frame" x="30" y="348" width="344" height="16"/>
                     <constraints>
                         <constraint firstAttribute="width" constant="340" id="7jp-XF-jed"/>
@@ -81,7 +81,7 @@ DQ
                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                     </textFieldCell>
                 </textField>
-                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="BSZ-Y0-xj8">
+                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="BSZ-Y0-xj8">
                     <rect key="frame" x="30" y="328" width="344" height="16"/>
                     <constraints>
                         <constraint firstAttribute="width" constant="340" id="10Z-IV-ebu"/>
@@ -92,7 +92,7 @@ DQ
                         <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                     </textFieldCell>
                 </textField>
-                <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="J5R-ne-OXQ">
+                <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="J5R-ne-OXQ">
                     <rect key="frame" x="30" y="256" width="344" height="32"/>
                     <constraints>
                         <constraint firstAttribute="width" constant="340" id="uBN-Un-2Iu"/>
@@ -114,7 +114,7 @@ DQ
                             </constraints>
                             <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="tips" id="afM-Yf-mb5"/>
                         </imageView>
-                        <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="48Q-IG-bcz">
+                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="48Q-IG-bcz">
                             <rect key="frame" x="16" y="4" width="43" height="13"/>
                             <textFieldCell key="cell" lineBreakMode="clipping" alignment="left" title="AI robot" id="kh4-ic-WyH">
                                 <font key="font" metaFont="system" size="10"/>
@@ -130,11 +130,8 @@ DQ
                             </constraints>
                             <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="tips" id="xkG-4a-mvW"/>
                         </imageView>
-                        <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="MCZ-IF-rje">
-                            <rect key="frame" x="77" y="2" width="106" height="16"/>
-                            <constraints>
-                                <constraint firstAttribute="height" constant="16" id="aDY-O1-BHZ"/>
-                            </constraints>
+                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="MCZ-IF-rje">
+                            <rect key="frame" x="77" y="4" width="106" height="13"/>
                             <textFieldCell key="cell" lineBreakMode="clipping" alignment="left" title="Unlimited conversion" id="Le5-pu-hwn">
                                 <font key="font" metaFont="system" size="10"/>
                                 <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@@ -149,11 +146,8 @@ DQ
                             </constraints>
                             <imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="tips" id="HWb-6Q-SSX"/>
                         </imageView>
-                        <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="5x9-Ne-EV5">
-                            <rect key="frame" x="201" y="2" width="120" height="16"/>
-                            <constraints>
-                                <constraint firstAttribute="height" constant="16" id="Esm-rx-6JS"/>
-                            </constraints>
+                        <textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="5x9-Ne-EV5">
+                            <rect key="frame" x="201" y="4" width="121" height="13"/>
                             <textFieldCell key="cell" lineBreakMode="clipping" alignment="left" title="Save without watermark" id="uiq-KT-aVg">
                                 <font key="font" metaFont="system" size="10"/>
                                 <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@@ -186,7 +180,6 @@ DQ
                 <constraint firstItem="acP-iz-Hm7" firstAttribute="centerX" secondItem="c22-O7-iKe" secondAttribute="centerX" id="Ki4-63-Ucg"/>
                 <constraint firstItem="Kzs-j2-9SX" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" constant="56" id="MNF-Ec-2gf"/>
                 <constraint firstAttribute="trailing" secondItem="rBp-UM-QAb" secondAttribute="trailing" constant="32" id="RAM-Ua-B0M"/>
-                <constraint firstItem="BHA-OV-pZP" firstAttribute="centerX" secondItem="c22-O7-iKe" secondAttribute="centerX" id="S1z-ii-bIg"/>
                 <constraint firstItem="acP-iz-Hm7" firstAttribute="top" secondItem="BHA-OV-pZP" secondAttribute="bottom" constant="8" id="Slc-Px-AZS"/>
                 <constraint firstAttribute="bottom" secondItem="BHA-OV-pZP" secondAttribute="bottom" constant="56" id="ZJx-ls-b8f"/>
                 <constraint firstItem="rBp-UM-QAb" firstAttribute="top" secondItem="J5R-ne-OXQ" secondAttribute="bottom" constant="12" id="bRE-vD-0Yb"/>
@@ -194,6 +187,7 @@ DQ
                 <constraint firstAttribute="trailing" secondItem="BSZ-Y0-xj8" secondAttribute="trailing" constant="32" id="edx-0G-MQS"/>
                 <constraint firstItem="Kzs-j2-9SX" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="32" id="efh-yn-eTj"/>
                 <constraint firstItem="BSZ-Y0-xj8" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="32" id="f35-4H-ZKd"/>
+                <constraint firstItem="BHA-OV-pZP" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="32" id="hBN-Bt-LwE"/>
                 <constraint firstAttribute="trailing" secondItem="BSZ-Y0-xj8" secondAttribute="trailing" constant="32" id="lFZ-E8-j1J"/>
                 <constraint firstAttribute="trailing" secondItem="J5R-ne-OXQ" secondAttribute="trailing" constant="32" id="oWp-aL-OyK"/>
                 <constraint firstAttribute="trailing" secondItem="Kzs-j2-9SX" secondAttribute="trailing" constant="32" id="uII-6B-l8y"/>

+ 71 - 30
PDF Office/PDF Master/Class/KMLightMember/Controller/SubscriptionView/WaterMark/KMSubscribeWaterMarkWindowController.swift

@@ -54,6 +54,9 @@ typealias KMSubscribeWaterMarkWindowControllerWatermarkExportAction = (_ control
 typealias KMSubscribeWaterMarkWindowControllerSubscribeAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void
 
 var tempType: KMSubscribeWaterMarkType = .none
+var tempLimit: Bool = false
+var tempContinue: Bool = false
+
 class KMSubscribeWaterMarkWindowController: NSWindowController {
 
     @IBOutlet weak var waterMarkView: KMSubscribeWaterMarkView!
@@ -65,6 +68,7 @@ class KMSubscribeWaterMarkWindowController: NSWindowController {
     
     var isContinue: Bool?
     var isAI: Bool?
+    var isLimit: Bool?
     var type: KMSubscribeWaterMarkType? {
         didSet {
             self.waterMarkView?.type = type
@@ -77,6 +81,8 @@ class KMSubscribeWaterMarkWindowController: NSWindowController {
     
     override func windowDidLoad() {
         super.windowDidLoad()
+        
+        self.waterMarkView.subscribeLabel.stringValue = ""
         self.setup()
         self.reloadData()
         // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
@@ -84,11 +90,22 @@ class KMSubscribeWaterMarkWindowController: NSWindowController {
     
     override func awakeFromNib() {
         super.awakeFromNib()
+        
+//        self.waterMarkView.subscribeLabel.stringValue = ""
     }
     
     //MARK: 打开文件
-    @objc static func show(window: NSWindow, isContinue: Bool = false, type: KMSubscribeWaterMarkType = .none, subscribeDidClick: (()->Void)? = nil, completion: @escaping (_ isSubscribeSuccess: Bool, _ isWaterMarkExport: Bool, _ isClose: Bool) -> Void) -> KMSubscribeWaterMarkWindowController {
+    @objc static func show(window: NSWindow, isContinue: Bool = false, limit: Bool = false, type: KMSubscribeWaterMarkType = .none, subscribeDidClick: (()->Void)? = nil, completion: @escaping (_ isSubscribeSuccess: Bool, _ isWaterMarkExport: Bool, _ isClose: Bool) -> Void) -> KMSubscribeWaterMarkWindowController {
+        #if VERSION_DMG
+        if type != .save && !KMLightMemberManager.manager.isLogin() {
+            KMLoginWindowController.show(window: window)
+            return KMSubscribeWaterMarkWindowController()
+        }
+        #endif
+        tempLimit = limit
         tempType = type
+        tempContinue = isContinue
+        
         var isAI = false
         if type == .aiCorrect ||
             type == .aiRewrite ||
@@ -119,6 +136,7 @@ class KMSubscribeWaterMarkWindowController: NSWindowController {
 
             subscribeWaterMarkWindowController.isContinue = isContinue
             subscribeWaterMarkWindowController.isAI = isAI
+            subscribeWaterMarkWindowController.isLimit = limit
             
             window.beginSheet(subscribeWaterMarkWindowController.window!)
             subscribeWaterMarkWindowController.window?.center()
@@ -135,12 +153,7 @@ class KMSubscribeWaterMarkWindowController: NSWindowController {
             }
             
             subscribeWaterMarkWindowController.watermarkExportAction = { controller in
-                if type.isConvertType() && !KMLightMemberManager.manager.isLogin() {
-                    completion(false, false, true)
-                } else {
-                    completion(false, true, false)
-                }
-                
+                completion(false, true, false)
                 subscribeWaterMarkMainWindow?.endSheet(controller.window!)
                 controller.window?.close()
                 subscribeWaterMarkController = nil
@@ -156,7 +169,9 @@ class KMSubscribeWaterMarkWindowController: NSWindowController {
                 controller.window?.close()
                 subscribeWaterMarkController = nil
                 
-                if KMLightMemberManager.manager.isLogin() || type == .save {
+                if KMLightMemberManager.manager.isLogin() ||
+                    type == .save ||
+                    ((type.isConvertType() || type == .merge) && limit) {
                     KMComparativeTableViewController.show(window: subscribeWaterMarkMainWindow ?? NSWindow(), .equity, inputType: type)
                 } else {
                     KMLoginWindowController.show(window: subscribeWaterMarkMainWindow ?? NSWindow())
@@ -164,25 +179,6 @@ class KMSubscribeWaterMarkWindowController: NSWindowController {
                 subscribeWaterMarkMainWindow = nil
             }
             
-            if isContinue {
-                subscribeWaterMarkWindowController.waterMarkView.waterExportButton.title = NSLocalizedString("Save with Watermark", comment: "")
-            } else {
-                if type == .merge {
-                    subscribeWaterMarkWindowController.waterMarkView.waterExportButton.title = NSLocalizedString("Delete From the File List", comment: "")
-                } else if type.isConvertType() {
-                    if KMLightMemberManager.manager.isLogin() {
-                        subscribeWaterMarkWindowController.waterMarkView.waterExportButton.title = NSLocalizedString("Convert First 10 Pages", comment: "")
-                    } else {
-                        subscribeWaterMarkWindowController.waterMarkView.waterExportButton.title = NSLocalizedString("Later", comment: "")
-                    }
-                } else if (type == .save) {
-                    subscribeWaterMarkWindowController.waterMarkView.subscribeLabel.stringValue = NSLocalizedString("Upgrade Now", comment: "")
-                    subscribeWaterMarkWindowController.waterMarkView.waterExportButton.title = NSLocalizedString("Save with Watermark", comment: "")
-                } else {
-                    subscribeWaterMarkWindowController.waterMarkView.waterExportButton.title = NSLocalizedString("Save with Watermark", comment: "")
-                }
-            }
-            
             subscribeWaterMarkController = subscribeWaterMarkWindowController
             subscribeWaterMarkMainWindow = window
             return subscribeWaterMarkWindowController
@@ -227,13 +223,54 @@ class KMSubscribeWaterMarkWindowController: NSWindowController {
     }
     
     func reloadData() {
-        if KMLightMemberManager.manager.isLogin() || tempType == .save {
-            self.waterViewHeightConstrain.constant = 506
+        if KMSubscribeWaterMarkWindowController.canShowLoginBenefits() {
+            self.waterViewHeightConstrain.constant = 462
         } else {
-            self.waterViewHeightConstrain.constant = 643
+            self.waterViewHeightConstrain.constant = 563
         }
         self.waterMarkView.type = tempType
         self.waterMarkView.updateConstraints()
+        
+        self.updateLanguage()
+    }
+    
+    func updateLanguage() {
+        if self.waterMarkView != nil {
+            if tempContinue {
+                self.waterMarkView.waterExportButton.title = NSLocalizedString("Save with Watermark", comment: "")
+            } else {
+                if tempType == .merge {
+                    if (tempLimit) {
+                        self.waterMarkView.waterExportButton.title = NSLocalizedString("Exceed Times Limit", comment: "")
+                        self.waterMarkView.isSecondEnable = false
+                        
+                        self.waterMarkView.subscribeLabel.stringValue = NSLocalizedString("Upgrade Now", comment: "")
+                    } else {
+                        self.waterMarkView.isSecondEnable = true
+                        self.waterMarkView.waterExportButton.title = NSLocalizedString("Delete Files from List", comment: "")
+                    }
+                } else if tempType.isConvertType() {
+                    if (tempLimit) {
+                        self.waterMarkView.waterExportButton.title = NSLocalizedString("Exceed Times Limit", comment: "")
+                        self.waterMarkView.isSecondEnable = false
+                        
+                        self.waterMarkView.subscribeLabel.stringValue = NSLocalizedString("Upgrade Now", comment: "")
+                    } else {
+                        self.waterMarkView.isSecondEnable = true
+    //                        if KMLightMemberManager.manager.isLogin() {
+                        self.waterMarkView.waterExportButton.title = NSLocalizedString("Convert First 10 Pages", comment: "")
+    //                        } else {
+    //                            subscribeWaterMarkWindowController.waterMarkView.waterExportButton.title = NSLocalizedString("Later", comment: "")
+    //                        }
+                    }
+                } else if (type == .save) {
+                    self.waterMarkView.subscribeLabel.stringValue = NSLocalizedString("Upgrade Now", comment: "")
+                    self.waterMarkView.waterExportButton.title = NSLocalizedString("Save with Watermark", comment: "")
+                } else {
+                    self.waterMarkView.waterExportButton.title = NSLocalizedString("Save with Watermark", comment: "")
+                }
+            }
+        }
     }
     
     static func isSampleController() -> KMSubscribeWaterMarkWindowController {
@@ -245,6 +282,10 @@ class KMSubscribeWaterMarkWindowController: NSWindowController {
         }
         return KMSubscribeWaterMarkWindowController()
     }
+    
+    static func canShowLoginBenefits() -> Bool {
+        return KMLightMemberManager.manager.isLogin() || tempType == .save || ((tempType.isConvertType() || tempType == .merge) && tempLimit)
+    }
 }
 
 // MARK: - Analytics (埋点)

+ 4 - 4
PDF Office/PDF Master/Class/KMLightMember/Controller/SubscriptionView/WaterMark/KMSubscribeWaterMarkWindowController.xib

@@ -18,16 +18,16 @@
         <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5">
             <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
             <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
-            <rect key="contentRect" x="196" y="240" width="450" height="643"/>
+            <rect key="contentRect" x="196" y="240" width="450" height="563"/>
             <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1415"/>
             <view key="contentView" id="se5-gp-TjO">
-                <rect key="frame" x="0.0" y="0.0" width="450" height="643"/>
+                <rect key="frame" x="0.0" y="0.0" width="450" height="564"/>
                 <autoresizingMask key="autoresizingMask"/>
                 <subviews>
                     <customView translatesAutoresizingMaskIntoConstraints="NO" id="kKR-sQ-MOd" customClass="KMSubscribeWaterMarkView" customModule="PDF_Master" customModuleProvider="target">
-                        <rect key="frame" x="0.0" y="0.0" width="450" height="643"/>
+                        <rect key="frame" x="0.0" y="0.0" width="450" height="564"/>
                         <constraints>
-                            <constraint firstAttribute="height" constant="643" id="hGQ-d7-hqP"/>
+                            <constraint firstAttribute="height" constant="564" id="hGQ-d7-hqP"/>
                         </constraints>
                     </customView>
                 </subviews>

+ 50 - 27
PDF Office/PDF Master/Class/KMLightMember/Controller/SubscriptionView/WaterMark/View/KMSubscribeWaterMarkView.swift

@@ -29,6 +29,7 @@ class KMSubscribeWaterMarkView: KMBaseXibView {
     @IBOutlet weak var subscribeLabel: NSTextField!
     @IBOutlet weak var subscribeBox: KMBox!
     @IBOutlet weak var lineView: NSView!
+    @IBOutlet weak var cancelBox: KMBox!
     
     var closeAction: KMSubscribeWaterMarkViewCancelAction?
     var subscribeAction: KMSubscribeWaterMarkViewSubscribeAction?
@@ -44,37 +45,53 @@ class KMSubscribeWaterMarkView: KMBaseXibView {
     }
     
     var afterLoginDataArray = [
-        ["title": "Save without watermark",
-         "subtitle": "When you save a document with PDF Master after editing, no watermark will be attached",
+        ["title": "Save without Watermark",
+         "subtitle": "Free trial version will add a PDF Master official watermark to the document when saving.",
          "image": "remove watermark"],
 //        ["title": "AI assitant",
 //         "subtitle": "Support AI translation, AI rewriting, AI correction",
 //         "image": "ai"],
-        ["title": "Convert PDF without limitation",
-         "subtitle": "Convert PDF to Office and image without any limitations, get converted files in high quality",
+        ["title": "Convert without Page Limit",
+         "subtitle": "Free trial users can only convert the first 10 pages of a document.",
          "image": "convert"],
-        ["title": "Batch Processing",
-         "subtitle": "The trial version can merge only 2 files at a time in batch processing",
+        ["title": "Merge PDFs without Limitation",
+         "subtitle": "Free trial users can only combine 2 files at once.",
          "image": "merging"]
     ]
     
     var beforeLoginDataArray = [
-        ["title": "AI Document Processing",
-         "subtitle": "AI Translate; Al Rewrite, AI Correction, Completely free to use 5 times/month.",
+        ["title": "AI Assistant",
+         "subtitle": "AI translation, AI rewriting, AI correction.",
          "image": "ai"],
-        ["title": "Unlimited times to conversion first 10 pages",
-         "subtitle": "Trial Version users can only convert the first 10 pages of a document 2 times.",
+        ["title": "Unlimited Conversion Times",
+         "subtitle": "Free trial users can only convert the first ten pages of a PDF, up to 2 times.",
          "image": "convert"],
-        ["title": "Unlimited times to batch merge 2 documents",
-         "subtitle": "Trial Version users can only merge 2 files at a time in batch processing, and only merge 2 times.",
+        ["title": "Unlimited Merge Times",
+         "subtitle": "Free trial users can merge two files at once, up to 2 times.",
          "image": "merging"],
-        ["title": "Full function trial",
-         "subtitle": "Login will unlock trial of all features.",
+        ["title": "Unlock All Functions",
+         "subtitle": "Log in to free trial all features.",
          "image": "full function trial"]
     ]
     
     let popover = NSPopover()
     var isSubscription: Bool = false
+    var isSecondEnable: Bool = true {
+        didSet {
+            if isSecondEnable {
+                self.cancelBox.isHidden = !isSecondEnable
+                self.waterExportButton.isEnabled = isSecondEnable
+            } else {
+                self.cancelBox.isHidden = !isSecondEnable
+//                self.waterExportButton.isEnabled = isSecondEnable
+                self.waterExportButton.contentTintColor = NSColor(hex: "#F3465B")
+                self.waterExportButton.backgroundColor(NSColor.clear)
+                self.waterExportButton.border(NSColor(hex: "#DFE1E5"), 0, 20)
+//                self.waterExportButton.contentTintColor = NSColor(hex: "#252629")
+                self.waterExportButton.font = NSFont.SFProTextRegular(12)
+            }
+        }
+    }
     
     override func setup() {
         self.closeBox.moveCallback = { [weak self] (mouseEntered, mouseBox) in
@@ -125,6 +142,14 @@ class KMSubscribeWaterMarkView: KMBaseXibView {
             }
         }
         
+        self.cancelBox.moveCallback = { [weak self] (mouseEntered, mouseBox) in
+            if mouseEntered {
+                self?.waterExportButton?.backgroundColor(NSColor(hex: "#DFE1E5"))
+            } else {
+                self?.waterExportButton?.backgroundColor(NSColor(hex: "#EDEEF0"))
+            }
+        }
+        
         self.lineView.backgroundColor(NSColor(hex: "#000000").withAlphaComponent(0.1))
         
         // 获取包含 NSCollectionView 的 NSScrollView
@@ -138,31 +163,26 @@ class KMSubscribeWaterMarkView: KMBaseXibView {
     }
     
     override func updateLanguage() {
-        if KMLightMemberManager.manager.isLogin() || type == .save {
+        if KMSubscribeWaterMarkWindowController.canShowLoginBenefits() {
             self.subTitleContentView.isHidden = true
             self.subtitleContentHeightConstraint.constant = 0
             self.collectionContentViewHeightConstraint.constant = 368
             self.collectionViewContentTopConstraint.constant = 28
             self.titleLabel.stringValue = NSLocalizedString("Subscription Benefits", comment: "")
-            self.waterExportButton.title = NSLocalizedString("Save with Watermark", comment: "")
+//            self.waterExportButton.title = NSLocalizedString("Save with Watermark", comment: "")
             self.subscribeLabel.stringValue = NSLocalizedString("Upgrade Now", comment: "")
         } else {
             self.subTitleContentView.isHidden = false
-            self.subtitleContentHeightConstraint.constant = 60
+            self.subtitleContentHeightConstraint.constant = 40
             self.collectionContentViewHeightConstraint.constant = 330
-            self.collectionViewContentTopConstraint.constant = 96
+            self.collectionViewContentTopConstraint.constant = 76
             self.titleLabel.stringValue = NSLocalizedString("Login Benefits", comment: "")
-            self.waterExportButton.title = NSLocalizedString("Later", comment: "")
+//            self.waterExportButton.title = NSLocalizedString("Later", comment: "")
             self.subscribeLabel.stringValue = NSLocalizedString("Login or Sign up", comment: "")
         }
 //        + "  " + NSLocalizedString("Subscription", comment: ""
         
-        var subtitleString = ""
-        if type == .merge {
-            subtitleString = NSLocalizedString("The trial version can merge only 2 files at a time in batch processing. Login or sign up PDF Master to speed your workflow!", comment: "")
-        } else {
-            subtitleString = NSLocalizedString("Login or sign up PDF Master lets you enjoy all features including annotating, text editing and page organization for FREE!", comment: "")
-        }
+        var subtitleString = NSLocalizedString("Register as a PDF Master member to enjoy premium features", comment: "")
         let paragraphStyle = NSMutableParagraphStyle()
         paragraphStyle.lineHeightMultiple = 1.32
         paragraphStyle.alignment = .left
@@ -171,7 +191,7 @@ class KMSubscribeWaterMarkView: KMBaseXibView {
     }
 
     override func reloadData() {
-        if KMLightMemberManager.manager.isLogin() || type == .save {
+        if KMSubscribeWaterMarkWindowController.canShowLoginBenefits() {
             self.dataArray = afterLoginDataArray
         } else {
             self.dataArray = beforeLoginDataArray
@@ -188,6 +208,9 @@ extension KMSubscribeWaterMarkView {
     }
     
     @IBAction func waterMarkExportButtonAction(_ sender: Any) {
+        if !isSecondEnable {
+            return
+        }
         guard let callBack = waterMarkExportAction else { return }
         
         callBack(self)
@@ -241,7 +264,7 @@ extension KMSubscribeWaterMarkView: NSCollectionViewDelegateFlowLayout {
         paragraphStyle.alignment = .left
         let size: NSSize = string.boundingRect(with: NSSize(width: 350, height: 100), options: NSString.DrawingOptions(rawValue: 3), attributes: [NSAttributedString.Key.font : NSFont.SFProTextSemibold(14), NSAttributedString.Key.paragraphStyle : paragraphStyle]).size
         let subtitleSize: NSSize = subtitleString.boundingRect(with: NSSize(width: 350, height: 100), options: NSString.DrawingOptions(rawValue: 3), attributes: [NSAttributedString.Key.font : NSFont.SFProTextRegular(12), NSAttributedString.Key.paragraphStyle : paragraphStyle]).size
-        return NSSize(width: 394, height: max(66, size.height + subtitleSize.height + 4))
+        return NSSize(width: 394, height: max(44, size.height + subtitleSize.height + 4))
     }
 
     public func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, insetForSectionAt section: Int) -> NSEdgeInsets {

+ 14 - 0
PDF Office/PDF Master/Class/KMLightMember/Controller/SubscriptionView/WaterMark/View/KMSubscribeWaterMarkView.xib

@@ -8,6 +8,7 @@
     <objects>
         <customObject id="-2" userLabel="File's Owner" customClass="KMSubscribeWaterMarkView" customModule="PDF_Master" customModuleProvider="target">
             <connections>
+                <outlet property="cancelBox" destination="jWg-hU-mD1" id="H2W-w0-mWK"/>
                 <outlet property="closeBox" destination="msn-nQ-xqN" id="QFo-LV-8P3"/>
                 <outlet property="closeButton" destination="bTN-v2-Eaj" id="h2L-kr-Gi9"/>
                 <outlet property="collectionContentViewHeightConstraint" destination="7MQ-oW-O1o" id="Hln-jO-fcD"/>
@@ -153,6 +154,16 @@
                         <constraint firstAttribute="trailing" secondItem="FOh-IP-TS8" secondAttribute="trailing" id="z4M-RT-EKq"/>
                     </constraints>
                 </customView>
+                <box boxType="custom" borderWidth="0.0" cornerRadius="4" translatesAutoresizingMaskIntoConstraints="NO" id="jWg-hU-mD1" customClass="KMBox" customModule="PDF_Master" customModuleProvider="target">
+                    <rect key="frame" x="28" y="32" width="396" height="40"/>
+                    <view key="contentView" id="Dsr-H8-aIS">
+                        <rect key="frame" x="0.0" y="0.0" width="396" height="40"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                    </view>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="40" id="yih-N5-o8h"/>
+                    </constraints>
+                </box>
                 <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ki6-ve-E1f">
                     <rect key="frame" x="28" y="32" width="396" height="40"/>
                     <buttonCell key="cell" type="square" title="Watermark Saving" bezelStyle="shadowlessSquare" alignment="center" imageScaling="proportionallyDown" inset="2" id="bo3-42-gLB">
@@ -199,6 +210,7 @@
             <constraints>
                 <constraint firstItem="MG4-H3-ZA1" firstAttribute="top" secondItem="2cQ-02-iHc" secondAttribute="bottom" constant="96" id="1nd-N2-IpE"/>
                 <constraint firstItem="Ja4-Z7-bde" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="28" id="5v1-aH-ewg"/>
+                <constraint firstItem="jWg-hU-mD1" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="28" id="7Cy-az-uRj"/>
                 <constraint firstItem="2cQ-02-iHc" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" constant="40" id="GRL-zJ-hGD"/>
                 <constraint firstItem="ki6-ve-E1f" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="28" id="HdL-el-MI0"/>
                 <constraint firstItem="ki6-ve-E1f" firstAttribute="top" secondItem="zsU-gX-vjE" secondAttribute="bottom" constant="16" id="I4R-Ku-dLc"/>
@@ -207,6 +219,8 @@
                 <constraint firstItem="2cQ-02-iHc" firstAttribute="centerX" secondItem="c22-O7-iKe" secondAttribute="centerX" id="Tab-Sj-Pk5"/>
                 <constraint firstItem="q0v-nJ-k2O" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" id="Vaq-qD-AWK"/>
                 <constraint firstItem="Ja4-Z7-bde" firstAttribute="top" secondItem="2cQ-02-iHc" secondAttribute="bottom" constant="16" id="XOd-vi-3Iz"/>
+                <constraint firstAttribute="trailing" secondItem="jWg-hU-mD1" secondAttribute="trailing" constant="28" id="YM4-vh-fXm"/>
+                <constraint firstAttribute="bottom" secondItem="jWg-hU-mD1" secondAttribute="bottom" constant="32" id="b7z-Hc-lvQ"/>
                 <constraint firstItem="MG4-H3-ZA1" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="28" id="mY1-qU-Bkt"/>
                 <constraint firstAttribute="trailing" secondItem="q0v-nJ-k2O" secondAttribute="trailing" id="pkz-AD-sVC"/>
                 <constraint firstItem="zsU-gX-vjE" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="28" id="sYP-io-kre"/>

+ 63 - 38
PDF Office/PDF Master/Class/KMLightMember/InAppPurchase/Appstore/KMInAppPurchaseManager.swift

@@ -33,11 +33,11 @@ let kStoreLiteKitSecret = "905532d3f55449a9b7a96161e7a2d538";
 //let kStoreKitSecret = "20f0129197a34439a2130358172984bb";
 #endif
 
-#if DEBUG
+//#if DEBUG
     let kServerURL = "https://sandbox.itunes.apple.com/verifyReceipt"
-#else
-    let kServerURL = "https://buy.itunes.apple.com/verifyReceipt"
-#endif
+//#else
+//    let kServerURL = "https://buy.itunes.apple.com/verifyReceipt"
+//#endif
 
 let keychainAccessGroup = "your.keychain.access.group"
 let receiptDataLabel = "receiptData"
@@ -46,7 +46,7 @@ enum KMInAppPurchaseState: String, CaseIterable {
     case success = "Purchase Successfully"//"购买成功"
     case failed = "Purchase Failed"//"购买失败"
     case cancel = "Cancel Purchase"//"取消购买"
-    case verFailed = "Order Verification Filed"//"订单校验失败"
+    case verFailed = "Order Verification Failed"//"订单校验失败"
     case verSuccess = "Order Verification Successful"//"订单校验成功"
     case verServerFailed = "Server Order Verification Failed"//"服务器订单校验失败"
     case notArrow = "In-app Purchases not Allowed" //"不允许内购"
@@ -135,12 +135,13 @@ class KMInAppPurchaseManager: NSObject {
     }
     
     func restorePurchases(_ orderId: String = "", _ completetion: @escaping KMPurchaseRestoreCompletion) {
+        KMPrint("开始restore")
         restoreCompletion = completetion
         self.orderId = orderId
         SKPaymentQueue.default().restoreCompletedTransactions()
     }
     
-    //MARK: 购买返回类型
+    //MARK: 购买返回类型集中处理
     func handleAction(state: KMInAppPurchaseState) {
 #if DEBUG
         KMPrint(state.rawValue)
@@ -149,6 +150,9 @@ class KMInAppPurchaseManager: NSObject {
             if state == .verSuccess {
                 purchaseProductCompletion?(true, state)
                 purchaseProductCompletion = nil
+                
+                restoreCompletion?(true, state)
+                restoreCompletion = nil
             } else if state == .restoreFailed ||
                         state == .restoreVerFailed {
                 restoreCompletion?(false, state)
@@ -180,6 +184,19 @@ class KMInAppPurchaseManager: NSObject {
                 fetchProductCompletion = nil
                 checkSubscriptionStatusCompletion = nil
             }
+            
+            if state == .noReceipt || state == .restoreFailed || state == .restoreVerFailed {
+                self.removeReceiptInfo()
+                KMLightMemberManager.manager.reloadUserInfo()
+            }
+            
+            if state == .verFailed ||
+                state == .verSuccess ||
+                state == .restoreVerFailed ||
+                state == .restoreVerSuccess {
+                //刷新用户信息
+                KMLightMemberManager.manager.reloadUserInfo()
+            }
         }
     }
     
@@ -307,7 +324,8 @@ extension KMInAppPurchaseManager: SKPaymentTransactionObserver {
         if let receiptURL = Bundle.main.appStoreReceiptURL,
            let receiptData = try? Data(contentsOf: receiptURL) {
             // 将购买凭证发送到服务器进行验证
-            sendReceiptToServer(receiptData: receiptData, transaction: transaction)
+//            sendReceiptToServer(receiptData: receiptData, transaction: transaction)
+            sendReceiptToAppleServer(receiptData: receiptData, transaction: transaction)
         } else {
             self.handleAction(state: .noReceipt)
         }
@@ -366,7 +384,7 @@ extension KMInAppPurchaseManager: SKPaymentTransactionObserver {
 //        SKPaymentQueue.default().finishTransaction(transaction)
     }
     
-    func sendReceiptToAppleServer(receiptData: Data, transaction: SKPaymentTransaction) {
+    func sendReceiptToAppleServer(receiptData: Data, transaction: SKPaymentTransaction?) {
         // 构建请求
 //        let url = URL(string: "https://your-server.com/verify-receipt")!
 //        let requestContents = ["receipt-data" : receipt.base64EncodedString()]
@@ -375,6 +393,7 @@ extension KMInAppPurchaseManager: SKPaymentTransactionObserver {
                                               "password": kStoreLiteKitSecret]
         guard let requestData = try? JSONSerialization.data(withJSONObject: requestContents, options: []) else {
             // 交易凭证为空验证失败
+            self.handleAction(state: .failed)
             return
         }
         
@@ -390,17 +409,35 @@ extension KMInAppPurchaseManager: SKPaymentTransactionObserver {
                 let verificationResult = self.parseVerificationResult(data: data)
                 if verificationResult {
                     // 购买凭证验证成功,进行购买成功的逻辑
+                    self.handleAction(state: .verSuccess)
                     // ...
                 } else {
+                    self.handleAction(state: .verFailed)
+                    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1, execute: {
+                        let alert = NSAlert()
+                        alert.messageText = NSLocalizedString("Unable to Log in", comment: "")
+                        alert.informativeText = NSLocalizedString(error!.localizedDescription, comment: "")
+                        alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))
+                        var window = NSApp.mainWindow
+                        if NSApp.mainWindow?.sheets.first != nil {
+                            window = NSApp.mainWindow?.sheets.first
+                        }
+                        if window != nil {
+                            alert.beginSheetModal(for: window!) { result in
+                                
+                            }
+                        }
+                    })
+                    
                     // 购买凭证验证失败,进行购买失败的逻辑
                     // ...
                 }
             } else if error != nil {
                 // 处理网络请求错误
                 // ...
-                self.handleAction(state: .failed)
+                self.handleAction(state: .verFailed)
             }
-            SKPaymentQueue.default().finishTransaction(transaction)
+//            SKPaymentQueue.default().finishTransaction(transaction)
         }
         task.resume()
     }
@@ -431,40 +468,14 @@ extension KMInAppPurchaseManager: SKPaymentTransactionObserver {
         // 如果验证成功返回 true,否则返回 false
         // ...
         let receipt: [String: Any] = self.parseReceipt(receiptData: data) ?? [:]
+        KMPrint(receipt)
         let status: Int = receipt["status"] as! Int
         if status == 21007 {
             self.handleAction(state: .verFailed)
 //            [self verifyPurchaseWithPaymentTransaction:transaction isTestServer:YES];
         } else if status == 0 {
             //保存票据信息
-            UserDefaults.standard.set(receipt, forKey: "kInAppPurchaseReceipt")
-            UserDefaults.standard.synchronize()
-            
-            let state = self.verifyPurchase(purchase: receipt)
-            if state == .subscription {
-                self.handleAction(state: .verSuccess)
-            } else {
-                self.handleAction(state: .verFailed)
-            }
-        } else {
-            self.handleAction(state: .verFailed)
-        }
-        return true
-    }
-    
-    func parseAppleVerificationResult(data: Data) -> Bool {
-        // 解析服务器返回的验证结果
-        // 如果验证成功返回 true,否则返回 false
-        // ...
-        let receipt: [String: Any] = self.parseReceipt(receiptData: data) ?? [:]
-        let status: Int = receipt["status"] as! Int
-        if status == 21007 {
-            self.handleAction(state: .verFailed)
-//            [self verifyPurchaseWithPaymentTransaction:transaction isTestServer:YES];
-        } else if status == 0 {
-            //保存票据信息
-            UserDefaults.standard.set(receipt, forKey: "kInAppPurchaseReceipt")
-            UserDefaults.standard.synchronize()
+            self.saveReceiptInfo(receipt: receipt)
             
             let state = self.verifyPurchase(purchase: receipt)
             if state == .subscription {
@@ -580,3 +591,17 @@ extension KMInAppPurchaseManager: SKPaymentTransactionObserver {
         return receipt
     }
 }
+
+extension KMInAppPurchaseManager {
+    func saveReceiptInfo(receipt: [String: Any]) {
+        //保存票据信息
+        UserDefaults.standard.set(receipt, forKey: "kInAppPurchaseReceipt")
+        UserDefaults.standard.synchronize()
+    }
+    
+    func removeReceiptInfo() {
+        //保存票据信息
+        UserDefaults.standard.set([], forKey: "kInAppPurchaseReceipt")
+        UserDefaults.standard.synchronize()
+    }
+}

+ 30 - 0
PDF Office/PDF Master/Class/KMLightMember/InAppPurchase/DMG/KMDMGPurchaseManager.swift

@@ -13,6 +13,36 @@ class KMDMGPurchaseManager: NSObject {
     
     var availableProducts: [KMProduct] = []
     
+    var state: KMPurchaseManagerState {
+        get {
+            return self.updatePurchaseState()
+        }
+    }
+    
+    func updatePurchaseState() -> KMPurchaseManagerState {
+        let info = KMLightMemberManager.manager.info.subscriptionInfoList
+        var tempState: KMPurchaseManagerState = .unknow
+        if info.count > 0 {
+            for item in info {
+                switch item.status {
+                case 0:
+                    tempState = .unknow
+                case 1:
+                    tempState = .subscription
+                case 2:
+                    tempState = .subscriptionExpired
+                case 3:
+                    tempState = .trial
+                case 4:
+                    tempState = .trialExpired
+                default:
+                    tempState = .unknow
+                }
+            }
+        }
+        return tempState
+    }
+    
     func purchaseProduct(productIdentifier: String, email: String, completion: KMPurchaseCompletion) {
 //        NSWorkspace.shared.open(URL(string: "http://test-pdf-pro.kdan.cn:3021/master/checkout?email=\(email)")!)
 #if DEBUG

+ 14 - 31
PDF Office/PDF Master/Class/KMLightMember/InAppPurchase/KMPurchaseManager.swift

@@ -30,30 +30,13 @@ class KMPurchaseManager: NSObject {
         get {
 #if DEBUG
             //方便调整订阅状态
-//            return .subscriptionExpired
+//            return .subscription
 #endif
-            let info = KMLightMemberManager.manager.info.subscriptionInfoList
-            var tempState: KMPurchaseManagerState = .unknow
-            if info.count > 0 {
-                let isSubscription = false
-                for item in info {
-                    switch item.status {
-                    case 0:
-                        tempState = .unknow
-                    case 1:
-                        tempState = .subscription
-                    case 2:
-                        tempState = .subscriptionExpired
-                    case 3:
-                        tempState = .trial
-                    case 4:
-                        tempState = .trialExpired
-                    default:
-                        tempState = .unknow
-                    }
-                }
+            if KMInAppPurchaseManager.manager.state == .subscription {
+                return .subscription
+            } else {
+                return KMDMGPurchaseManager.manager.state
             }
-            return tempState
         }
     }
     var availableProducts: [KMProduct] = []
@@ -81,21 +64,21 @@ class KMPurchaseManager: NSObject {
         KMPrint("正在订阅中AppStore")
         
         let userId: String = KMLightMemberManager.manager.info.id
-        KMRequestServerManager.manager.createOrder(productId: "21", userId: userId) { success, orderId, result in
-            if success {
-                if orderId?.count != 0 {
-                    KMInAppPurchaseManager.manager.purchaseProduct(productIdentifier: PRODUCT_1, orderId: orderId!) { isSuccess, error in
+//        KMRequestServerManager.manager.createOrder(productId: "21", userId: userId) { success, orderId, result in
+//            if success {
+//                if orderId?.count != 0 {
+                    KMInAppPurchaseManager.manager.purchaseProduct(productIdentifier: PRODUCT_1) { isSuccess, error in
                         if isSuccess {
                             completion(true, error)
                         } else {
                             completion(false, error)
                         }
                     }
-                }
-            } else {
-                completion(false, .orderFailed)
-            }
-        }
+//                }
+//            } else {
+//                completion(false, .orderFailed)
+//            }
+//        }
 #endif
         
 #if VERSION_DMG

+ 13 - 3
PDF Office/PDF Master/Class/KMLightMember/Manager/KMLightMemberManager.swift

@@ -168,17 +168,27 @@ extension KMLightMemberManager {
             tokenValid = await self.isTokenValid()
         }
         KMPrint(tokenValid)
-        if tokenValid && info.isInFreeUseTime {
+        if tokenValid && info.isInFreeUseTime || (self.purchaseState == .subscription || self.purchaseState == .trial) {
             result = true
         }
         return result
     }
     
+//    //是否能使用付费功能
+//    func canPayFunction(needNetworking: Bool = false) async -> Bool {
+//        var result: Bool = false
+//        //先确认可以使用高级功能,再确认是否已经订阅
+//        if await self.canUseAdvanced(needNetworking: needNetworking) && (self.purchaseState == .subscription || self.purchaseState == .trial) {
+//            result = true
+//        }
+//        return result
+//    }
+    
     //是否能使用付费功能
-    func canPayFunction(needNetworking: Bool = false) async -> Bool {
+    func canPayFunction() -> Bool {
         var result: Bool = false
         //先确认可以使用高级功能,再确认是否已经订阅
-        if await self.canUseAdvanced(needNetworking: needNetworking) && (self.purchaseState == .subscription || self.purchaseState == .trial) {
+        if (self.purchaseState == .subscription || self.purchaseState == .trial) {
             result = true
         }
         return result

+ 4 - 4
PDF Office/PDF Master/Class/KMLightMember/Model/KMLightMemberUserInfo.swift

@@ -167,11 +167,11 @@ extension KMLightMemberUserInfo {
                 array.append(item)
             }
         }
-        if subscriptionList.count > 1 {
+//        if subscriptionList.count > 1 {
             result.existOrderInfo = true
-        } else {
-            result.existOrderInfo = false
-        }
+//        } else {
+//            result.existOrderInfo = false
+//        }
         result.subscriptionInfoList = array
         return result
     }

+ 12 - 0
PDF Office/PDF Master/Class/KMLightMember/Source/KMLightMember.xcassets/Image_PopupDMG.imageset/Contents.json

@@ -0,0 +1,12 @@
+{
+  "images" : [
+    {
+      "filename" : "Popup dmg.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
PDF Office/PDF Master/Class/KMLightMember/Source/KMLightMember.xcassets/Image_PopupDMG.imageset/Popup dmg.pdf


+ 12 - 0
PDF Office/PDF Master/Class/KMLightMember/Source/KMLightMember.xcassets/image_PopupAppstore.imageset/Contents.json

@@ -0,0 +1,12 @@
+{
+  "images" : [
+    {
+      "filename" : "Popup Appstore.pdf",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
PDF Office/PDF Master/Class/KMLightMember/Source/KMLightMember.xcassets/image_PopupAppstore.imageset/Popup Appstore.pdf


+ 124 - 27
PDF Office/PDF Master/Class/Merge/OCPart/KMPDFEditAppendWindow.m

@@ -199,7 +199,7 @@ static KMPDFEditAppendWindow *windowController = nil;
 
 @property (assign) IBOutlet KMBlankView *myBlankView;
 @property (weak) IBOutlet NSTextField *limitLable;
-
+@property (weak) IBOutlet NSImageView *limitTipIv;
 
 @property (nonatomic, strong) PasswordWindowController *passwordWindowController;
 @property (nonatomic, strong) KMSavePanelAccessoryController *savePanelAccessoryViewController;
@@ -223,6 +223,9 @@ static KMPDFEditAppendWindow *windowController = nil;
 {
     _tableView.delegate = nil;
     _tableView.dataSource = nil;
+#if VERSION_DMG
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+#endif
 }
 
 //没有打开文档,选择he'bing
@@ -270,10 +273,37 @@ static KMPDFEditAppendWindow *windowController = nil;
     file.oriFilePath = oriDucumentUrl.path;
 }
 
+- (void)km_windowWillCloseNotifation:(NSNotification *)noti {
+    __weak typeof(self) weakSelf = self;
+    BOOL result = [KMLightMemberManager.manager canPayFunction];
+    self.limit = !result;
+        
+    if (result) {
+        self.limitLable.hidden = YES;
+        self.limitTipIv.hidden = YES;
+    } else {
+        [KMLightMemberManager.manager canUseAdvancedWithNeedNetworking:NO completionHandler:^(BOOL isLogin) {
+            dispatch_sync(dispatch_get_main_queue(), ^{
+                if (isLogin) {
+                    weakSelf.limitLable.hidden = NO;
+                    weakSelf.limitTipIv.hidden = NO;
+                } else {
+                    weakSelf.limitLable.hidden = YES;
+                    weakSelf.limitTipIv.hidden = YES;
+                }
+            });
+        }];
+    }
+}
+
 - (void)windowDidLoad {
     
     [super windowDidLoad];
     
+#if VERSION_DMG
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(km_windowWillCloseNotifation:) name:NSWindowWillCloseNotification object:nil];
+#endif
+    
     if ([self mergeCountIsReach]) {
         NSLog(@"合并次数已达到限制. count: %ld", [self getMergeCount]);
     }
@@ -478,17 +508,32 @@ static KMPDFEditAppendWindow *windowController = nil;
     self.limitLable.textColor = [[NSColor alloc] initWithHex:@"#F3465B" alpha:1];
     
     self.limit = NO;
-    [KMLightMemberManager.manager canPayFunctionWithNeedNetworking:NO completionHandler:^(BOOL result) {
-        weakSelf.limit = !result;
+    
+    BOOL result = [KMLightMemberManager.manager canPayFunction];
+    self.limit = !result;
+    
+    if (result) {
+        self.limitLable.hidden = YES;
+        self.limitTipIv.hidden = YES;
+    } else {
+#if VERSION_DMG
+        [KMLightMemberManager.manager canUseAdvancedWithNeedNetworking:NO completionHandler:^(BOOL isLogin) {
+            dispatch_sync(dispatch_get_main_queue(), ^{
+                if (isLogin) {
+                    weakSelf.limitLable.hidden = NO;
+                    weakSelf.limitTipIv.hidden = NO;
+                } else {
+                    weakSelf.limitLable.hidden = YES;
+                    weakSelf.limitTipIv.hidden = YES;
+                }
+            });
+        }];
         
-        dispatch_sync(dispatch_get_main_queue(), ^{
-            if (result) {
-                weakSelf.limitLable.hidden = YES;
-            } else {
-                weakSelf.limitLable.hidden = NO;
-            }
-        });
-    }];
+#else
+        self.limitLable.hidden = NO;
+        self.limitTipIv.hidden = NO;
+#endif
+    }
 }
 
 - (void)updateButtonState
@@ -1140,29 +1185,74 @@ static KMPDFEditAppendWindow *windowController = nil;
     if (!self.canMerge) {
         return;
     }
-    
+#if VERSION_DMG
+    [KMLightMemberManager.manager canUseAdvancedWithNeedNetworking:NO completionHandler:^(BOOL result) {
+        dispatch_async(dispatch_get_main_queue(), ^{
+            if (result) {
+                [self doAppend];
+            } else {
+                [KMComparativeTableViewController showWithWindow:self.window :KMComparativeInputTypeMerge inputType:KMSubscribeWaterMarkTypeMerge];
+            }
+        });
+    }];
+#else
+    [self doAppend];
+#endif
+}
+
+- (IBAction)doAppend {
     if (KMLightMemberManager.manager.purchaseState != KMPurchaseManagerStateSubscription && _files.count > 2) {
-        [KMSubscribeWaterMarkWindowController showWithWindow: self.window isContinue: false type:KMSubscribeWaterMarkTypeMerge subscribeDidClick:^{
-            
-        } completion:^(BOOL isSub, BOOL isWater, BOOL isClose) {
-            
-        }];
+//        [KMSubscribeWaterMarkWindowController showWithWindow: self.window isContinue: false limit type:KMSubscribeWaterMarkTypeMerge subscribeDidClick:^{
+//
+//        } completion:^(BOOL isSub, BOOL isWater, BOOL isClose) {
+//
+//        }];
+        [KMSubscribeWaterMarkWindowController showWithWindow:self.window isContinue:false limit:[self mergeCountIsReach]  type:KMSubscribeWaterMarkTypeMerge subscribeDidClick:^{
+                    
+                } completion:^(BOOL, BOOL, BOOL) {
+                    
+                }];
         return;
     } else if (KMLightMemberManager.manager.purchaseState != KMPurchaseManagerStateSubscription && _files.count <= 2) {
         __weak typeof(self) weakSelf = self;
-        [KMSubscribeWaterMarkWindowController showWithWindow: self.window isContinue:true type:KMSubscribeWaterMarkTypeMerge subscribeDidClick:^{
-            
-        } completion:^(BOOL isSub, BOOL isWater, BOOL isClose) {
-            if (isWater) {
-                dispatch_async(dispatch_get_main_queue(), ^{
-                    [weakSelf buttonItemClick_Append: sender];
-                });
-            }
-        }];
+//        [KMSubscribeWaterMarkWindowController showWithWindow: self.window isContinue:true type:KMSubscribeWaterMarkTypeMerge subscribeDidClick:^{
+//
+//        } completion:^(BOOL isSub, BOOL isWater, BOOL isClose) {
+//            if (isWater) {
+//                dispatch_async(dispatch_get_main_queue(), ^{
+//                    [weakSelf buttonItemClick_Append: sender];
+//                });
+//            }
+//        }];
+        BOOL isContinue = YES;
+        BOOL limit = [self mergeCountIsReach];
+        if (limit) {
+            isContinue = NO;
+        }
+        
+        [KMSubscribeWaterMarkWindowController showWithWindow:self.window isContinue:isContinue limit:limit  type:KMSubscribeWaterMarkTypeMerge subscribeDidClick:^{
+                    
+                } completion:^(BOOL isSub, BOOL isWater, BOOL isClose) {
+                    if (isClose) {
+                        return;
+                    }
+                    if (isSub) {
+                        dispatch_async(dispatch_get_main_queue(), ^{
+                            [weakSelf buttonItemClick_Append: nil];
+                        });
+                        return;
+                    }
+                    if (isWater && !limit) {
+                        dispatch_async(dispatch_get_main_queue(), ^{
+                            [weakSelf buttonItemClick_Append: nil];
+                        });
+                        return;
+                    }
+                }];
         return;
     }
     
-    [self buttonItemClick_Append: sender];
+    [self buttonItemClick_Append: nil];
 }
 
 - (void)buttonItemClick_Append:(id)sender {
@@ -1706,11 +1796,18 @@ static NSInteger kKMMergeCountMax = 2;
 @implementation KMPDFEditAppendWindow (KMExtension)
 
 - (BOOL)mergeCountIsReach {
+#if VERSION_DMG
+    return NO;
+#else
+    if ([KMLightMemberManager manager].isLogin) {
+        return NO;
+    }
     NSInteger cnt = [self getMergeCount];
     if (cnt >= kKMMergeCountMax) {
         return YES;
     }
     return NO;
+#endif
 }
 
 - (void)recordMergeCount {

+ 17 - 16
PDF Office/PDF Master/Class/Merge/OCPart/KMPDFEditAppendWindow.xib

@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21701" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21507" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
     <dependencies>
         <deployment identifier="macosx"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21701"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21507"/>
         <capability name="Named colors" minToolsVersion="9.0"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
@@ -25,6 +25,7 @@
                 <outlet property="customSizeButton" destination="QI0-GW-5Ii" id="yJe-Zx-UXW"/>
                 <outlet property="fileNameLabel" destination="MiB-cx-nmS" id="Phd-ss-lv2"/>
                 <outlet property="limitLable" destination="0bJ-0I-xhY" id="KBK-fD-3Rg"/>
+                <outlet property="limitTipIv" destination="Sp2-fV-Wrc" id="5Sc-i9-DwJ"/>
                 <outlet property="myBlankView" destination="Bxz-CR-NgQ" id="fja-0n-Ywh"/>
                 <outlet property="nCancelBox" destination="HUw-YH-0kd" id="Df5-e3-Fca"/>
                 <outlet property="nMergeBox" destination="Gzx-57-4ok" id="Qrg-e1-sK9"/>
@@ -49,7 +50,7 @@
             <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
             <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
             <rect key="contentRect" x="196" y="240" width="818" height="600"/>
-            <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1415"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="1440" height="875"/>
             <value key="minSize" type="size" width="818" height="600"/>
             <value key="maxSize" type="size" width="818" height="600"/>
             <view key="contentView" wantsLayer="YES" id="se5-gp-TjO">
@@ -120,7 +121,7 @@
                                                             </textFieldCell>
                                                         </textField>
                                                         <comboBox verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="8V9-7o-ppF">
-                                                            <rect key="frame" x="139" y="11" width="281" height="23"/>
+                                                            <rect key="frame" x="140" y="10" width="280" height="25"/>
                                                             <comboBoxCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" drawsBackground="YES" completes="NO" numberOfVisibleItems="5" id="7AZ-7i-5XC">
                                                                 <font key="font" metaFont="system"/>
                                                                 <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -285,11 +286,11 @@
                     <box title="Box" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="SNg-B0-ys5">
                         <rect key="frame" x="800" y="-4" width="7" height="606"/>
                         <view key="contentView" id="0Wa-d4-jxC">
-                            <rect key="frame" x="4" y="5" width="0.0" height="598"/>
+                            <rect key="frame" x="3" y="3" width="1" height="600"/>
                             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                             <subviews>
                                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ypq-Dp-66v">
-                                    <rect key="frame" x="14" y="569" width="37" height="16"/>
+                                    <rect key="frame" x="14" y="571" width="37" height="16"/>
                                     <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="peH-6j-hGv">
                                         <font key="font" metaFont="system"/>
                                         <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@@ -297,7 +298,7 @@
                                     </textFieldCell>
                                 </textField>
                                 <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="h32-rZ-jac">
-                                    <rect key="frame" x="28" y="352" width="64" height="24"/>
+                                    <rect key="frame" x="28" y="354" width="64" height="24"/>
                                     <constraints>
                                         <constraint firstAttribute="width" constant="64" id="Hww-Pm-Z4F"/>
                                         <constraint firstAttribute="height" constant="24" id="lXW-K7-g2y"/>
@@ -309,7 +310,7 @@
                                     </textFieldCell>
                                 </textField>
                                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="buB-SK-8mO">
-                                    <rect key="frame" x="98" y="356" width="11" height="16"/>
+                                    <rect key="frame" x="98" y="358" width="11" height="16"/>
                                     <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="x" id="4gU-Us-N60">
                                         <font key="font" metaFont="system"/>
                                         <color key="textColor" name="KM_242424_Color40"/>
@@ -317,7 +318,7 @@
                                     </textFieldCell>
                                 </textField>
                                 <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1M5-tW-MRF">
-                                    <rect key="frame" x="115" y="352" width="64" height="24"/>
+                                    <rect key="frame" x="115" y="354" width="64" height="24"/>
                                     <constraints>
                                         <constraint firstAttribute="width" constant="64" id="NNi-a8-ugp"/>
                                         <constraint firstAttribute="height" constant="24" id="UIu-wF-ft6"/>
@@ -329,37 +330,37 @@
                                     </textFieldCell>
                                 </textField>
                                 <customView translatesAutoresizingMaskIntoConstraints="NO" id="cQk-Jd-o6w">
-                                    <rect key="frame" x="16" y="534" width="45" height="22"/>
+                                    <rect key="frame" x="16" y="536" width="45" height="22"/>
                                     <constraints>
                                         <constraint firstAttribute="height" constant="22" id="5bY-aF-fW3"/>
                                     </constraints>
                                 </customView>
                                 <customView translatesAutoresizingMaskIntoConstraints="NO" id="5nS-LC-t5H" customClass="KMImageTitleButton" customModule="PDF_Master" customModuleProvider="target">
-                                    <rect key="frame" x="16" y="504" width="45" height="22"/>
+                                    <rect key="frame" x="16" y="506" width="45" height="22"/>
                                     <constraints>
                                         <constraint firstAttribute="height" constant="22" id="iSV-P3-W8x"/>
                                     </constraints>
                                 </customView>
                                 <customView translatesAutoresizingMaskIntoConstraints="NO" id="85P-Ad-bEf" customClass="KMImageTitleButton" customModule="PDF_Master" customModuleProvider="target">
-                                    <rect key="frame" x="16" y="474" width="45" height="22"/>
+                                    <rect key="frame" x="16" y="476" width="45" height="22"/>
                                     <constraints>
                                         <constraint firstAttribute="height" constant="22" id="Ubd-is-gcz"/>
                                     </constraints>
                                 </customView>
                                 <customView translatesAutoresizingMaskIntoConstraints="NO" id="PNC-MR-g6W" customClass="KMImageTitleButton" customModule="PDF_Master" customModuleProvider="target">
-                                    <rect key="frame" x="16" y="444" width="45" height="22"/>
+                                    <rect key="frame" x="16" y="446" width="45" height="22"/>
                                     <constraints>
                                         <constraint firstAttribute="height" constant="22" id="cMH-MX-phe"/>
                                     </constraints>
                                 </customView>
                                 <customView translatesAutoresizingMaskIntoConstraints="NO" id="ZDa-uQ-GtJ" customClass="KMImageTitleButton" customModule="PDF_Master" customModuleProvider="target">
-                                    <rect key="frame" x="16" y="414" width="45" height="22"/>
+                                    <rect key="frame" x="16" y="416" width="45" height="22"/>
                                     <constraints>
                                         <constraint firstAttribute="height" constant="22" id="o0Q-lr-IX5"/>
                                     </constraints>
                                 </customView>
                                 <customView translatesAutoresizingMaskIntoConstraints="NO" id="QI0-GW-5Ii" customClass="KMImageTitleButton">
-                                    <rect key="frame" x="16" y="384" width="45" height="22"/>
+                                    <rect key="frame" x="16" y="386" width="45" height="22"/>
                                     <constraints>
                                         <constraint firstAttribute="height" constant="22" id="dL3-LB-For"/>
                                     </constraints>
@@ -391,7 +392,7 @@
                                     </connections>
                                 </button>
                                 <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="m7b-I1-lQz">
-                                    <rect key="frame" x="185" y="356" width="27" height="16"/>
+                                    <rect key="frame" x="185" y="358" width="27" height="16"/>
                                     <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="mm" id="xDF-xV-HvN">
                                         <font key="font" metaFont="system"/>
                                         <color key="textColor" name="KM_242424_Color40"/>

+ 62 - 2
PDF Office/PDF Master/Class/PDFTools/Convert/Controller/KMConvertBaseWindowController.swift

@@ -65,6 +65,9 @@ class KMConvertBaseWindowController: KMBaseWindowController {
         
         self.prePDFView?.removeFromSuperview()
         self.prePDFView = nil
+        #if VERSION_DMG
+        NotificationCenter.default.removeObserver(self)
+        #endif
     }
     
     convenience init() {
@@ -85,6 +88,9 @@ class KMConvertBaseWindowController: KMBaseWindowController {
 //        if (self.convertCountIsReach()) {
 //            Swift.debugPrint("转档次数已达到限制. count: \(self.getConvertCount())")
 //        }
+//        #if VERSION_DMG
+        NotificationCenter.default.addObserver(self, selector: #selector(km_windowWillCloseNotifation), name: NSWindow.willCloseNotification, object: nil)
+//        #endif
         
         if (self.documentModel != nil) {
             let document = CPDFDocument(url: self.documentModel!.documentURL)
@@ -186,7 +192,15 @@ class KMConvertBaseWindowController: KMBaseWindowController {
             }
             
             if await (KMLightMemberManager.manager.canPayFunction() == false) {
+                #if VERSION_DMG
+                if (self.limitCount) { // 未登录
+                    self.settingView?.tipView?.isHidden = true
+                } else {
+                    self.settingView?.tipView?.isHidden = false
+                }
+                #else
                 self.settingView?.tipView?.isHidden = false
+                #endif
             } else {
                 self.limit = false
             }
@@ -363,12 +377,28 @@ class KMConvertBaseWindowController: KMBaseWindowController {
         }
         
         Task { @MainActor in
+            #if VERSION_DMG
+            if (await (KMLightMemberManager.manager.canUseAdvanced() == false)) {
+                let _ = KMComparativeTableViewController.show(window: self.window!, .convert)
+                return
+            }
+            #endif
             if await (KMLightMemberManager.manager.canPayFunction() == false) {
                 var isContinue = false
                 if pages.count <= 10 {
                     isContinue = true
                 }
-                let _ = KMSubscribeWaterMarkWindowController.show(window: self.window!, isContinue: isContinue, type: self.subscribeWaterMarkType!) { isSubscribeSuccess, isWaterMarkExport, isClose in
+                
+                var limit = self.convertCountIsReach()
+                if (!self.limitCount) { // 登录
+                    limit = false
+                }
+                
+                if (limit) {
+                    isContinue = false
+                }
+
+                let _ = KMSubscribeWaterMarkWindowController.show(window: self.window!, isContinue: isContinue, limit: limit, type: self.subscribeWaterMarkType!) { isSubscribeSuccess, isWaterMarkExport, isClose in
                     if (isClose) {
                         return
                     }
@@ -376,7 +406,7 @@ class KMConvertBaseWindowController: KMBaseWindowController {
                         self._convertButtonAction()
                         return
                     }
-                    if (isWaterMarkExport) {
+                    if (isWaterMarkExport && !limit) {
                         self._convertButtonAction(limit: true)
                         return
                     }
@@ -784,6 +814,32 @@ class KMConvertBaseWindowController: KMBaseWindowController {
         }
     }
     
+    // MARK: - Notifation Methods
+    
+    @objc private func km_windowWillCloseNotifation() {
+        Task { @MainActor in
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                self.limitCount = true
+            } else {
+                self.limitCount = false
+            }
+            
+            if await (KMLightMemberManager.manager.canPayFunction() == false) {
+                #if VERSION_DMG
+                if (self.limitCount) { // 未登录
+                    self.settingView?.tipView?.isHidden = true
+                } else {
+                    self.settingView?.tipView?.isHidden = false
+                }
+                #else
+                self.settingView?.tipView?.isHidden = false
+                #endif
+            } else {
+                self.limit = false
+            }
+        }
+    }
+    
     // MARK: Progress
     func showProgressWindow() {
         self.hiddenProgressWindow()
@@ -903,11 +959,15 @@ private let kKMConvertCountKey = "KMConvertCountKey"
 private let kKMConvertCountMax = 2
 extension KMConvertBaseWindowController {
     func convertCountIsReach() -> Bool {
+        #if VERSION_DMG
+        return false
+        #else
         let cnt = self.getConvertCount()
         if (cnt >= kKMConvertCountMax) {
             return true
         }
         return false
+        #endif
     }
     
     func recordConvertCount() {

+ 102 - 26
PDF Office/PDF Master/Class/PDFTools/PageEdit/Controller/KMPDFEditViewController.swift

@@ -382,23 +382,29 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
         
         Task { @MainActor in
             self.toolBar.unSelectItem(for: KMToolbarPageEditSplitItemIdentifier)
+//            #if VERSION_DMG
+//            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+//                let _ = KMComparativeTableViewController.show(window: self.view.window!, .pageEdit)
+//                return
+//            }
+//            #endif
 
-            if await (KMLightMemberManager.manager.canPayFunction() == false) {
-                let _ = KMSubscribeWaterMarkWindowController.show(window: self.view.window!, type: .split) { isSubscribeSuccess, isWaterMarkExport, isClose in
-                    if (isClose) {
-                        return
-                    }
-                    if (isSubscribeSuccess) {
-                        self._showSplitWindow()
-                        return
-                    }
-                    if (isWaterMarkExport) {
-                        self._showSplitWindow(limit: true)
-                        return
-                    }
-                }
-                return
-            }
+//            if await (KMLightMemberManager.manager.canPayFunction() == false) {
+//                let _ = KMSubscribeWaterMarkWindowController.show(window: self.view.window!, type: .split) { isSubscribeSuccess, isWaterMarkExport, isClose in
+//                    if (isClose) {
+//                        return
+//                    }
+//                    if (isSubscribeSuccess) {
+//                        self._showSplitWindow()
+//                        return
+//                    }
+//                    if (isWaterMarkExport) {
+//                        self._showSplitWindow(limit: true)
+//                        return
+//                    }
+//                }
+//                return
+//            }
             
             self._showSplitWindow()
         }
@@ -408,6 +414,13 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
         self.trackEvent(type: .reverse)
         
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!, .pageEdit)
+                return
+            }
+            #endif
+
             self.toolBar.unSelectItem(for: KMToolbarPageEditReverseItemIdentifier)
             self.reverseMenuAction(sender: nil)
         }
@@ -449,6 +462,31 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
                 return
             }
             
+            #if VERSION_DMG
+            if let data = self?.canUseAdvanced, !data {
+                _ = KMComparativeTableViewController.show(window: _windowC.window!)
+                return
+            }
+            #endif
+            if let data = self?.canPayFunction, !data {
+                _ = KMSubscribeWaterMarkWindowController.show(window: _windowC.window!, type: .split) { isSubscribeSuccess, isWaterMarkExport, isClose in
+                    if (isClose) {
+                        return
+                    }
+                    if (isSubscribeSuccess) {
+                        self?.km_endSheet()
+                        self?._splitMethod(windowC: _windowC, model: model)
+                        return
+                    }
+                    if (isWaterMarkExport) {
+                        self?.km_endSheet()
+                        self?._splitMethod(windowC: _windowC, model: model, limit: true)
+                        return
+                    }
+                }
+                return
+            }
+            
 //            if self?.canPayFunction == false {
 //                let _ = KMSubscribeWaterMarkWindowController.show(window: windowController.window!, isContinue: true, type: .split) { isSubscribeSuccess, isWaterMarkExport, isClose in
 //                    var limit = true
@@ -519,14 +557,19 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
 //                }
 //            }
             /// 拆分
-            let outputModel = _windowC.model! as! KMPageEditSplitSettingModel
-            self?.km_endSheet()
-            
+            self?._splitMethod(windowC: _windowC, model: model)
+        }
+    }
+    
+    private func _splitMethod(windowC: KMPageEditSplitWindowController, model: KMPageEditSplitSettingModel, limit: Bool = false) {
+        let outputModel = windowC.model! as! KMPageEditSplitSettingModel
+        
+        DispatchQueue.main.async {
             let panel = NSOpenPanel()
             panel.canChooseFiles = false
             panel.canChooseDirectories = true
             panel.canCreateDirectories = true
-            panel.beginSheetModal(for: (self?.view.window)!) { response in
+            panel.beginSheetModal(for: (self.view.window)!) { response in
                 if (response == .cancel) {
                     return
                 }
@@ -537,13 +580,13 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
                 }
                 
                 DispatchQueue.main.async {
-                    self?.showProgressWindow(message: NSLocalizedString("Spliting...", comment: ""))
-                    self?.progressC?.maxValue = Double(file_indexs!.count)
-                    let _document: CPDFDocument = (self?.listView?.document)!
+                    self.showProgressWindow(message: NSLocalizedString("Spliting...", comment: ""))
+                    self.progressC?.maxValue = Double(file_indexs!.count)
+                    let _document: CPDFDocument = (self.listView?.document)!
                     
                     let filePath = "\(panel.url!.path)/\(_document.documentURL.deletingPathExtension().lastPathComponent)"
                     let uniqueFilePath = KMTools.getUniqueFilePath(filePath: filePath)
-//                    Swift.debugPrint(uniqueFilePath)
+                    //                    Swift.debugPrint(uniqueFilePath)
                     if (!FileManager.default.fileExists(atPath: uniqueFilePath)) {
                         try?FileManager.default.createDirectory(atPath: uniqueFilePath, withIntermediateDirectories: true)
                     }
@@ -559,14 +602,14 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
                         
                         let newDocument = CPDFDocument()
                         newDocument?.importPages(indexs, from: _document, at: 0)
-                        self?.progressC?.increment(by: 1.0)
+                        self.progressC?.increment(by: 1.0)
                         if (limit) {
                             let _ = KMTools.saveWatermarkDocument(document: newDocument!, to: URL(fileURLWithPath: filepath))
                         } else {
                             newDocument?.write(to: URL(fileURLWithPath: filepath))
                         }
                     }
-                    self?.hiddenProgressWindow()
+                    self.hiddenProgressWindow()
                     if let _urlString = filepaths.first?.deletingLastPathComponent {
                         NSWorkspace.shared.activateFileViewerSelecting([URL(fileURLWithPath: _urlString)])
                     }
@@ -728,6 +771,13 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
     
     @objc func item_insertCustomPage(sender: NSMenuItem?) {
         Task { @MainActor in
+//            #if VERSION_DMG
+//            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+//                let _ = KMComparativeTableViewController.show(window: self.view.window!, .pageEdit)
+//                return
+//            }
+//            #endif
+
             let windowController = KMPageEditInsertCustomPageWindowController()
             if (self.thumbnailView.selectionIndexPaths.count > 0) {
                 let page = self.getSelectedPage()
@@ -744,6 +794,13 @@ class KMPDFEditViewController: KMPDFThumbViewBaseController {
                     return
                 }
                 
+                #if VERSION_DMG
+                if let data = self?.canUseAdvanced, data == false {
+                    let _ = KMComparativeTableViewController.show(window: self!.currentWindowC!.window!, .pageEdit)
+                    return
+                }
+                #endif
+                
                 /// 插入
                 guard let windowC = self?.kmCurrentWindowC as? KMPageEditInsertCustomPageWindowController else {
                     self?.km_endSheet()
@@ -1023,6 +1080,13 @@ extension KMPDFEditViewController {
 
 extension KMPDFEditViewController: KMThumbnailViewDelegate {
     func thumbnailView(thumbanView: KMThumbnailView, shouldAcceptDrop draggingInfo: NSDraggingInfo, indexPath: IndexPath, dropOperation: NSCollectionView.DropOperation) -> Bool {
+        #if VERSION_DMG
+        if (!self.canUseAdvanced) {
+            let _ = KMComparativeTableViewController.show(window: self.view.window!, .pageEdit)
+            return false
+        }
+        #endif
+
         return true
     }
     func thumbnailView(thumbanView: KMThumbnailView, didDragAddFiles files: [URL], indexpath: IndexPath) {
@@ -1076,6 +1140,18 @@ extension KMPDFEditViewController: KMThumbnailViewDelegate {
     }
     
     func thumbnailView(thumbanView: KMThumbnailView, shouldPasteboardWriterForItemAt indexPath: IndexPath) -> Bool {
+        #if VERSION_DMG
+        if (!self.canUseAdvanced) {
+            DispatchQueue.main.async {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!, .pageEdit)
+            }
+            return false
+        }
+        #endif
+        if (!self.canPayFunction) {
+            return false
+        }
+
         return true
     }
     

+ 2 - 1
PDF Office/PDF Master/Class/PDFTools/PageEdit/View/KMPageEditSplitSettingView.swift

@@ -133,7 +133,7 @@ class KMPageEditSplitSettingView: KMPageEditSettingBaseView {
         
         self.safe_selectRadio(sender: self.oneFileForOnePageVC)
         
-        self.nameLabel.stringValue = NSLocalizedString("File Naming", comment: "")
+        self.nameLabel.stringValue = NSLocalizedString("File Name", comment: "")
         self.nameLabel.textColor = KMAppearance.subtitleColor()
         self.nameLabel.font = .SFProTextSemibold(12)
         
@@ -144,6 +144,7 @@ class KMPageEditSplitSettingView: KMPageEditSettingBaseView {
         self.nameView.layer?.cornerRadius = 4
         self.nameViewLabel.textColor = KMAppearance.titleColor()
         self.nameViewLabel.font = .SFProTextRegular(14)
+        self.nameViewLabel.lineBreakMode = .byTruncatingTail
         
         self.prefixForOrigFileNameVC = KMDesignButton(withType: .CheckBox)
         self.prefixForOrigFileNameCheck.addSubview(self.prefixForOrigFileNameVC!.view)

+ 3 - 3
PDF Office/PDF Master/Class/PDFTools/PageEdit/View/KMPageEditThumbnailItem.xib

@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21701" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="22146" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
     <dependencies>
         <deployment identifier="macosx"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21701"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22146"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
-        <customObject id="-2" userLabel="File's Owner" customClass="KMPageEditThumbnailItem" customModule="PDF_Office" customModuleProvider="target">
+        <customObject id="-2" userLabel="File's Owner" customClass="KMPageEditThumbnailItem" customModule="PDF_Master" customModuleProvider="target">
             <connections>
                 <outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
             </connections>

+ 6 - 0
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Search/KMSearchViewController.swift

@@ -259,6 +259,9 @@ extension KMSearchViewController: NSSearchFieldDelegate {
         self.listView.setHighlightedSelection(nil, animated: true)
         self.listView.setNeedsDisplayAnnotationViewForVisiblePages()
         self.outlineView.deselectAll(nil)
+        
+        //清空搜索词汇
+        self.previousSearchString = ""
     }
 }
 
@@ -298,6 +301,9 @@ extension KMSearchViewController {
         self.reloadData()
         self.delegate?.searchDoneAction?(viewController: self)
         self.doneButton.isHidden = true
+        
+        //清空搜索词汇
+        self.previousSearchString = ""
     }
     
     @IBAction func searchHistoryAction(sender: NSMenuItem) {

+ 136 - 1
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Thumbnail/Base/KMPDFThumbViewBaseController.swift

@@ -143,6 +143,13 @@ class KMPDFThumbViewBaseController: KMBaseViewController {
             return
         }
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                return
+            }
+            #endif
+
             self._undo_deletePages(indexs: self.indexpathsToIndexs(indexpaths: indexpaths))
             self.deleteAfter(indexpaths: indexpaths)
         }
@@ -151,6 +158,13 @@ class KMPDFThumbViewBaseController: KMBaseViewController {
     // 插入文件事件
     public func insertFileAction() {
         Task { @MainActor in
+//            #if VERSION_DMG
+//            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+//                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+//                return
+//            }
+//            #endif
+
             self.km_open_file_multi { [unowned self] index, params in
                 if (self.fetchProgressBlockParamsIsPasswordFile(params: params)) { // 加密文档进度回调
                     return
@@ -181,7 +195,15 @@ class KMPDFThumbViewBaseController: KMBaseViewController {
                     }
                 }
                 
+                #if VERSION_DMG
+                if (!self.canUseAdvanced) {
+                    let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                    return
+                }
+                self.insertPages(pages: pages, at: indexs)
+                #else
                 self.insertPages(pages: pages, at: indexs)
+                #endif
             }
         }
     }
@@ -200,6 +222,13 @@ class KMPDFThumbViewBaseController: KMBaseViewController {
     // 插入空白页面 指定页面大小和位置
     public func insertBlankPage(size: NSSize, at index: Int) {
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                return
+            }
+            #endif
+
             self._undo_insertBlankPage(size: size, at: index)
             self.insertBlankPageAfter(size: size, at: index)
         }
@@ -217,6 +246,13 @@ class KMPDFThumbViewBaseController: KMBaseViewController {
     // 左旋转 指定的item
     public func leftRotateIndexpaths(indexpaths: Set<IndexPath>) {
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                return
+            }
+            #endif
+
             self._undo_leftRotate(indexs: self.indexpathsToIndexs(indexpaths: indexpaths))
             self.leftRotateAfter(indexpaths: indexpaths)
         }
@@ -230,6 +266,13 @@ class KMPDFThumbViewBaseController: KMBaseViewController {
     // 右旋转 指定的item
     @objc func rightRotateIndexpaths(indexpaths: Set<IndexPath>) {
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                return
+            }
+            #endif
+
             self._undo_rightRotate(indexs: self.indexpathsToIndexs(indexpaths: indexpaths))
             self.rightRotateAfter(indexpaths: indexpaths)
         }
@@ -237,6 +280,13 @@ class KMPDFThumbViewBaseController: KMBaseViewController {
     
     public func cutAction() {
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                return
+            }
+            #endif
+
             let indexpaths = self.thumbnailView.selectionIndexPaths
             self._cutPages(indexpaths: indexpaths)
             self.cutAfter(indexpaths: indexpaths)
@@ -245,6 +295,13 @@ class KMPDFThumbViewBaseController: KMBaseViewController {
     
     public func copyAction() {
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                return
+            }
+            #endif
+
             let indexpaths = self.thumbnailView.selectionIndexPaths
             self._copyPages(indexpaths: indexpaths)
             self.copyAfter(indexpaths: indexpaths)
@@ -279,6 +336,13 @@ class KMPDFThumbViewBaseController: KMBaseViewController {
             return
         }
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                return
+            }
+            #endif
+
             let index = self.getPasteIndex()
             self._pastePages(at: index)
             self.pasteAfter(at: index)
@@ -293,6 +357,25 @@ class KMPDFThumbViewBaseController: KMBaseViewController {
     // 提取 指定的item
     public func extractActionIndexpaths(indexpaths: Set<IndexPath>) {
         Task { @MainActor in
+//            #if VERSION_DMG
+//            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+//                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+//                return
+//            }
+//            #endif
+            #if VERSION_DMG
+            self.showExtractWindow_success(indexpaths: indexpaths) { [unowned self] oneDocumentPerPage, extractAfterDelete in
+                self._extractPages(indexpaths: indexpaths, oneDocumentPerPage: oneDocumentPerPage, limit: !self.canPayFunction) { [unowned self] result, params in
+                    if (result == .failure || result == .cancel) {
+                        return
+                    }
+                    
+                    if (extractAfterDelete) {
+                        self.deleteIndexPaths(indexpaths: indexpaths)
+                    }
+                }
+            }
+            #else
             if await (KMLightMemberManager.manager.canPayFunction() == false) {
                 let _ = KMSubscribeWaterMarkWindowController.show(window: self.view.window!, type: .extract) { isSubscribeSuccess, isWaterMarkExport, isClose in
                     if (isClose) {
@@ -342,12 +425,20 @@ class KMPDFThumbViewBaseController: KMBaseViewController {
                     }
                 }
             }
+            #endif
         }
     }
     
     // 替换 特定的item
     public func replaceAction() {
         Task { @MainActor in
+//            #if VERSION_DMG
+//            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+//                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+//                return
+//            }
+//            #endif
+
             self.km_open_file_multi {  [unowned self] index, params in
                 if (self.fetchProgressBlockParamsIsPasswordFile(params: params)) { // 加密文档进度回调
                     return
@@ -362,8 +453,16 @@ class KMPDFThumbViewBaseController: KMBaseViewController {
                         alert.runModal()
                     }
                 }
-            } completionBlock: {  [unowned self] documents in
+            } completionBlock: { [unowned self] documents in
+                #if VERSION_DMG
+                if !self.canUseAdvanced {
+                    _ = KMComparativeTableViewController.show(window: self.view.window!)
+                    return
+                }
                 self.replacePages(of: self.thumbnailView.selectionIndexPaths, with: documents)
+                #else
+                self.replacePages(of: self.thumbnailView.selectionIndexPaths, with: documents)
+                #endif
             }
         }
     }
@@ -371,6 +470,13 @@ class KMPDFThumbViewBaseController: KMBaseViewController {
     // 替换 指定的item
     public func replacePages(of targetIndexpaths: Set<IndexPath>, with documents: [CPDFDocument]) {
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                return
+            }
+            #endif
+
             if (targetIndexpaths.count == 0 || documents.count == 0) {
                 KMPrint("replace invalid.")
                 return
@@ -428,8 +534,37 @@ class KMPDFThumbViewBaseController: KMBaseViewController {
             let oneDocumentPerPage = settingView.independentPerPageValue
             let extractAfterDelete = settingView.extractAfterDeletePageValue
             
+#if VERSION_DMG
+            Task { @MainActor in
+                if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                    _ = KMComparativeTableViewController.show(window: _windowC.window!)
+                    return
+                }
+                if await (KMLightMemberManager.manager.canPayFunction() == false) {
+                    let _ = KMSubscribeWaterMarkWindowController.show(window: _windowC.window!, type: .extract) { isSubscribeSuccess, isWaterMarkExport, isClose in
+                        if (isClose) {
+                            return
+                        }
+                        if (isSubscribeSuccess) {
+                            self?.km_endSheet()
+                            callback(.ok, oneDocumentPerPage, extractAfterDelete)
+                            return
+                        }
+                        if (isWaterMarkExport) {
+                            self?.km_endSheet()
+                            callback(.ok, oneDocumentPerPage, extractAfterDelete)
+                            return
+                        }
+                    }
+                    return
+                }
+                self?.km_endSheet()
+                callback(.ok, oneDocumentPerPage, extractAfterDelete)
+            }
+#else
             self?.km_endSheet()
             callback(.ok, oneDocumentPerPage, extractAfterDelete)
+#endif
         }
     }
     

+ 4 - 0
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Thumbnail/KMPDFThumbnailView.swift

@@ -217,6 +217,10 @@ extension KMPDFThumbnailView {
                 }
             }
         } else if ((pboard.availableType(from: [.fileURL])) != nil) {
+            if let should = self.delegate?.thumbnailView?(thumbanView: self, shouldAcceptDrop: draggingInfo, indexPath: indexPath, dropOperation: dropOperation), !should {
+                return should
+            }
+            
             guard let pbItems = pboard.pasteboardItems else {
                 return false
             }

+ 69 - 6
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Thumbnail/KMThumbnailViewController.swift

@@ -468,6 +468,13 @@ class KMThumbnailViewController: KMBaseViewController {
     
     @IBAction func rotatePageItemAction(menu:NSMenuItem) {
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                return
+            }
+            #endif
+
             let indexs = self.thumbnailView.collectionView.selectionIndexes
             let indexPaths = self.thumbnailView.collectionView.selectionIndexPaths
             if indexs.count >= 0 {
@@ -499,6 +506,13 @@ class KMThumbnailViewController: KMBaseViewController {
     
     @IBAction func leftRotatePageItemAction(menu:NSMenuItem) {
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                return
+            }
+            #endif
+
             let indexs = self.thumbnailView.collectionView.selectionIndexes
             let indexPaths = self.thumbnailView.collectionView.selectionIndexPaths
             if indexs.count >= 0 {
@@ -568,6 +582,13 @@ class KMThumbnailViewController: KMBaseViewController {
     
     @IBAction func deletePageItemAction(menu:NSMenuItem) {
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                return
+            }
+            #endif
+
             let indexs = self.thumbnailView.collectionView.selectionIndexes
             if indexs.count > 0 {
                 self.deletePageItemWithIndexs(indexs: indexs)
@@ -611,18 +632,34 @@ class KMThumbnailViewController: KMBaseViewController {
     }
     
     @IBAction func copyItemAction(menu:NSMenuItem) {
-        let indexs = self.thumbnailView.collectionView.selectionIndexes
-        if indexs.count >= 0 {
-            self.copysPages = []
-            for i in indexs {
-                let page = self.thumbnailView.document?.page(at: UInt(i)).copy() as? CPDFPage
-                self.copysPages.append(page ?? CPDFPage())
+        Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                return
+            }
+            #endif
+            
+            let indexs = self.thumbnailView.collectionView.selectionIndexes
+            if indexs.count >= 0 {
+                self.copysPages = []
+                for i in indexs {
+                    let page = self.thumbnailView.document?.page(at: UInt(i)).copy() as? CPDFPage
+                    self.copysPages.append(page ?? CPDFPage())
+                }
             }
         }
     }
     
     @IBAction func cutItemAction(menu:NSMenuItem) {
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                return
+            }
+            #endif
+
             let indexs = self.thumbnailView.collectionView.selectionIndexes
             if indexs.count >= 0 {
                 self.copysPages = []
@@ -641,6 +678,13 @@ class KMThumbnailViewController: KMBaseViewController {
     
     @IBAction func pastePageItemAction(menu:NSMenuItem) {
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                return
+            }
+            #endif
+
             var index = (self.thumbnailView.collectionView.selectionIndexes).last ?? -1
             if Int(index) >= 0 && self.copysPages.count > 0 {
                 var pageItems: [KMThumbnailPageItem] = []
@@ -749,10 +793,29 @@ extension KMThumbnailViewController : KMThumbnailViewDelegate {
     }
 
     func thumbnailView(thumbanView: KMThumbnailView, shouldAcceptDrop draggingInfo: NSDraggingInfo, indexPath: IndexPath, dropOperation: NSCollectionView.DropOperation) -> Bool {
+        #if VERSION_DMG
+        if (!self.canUseAdvanced) {
+            let _ = KMComparativeTableViewController.show(window: self.view.window!, .thumb)
+            return false
+        }
+        #endif
+
         return true
     }
     
     func thumbnailView(thumbanView: KMThumbnailView, shouldPasteboardWriterForItemAt indexPath: IndexPath) -> Bool {
+        #if VERSION_DMG
+        if (!self.canUseAdvanced) {
+            DispatchQueue.main.async {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!, .thumb)
+            }
+            return false
+        }
+        #endif
+        if (!self.canPayFunction) {
+            return false
+        }
+
         return true
     }
     

+ 8 - 0
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/KMToolbarController.swift

@@ -516,6 +516,14 @@ extension KMToolbarController: KMToolbarViewControllerDelegate {
         
         // 高级功能
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                let boxItem = item.clickObject as? KMToolBoxItem
+                boxItem?.isSelected = false
+                return
+            }
+            #endif
             //文字编辑 图片编辑 选中按钮逻辑(只能同时选中其中一个)
             if type == .addText || type == .addImage {
                 let boxItem = item.clickObject as? KMToolBoxItem

+ 7 - 0
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/KMToolbarViewController.swift

@@ -186,6 +186,13 @@ class KMToolbarViewController: NSViewController, NSTextFieldDelegate {
         
         if tag == .editPDF {
             Task { @MainActor in
+                #if VERSION_DMG
+                if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                    let _ =  KMComparativeTableViewController.show(window: self.view.window!)
+                    return
+                }
+                #endif
+
                 self.delegate?.toolbarViewController?(self, clickMode: tag, toolbar: item.clickObject as! KMToolBoxItem, [])
             }
         } else {

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

@@ -578,9 +578,11 @@ extension KMMainViewController {
         self.toolbarController.selectItem(KMToolbarLinkAnnotationItemIdentifier)
         DispatchQueue.main.async {
             Task { @MainActor in
+                #if VERSION_DMG
                 if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
                     return
                 }
+                #endif
                 let annotation = self.listView.addAnnotation(with: annotationType, selection: selection, page: selection?.page, bounds: selection!.bounds)
                 self.listView.currentSelection = nil;
                 if (annotation != nil) {
@@ -604,6 +606,15 @@ extension KMMainViewController {
     
     @objc func menuItemAnnotationClick_addStype(sender: NSMenuItem) {
         Task { @MainActor in
+            #if VERSION_DMG
+            if (sender.tag == 7 || sender.tag == 8 || sender.tag == 9) {
+                if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                    let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                    return
+                }
+            }
+            #endif
+
             var point = mouseRightMenuEvent?.locationInWindow
             if (point == nil) {
                 point = NSZeroPoint
@@ -1886,11 +1897,29 @@ extension KMMainViewController {
                 // 隐藏提示
                 self?.hiddenSecureLimitTip()
                 // 去打印
-                KMPrintWindowController.openDocument(inputDocument: self?.listView.document, inputPageRange: pageRange)
+                if let data = self?.saveWatermarkFlag, !data {
+                    KMPrintWindowController.openDocument(inputDocument: self!.listView?.document, inputPageRange: pageRange)
+                    return
+                }
+                if let _url = KMTools.saveWatermarkDocumentToTemp(document: self!.listView.document, secureOptions: self!.secureOptions, removePWD: self!.removeSecureFlag) {
+                    let _document = CPDFDocument(url: _url)
+                    KMPrintWindowController.showPrintWindowControll(inputData: _url, inputDocument: self?.listView.document, inputPageRange: pageRange)
+                } else {
+                    KMPrintWindowController.openDocument(inputDocument: self?.listView?.document, inputPageRange: pageRange)
+                }
             }
             return
         }
-        KMPrintWindowController.openDocument(inputDocument: self.listView?.document, inputPageRange: pageRange)
+        if (!self.saveWatermarkFlag) {
+            KMPrintWindowController.openDocument(inputDocument: self.listView?.document, inputPageRange: pageRange)
+            return
+        }
+        if let _url = KMTools.saveWatermarkDocumentToTemp(document: self.listView.document, secureOptions: self.secureOptions, removePWD: self.removeSecureFlag) {
+            let _document = CPDFDocument(url: _url)
+            KMPrintWindowController.showPrintWindowControll(inputData: _url, inputDocument: self.listView.document, inputPageRange: pageRange)
+        } else {
+            KMPrintWindowController.openDocument(inputDocument: self.listView?.document, inputPageRange: pageRange)
+        }
     }
     
     // MARK: - Split View
@@ -2140,11 +2169,14 @@ extension KMMainViewController : KMMainToolbarControllerDelegate {
     }
     
     func aiTranslationPDFFileAction() {
+        #if VERSION_DMG
+        #else
         if !KMLightMemberManager.manager.isLogin() && NSApp.mainWindow != nil {
             KMLoginWindowController.show(window: NSApp.mainWindow!)
 
             return
         }
+        #endif
         self.trackEvent_aiTranslate()
         self._aiTranslationPDFFileAction()
 //        Task { @MainActor in
@@ -2234,6 +2266,12 @@ extension KMMainViewController : KMMainToolbarControllerDelegate {
 //            return
 //        }
         Task { @MainActor in
+#if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!, .shareFlatten)
+                return
+            }
+#endif
             if await (KMLightMemberManager.manager.canPayFunction() == false) {
                 KMSubscribeWaterMarkWindowController.show(window: self.view.window!, isContinue: true) { isSubscribeSuccess, isWaterMarkExport, isClose in
                     if (isClose) {
@@ -2367,6 +2405,16 @@ extension KMMainViewController : KMMainToolbarControllerDelegate {
         
         Task { @MainActor in
             if (type == .compress) { /// 压缩
+//                #if VERSION_DMG
+//                if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+//                    let _ = KMComparativeTableViewController.show(window: self.view.window!, .compress)
+                    
+//                    self.toolbarController.cancelSelected(KMToolbarToolCompressItemIdentifier)
+//                    return
+                    
+//                }
+//                #endif
+
                 if await (KMLightMemberManager.manager.canPayFunction() == false) {
 //                    self.view.window?.contentView?.superview?.beginLoading()
                     let document = self.listView.document
@@ -2419,6 +2467,18 @@ extension KMMainViewController : KMMainToolbarControllerDelegate {
                     identifier = KMToolbarConversionImageItemIdentifier
                 }
                 
+                #if VERSION_DMG
+//                if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+//                    if (identifier != nil) {
+//                        self.toolbarController.cancelSelected(identifier!)
+//                    }
+                    
+//                    let _ = KMComparativeTableViewController.show(window: self.view.window!, .convert)
+//                    return
+//                }
+                #endif
+
+                
                 if await (KMLightMemberManager.manager.canPayFunction() == false) {
                     guard let _url =  KMTools.saveWatermarkDocumentToTemp(document: self.listView.document, secureOptions: self.secureOptions, removePWD: self.removeSecureFlag) else {
                         return
@@ -2438,6 +2498,15 @@ extension KMMainViewController : KMMainToolbarControllerDelegate {
             }
             
             if (type == .merge) { /// 合并
+//                #if VERSION_DMG
+//                if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+//                    let _ = KMComparativeTableViewController.show(window: self.view.window!, .merge)
+//                    
+//                    self.toolbarController.cancelSelected(KMToolbarToolMergeItemIdentifier)
+//                    return
+//                }
+//                #endif
+
                 if (self.listView.document.allowsCopying == false || self.listView.document.allowsPrinting == false) {
                     if await (KMLightMemberManager.manager.canPayFunction() == false) {
                             KMPasswordInputWindow.openWindow(window: self.view.window!, type: .owner, url: self.listView.document.documentURL) { [unowned self] result , password in
@@ -2490,6 +2559,13 @@ extension KMMainViewController : KMMainToolbarControllerDelegate {
             }
             
             if (type == .crop) {
+                #if VERSION_DMG
+                if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                    let _ = KMComparativeTableViewController.show(window: self.view.window!, .crop)
+                    return
+                }
+                #endif
+
                 self.recordSaveWatermarkFlag(type: .crop)
                 
                 if (index == 1) {
@@ -2739,6 +2815,13 @@ extension KMMainViewController : KMMainToolbarControllerDelegate {
                     return
                 }
             } else if (type == .secure) { /// 安全
+                #if VERSION_DMG
+                if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                    let _ = KMComparativeTableViewController.show(window: self.view.window!, .secure)
+                    return
+                }
+                #endif
+                
                 if (index == 1) { /// 设置密码
                     if (!self.listView.document!.allowsCopying || !self.listView.document!.allowsPrinting) {
                         KMPasswordInputWindow.openWindow(window: self.view.window!, type: .owner, url: self.listView.document.documentURL) { [weak self]  result, password in

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

@@ -91,10 +91,12 @@ extension KMMainViewController {
 extension KMMainViewController: KMSystemFileMenuProtocol {
     @IBAction func menuItemClick_saveAsFlattenedPDF(_ sender: Any) {
         Task { @MainActor in
+            #if VERSION_DMG
             if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
                 let _ = KMComparativeTableViewController.show(window: self.view.window!)
                 return
             }
+            #endif
             if await (KMLightMemberManager.manager.canPayFunction() == false) {
                 let _ = KMSubscribeWaterMarkWindowController.show(window: self.view.window!) { isSubscribeSuccess, isWaterMarkExport, isClose in
                     if (isClose) {
@@ -252,6 +254,13 @@ extension KMMainViewController {
     
     @IBAction func menuItemAction_rotateLeft(_ sender: Any) {
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                return
+            }
+            #endif
+
             let page : CPDFPage = self.listView?.currentPage() ?? CPDFPage()
             let rotation = page.rotation
             page.leftRotate()
@@ -281,6 +290,13 @@ extension KMMainViewController {
 
     @IBAction func menuItemAction_rotateRight(_ sender: Any) {
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                return
+            }
+            #endif
+            
             let page : CPDFPage = self.listView?.currentPage() ?? CPDFPage()
             let rotation = page.rotation
             page.rightRotate()
@@ -291,6 +307,13 @@ extension KMMainViewController {
 
     @IBAction func menuItemAction_rotateAllPageLeft(_ sender: Any) {
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                return
+            }
+            #endif
+            
             var pageItems: [KMThumbnailPageItem] = []
             for index in 0 ... self.listView.document.pageCount - 1 {
                 let page: CPDFPage = self.listView.document.page(at: index)
@@ -305,6 +328,13 @@ extension KMMainViewController {
 
     @IBAction func menuItemAction_rotateAllPageRight(_ sender: Any) {
         Task { @MainActor in
+            #if VERSION_DMG
+            if await (KMLightMemberManager.manager.canUseAdvanced() == false) {
+                let _ = KMComparativeTableViewController.show(window: self.view.window!)
+                return
+            }
+            #endif
+            
             var pageItems: [KMThumbnailPageItem] = []
             for index in 0 ... self.listView.document.pageCount - 1 {
                 let page : CPDFPage = self.listView.document.page(at: index)

+ 4 - 4
PDF Office/PDF Master/Strings/en.lproj/Localizable.strings

@@ -633,7 +633,7 @@
 "Or subscribe to us to unlock more powerful features"     =     "Or subscribe to us to unlock more powerful features";
 "AI robot"     =     "AI robot";
 "Unlimited conversion"     =     "Unlimited conversion";
-"Save without watermark"     =     "Save without watermark";
+"Save without Watermark"     =     "Save without Watermark";
 "Subscribe"     =     "Subscribe";
 
 
@@ -651,7 +651,7 @@
 
 
 "Subscription Benefits"     =     "Subscription Benefits";
-"Save without watermark"     =     "Save without watermark";
+"Save without Watermark"     =     "Save without Watermark";
 "When you save a document with PDF Master after editing, no watermark will be attached"     =     "When you save a document with PDF Master after editing, no watermark will be attached";
 "Convert PDF without limitation"     =     "Convert PDF without limitation";
 "Convert PDF to Office and image without any limitations, get converted files in high quality"     =     "Convert PDF to Office and image without any limitations, get converted files in high quality";
@@ -691,7 +691,7 @@
 "Purchase Successfully"     =     "Purchase Successfully";
 "Purchase Failed"     =     "Purchase Failed";
 "Cancel Purchase"     =     "Cancel Purchase";
-"Order Verification Filed"     =     "Order Verification Filed";
+"Order Verification Failed"     =     "Order Verification Failed";
 "Order Verification Successful"     =     "Order Verification Successful";
 "Server Order Verification Failed"     =     "Server Order Verification Failed";
 "In-app Purchases not Allowed"     =     "In-app Purchases not Allowed";
@@ -717,7 +717,7 @@
 "Convert PDF to Office (Only first 10 pages)" = "Convert PDF to Office (Only first 10 pages)";
 "Convert PDF to Office without limitation" = "Convert PDF to Office without limitation";
 "Merge only 2 files for free" = "Merge only 2 files for free";
-"Save without watermark" = "Save without watermark";
+"Save without Watermark" = "Save without Watermark";
 "Batch merge files without limitation" = "Batch merge files without limitation";
 "Sign up for Free" = "Sign up for Free";