Browse Source

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

niehaoyu 1 year ago
parent
commit
cf1a23880d
20 changed files with 736 additions and 33 deletions
  1. 64 0
      PDF Office/PDF Master.xcodeproj/project.pbxproj
  2. 295 0
      PDF Office/PDF Master/Class/AD/KMAdsManager.swift
  3. 338 0
      PDF Office/PDF Master/Class/AD/KMAdsWebView.swift
  4. BIN
      PDF Office/PDF Master/Class/AD/images/ad_cancel_button00.png
  5. BIN
      PDF Office/PDF Master/Class/AD/images/ad_cancel_button00@2x.png
  6. BIN
      PDF Office/PDF Master/Class/AD/images/ad_cancel_button00@4x.png
  7. 0 22
      PDF Office/PDF Master/Class/Appearance/Image.xcassets/PDF Tools/KMImageNameUXIconBtnArrowDown.imageset/Contents.json
  8. BIN
      PDF Office/PDF Master/Class/Appearance/Image.xcassets/PDF Tools/KMImageNameUXIconBtnArrowDown.imageset/light_ic_btn_arrow_down-1.pdf
  9. BIN
      PDF Office/PDF Master/Class/Appearance/Image.xcassets/PDF Tools/KMImageNameUXIconBtnArrowDown.imageset/light_ic_btn_arrow_down.pdf
  10. 24 0
      PDF Office/PDF Master/Class/Batch/View/KMTextFieldCell.swift
  11. 2 2
      PDF Office/PDF Master/Class/Batch/WindowController/VC/KMBatchOperateImageToPDFViewController.xib
  12. 1 1
      PDF Office/PDF Master/Class/GuideInfo/Controllers/FunctionGuide/KMConvertGuideView.swift
  13. 1 1
      PDF Office/PDF Master/Class/GuideInfo/Controllers/FunctionGuide/KMCustomColorGuideView.swift
  14. 1 1
      PDF Office/PDF Master/Class/GuideInfo/Controllers/FunctionGuide/KMOpenFileFunctionView.swift
  15. 1 1
      PDF Office/PDF Master/Class/GuideInfo/Controllers/OpenFileGuide/KMOpenFileGuidePanel.swift
  16. 1 1
      PDF Office/PDF Master/Class/GuideInfo/Controllers/OpenFileGuide/KMOpenFileGuideProperty.swift
  17. 1 1
      PDF Office/PDF Master/Class/GuideInfo/Controllers/OpenFileGuide/KMOpenFileGuideToolbar.swift
  18. 2 2
      PDF Office/PDF Master/Class/Home/View/KMComboBox.swift
  19. 3 0
      PDF Office/PDF Master/Class/PDFTools/Convert/ExtractImage/Controller/KMExtractImageWindowController.xib
  20. 2 1
      PDF Office/PDF Master/Class/PDFTools/Print/KMPrintWindowController.swift

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

@@ -2364,6 +2364,21 @@
 		ADFCEB552B4FBADB0001EBAF /* KMFirebaseRemoteConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFCEB542B4FBADB0001EBAF /* KMFirebaseRemoteConfig.swift */; };
 		ADFCEB562B4FBADB0001EBAF /* KMFirebaseRemoteConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFCEB542B4FBADB0001EBAF /* KMFirebaseRemoteConfig.swift */; };
 		ADFCEB572B4FBADB0001EBAF /* KMFirebaseRemoteConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFCEB542B4FBADB0001EBAF /* KMFirebaseRemoteConfig.swift */; };
+		ADFCEB612B4FBFC50001EBAF /* ad_cancel_button00@4x.png in Resources */ = {isa = PBXBuildFile; fileRef = ADFCEB5B2B4FBFC50001EBAF /* ad_cancel_button00@4x.png */; };
+		ADFCEB622B4FBFC50001EBAF /* ad_cancel_button00@4x.png in Resources */ = {isa = PBXBuildFile; fileRef = ADFCEB5B2B4FBFC50001EBAF /* ad_cancel_button00@4x.png */; };
+		ADFCEB632B4FBFC50001EBAF /* ad_cancel_button00@4x.png in Resources */ = {isa = PBXBuildFile; fileRef = ADFCEB5B2B4FBFC50001EBAF /* ad_cancel_button00@4x.png */; };
+		ADFCEB642B4FBFC50001EBAF /* ad_cancel_button00@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = ADFCEB5C2B4FBFC50001EBAF /* ad_cancel_button00@2x.png */; };
+		ADFCEB652B4FBFC50001EBAF /* ad_cancel_button00@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = ADFCEB5C2B4FBFC50001EBAF /* ad_cancel_button00@2x.png */; };
+		ADFCEB662B4FBFC50001EBAF /* ad_cancel_button00@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = ADFCEB5C2B4FBFC50001EBAF /* ad_cancel_button00@2x.png */; };
+		ADFCEB672B4FBFC50001EBAF /* ad_cancel_button00.png in Resources */ = {isa = PBXBuildFile; fileRef = ADFCEB5D2B4FBFC50001EBAF /* ad_cancel_button00.png */; };
+		ADFCEB682B4FBFC50001EBAF /* ad_cancel_button00.png in Resources */ = {isa = PBXBuildFile; fileRef = ADFCEB5D2B4FBFC50001EBAF /* ad_cancel_button00.png */; };
+		ADFCEB692B4FBFC50001EBAF /* ad_cancel_button00.png in Resources */ = {isa = PBXBuildFile; fileRef = ADFCEB5D2B4FBFC50001EBAF /* ad_cancel_button00.png */; };
+		ADFCEB712B4FC1410001EBAF /* KMAdsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFCEB702B4FC1410001EBAF /* KMAdsManager.swift */; };
+		ADFCEB722B4FC1410001EBAF /* KMAdsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFCEB702B4FC1410001EBAF /* KMAdsManager.swift */; };
+		ADFCEB732B4FC1410001EBAF /* KMAdsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFCEB702B4FC1410001EBAF /* KMAdsManager.swift */; };
+		ADFCEB752B4FC1660001EBAF /* KMAdsWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFCEB742B4FC1660001EBAF /* KMAdsWebView.swift */; };
+		ADFCEB762B4FC1660001EBAF /* KMAdsWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFCEB742B4FC1660001EBAF /* KMAdsWebView.swift */; };
+		ADFCEB772B4FC1660001EBAF /* KMAdsWebView.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFCEB742B4FC1660001EBAF /* KMAdsWebView.swift */; };
 		BB00300F298CA383002DD1A0 /* KMPreferenceSegementControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB00300E298CA383002DD1A0 /* KMPreferenceSegementControl.swift */; };
 		BB003010298CA383002DD1A0 /* KMPreferenceSegementControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB00300E298CA383002DD1A0 /* KMPreferenceSegementControl.swift */; };
 		BB003011298CA383002DD1A0 /* KMPreferenceSegementControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB00300E298CA383002DD1A0 /* KMPreferenceSegementControl.swift */; };
@@ -4245,6 +4260,9 @@
 		BBD3C8B62B2C438F00EB0867 /* KMToolbarPreviousNextItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD3C8B52B2C438F00EB0867 /* KMToolbarPreviousNextItemView.swift */; };
 		BBD3C8B72B2C438F00EB0867 /* KMToolbarPreviousNextItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD3C8B52B2C438F00EB0867 /* KMToolbarPreviousNextItemView.swift */; };
 		BBD3C8B82B2C438F00EB0867 /* KMToolbarPreviousNextItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD3C8B52B2C438F00EB0867 /* KMToolbarPreviousNextItemView.swift */; };
+		BBD4267F2B4FCF1500AC8660 /* KMTextFieldCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD4267E2B4FCF1500AC8660 /* KMTextFieldCell.swift */; };
+		BBD426802B4FCF1500AC8660 /* KMTextFieldCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD4267E2B4FCF1500AC8660 /* KMTextFieldCell.swift */; };
+		BBD426812B4FCF1500AC8660 /* KMTextFieldCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD4267E2B4FCF1500AC8660 /* KMTextFieldCell.swift */; };
 		BBD512A12B0DE86C005BFE8A /* KMBotaLeftView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD512A02B0DE86C005BFE8A /* KMBotaLeftView.swift */; };
 		BBD512A22B0DE86C005BFE8A /* KMBotaLeftView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD512A02B0DE86C005BFE8A /* KMBotaLeftView.swift */; };
 		BBD512A32B0DE86C005BFE8A /* KMBotaLeftView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBD512A02B0DE86C005BFE8A /* KMBotaLeftView.swift */; };
@@ -5600,6 +5618,11 @@
 		ADFCEB452B4FBA430001EBAF /* ProRemoteConfigDefaults.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = ProRemoteConfigDefaults.plist; sourceTree = "<group>"; };
 		ADFCEB472B4FBA430001EBAF /* DMGRemoteConfigDefaults.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = DMGRemoteConfigDefaults.plist; sourceTree = "<group>"; };
 		ADFCEB542B4FBADB0001EBAF /* KMFirebaseRemoteConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMFirebaseRemoteConfig.swift; sourceTree = "<group>"; };
+		ADFCEB5B2B4FBFC50001EBAF /* ad_cancel_button00@4x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ad_cancel_button00@4x.png"; sourceTree = "<group>"; };
+		ADFCEB5C2B4FBFC50001EBAF /* ad_cancel_button00@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "ad_cancel_button00@2x.png"; sourceTree = "<group>"; };
+		ADFCEB5D2B4FBFC50001EBAF /* ad_cancel_button00.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ad_cancel_button00.png; sourceTree = "<group>"; };
+		ADFCEB702B4FC1410001EBAF /* KMAdsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = KMAdsManager.swift; path = "PDF Master/Class/AD/KMAdsManager.swift"; sourceTree = SOURCE_ROOT; };
+		ADFCEB742B4FC1660001EBAF /* KMAdsWebView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMAdsWebView.swift; sourceTree = "<group>"; };
 		BB00300E298CA383002DD1A0 /* KMPreferenceSegementControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPreferenceSegementControl.swift; sourceTree = "<group>"; };
 		BB003013298CA446002DD1A0 /* KMPreferenceGeneralController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPreferenceGeneralController.swift; sourceTree = "<group>"; };
 		BB003014298CA446002DD1A0 /* KMPreferenceGeneralController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMPreferenceGeneralController.xib; sourceTree = "<group>"; };
@@ -6344,6 +6367,7 @@
 		BBD1F79B296FF7A600343885 /* KMPageEditSplitSettingModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPageEditSplitSettingModel.swift; sourceTree = "<group>"; };
 		BBD25BF02B18768600EB85D4 /* KMCompressOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMCompressOperation.swift; sourceTree = "<group>"; };
 		BBD3C8B52B2C438F00EB0867 /* KMToolbarPreviousNextItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMToolbarPreviousNextItemView.swift; sourceTree = "<group>"; };
+		BBD4267E2B4FCF1500AC8660 /* KMTextFieldCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMTextFieldCell.swift; sourceTree = "<group>"; };
 		BBD512A02B0DE86C005BFE8A /* KMBotaLeftView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBotaLeftView.swift; sourceTree = "<group>"; };
 		BBD54ED32A1CBD720012A230 /* NSView+KMExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSView+KMExtension.swift"; sourceTree = "<group>"; };
 		BBDA8A682A31B50C006A2C4E /* KMCustomStepperView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMCustomStepperView.swift; sourceTree = "<group>"; };
@@ -9432,6 +9456,26 @@
 			path = "RemoteConfig ";
 			sourceTree = "<group>";
 		};
+		ADFCEB582B4FBFC50001EBAF /* AD */ = {
+			isa = PBXGroup;
+			children = (
+				ADFCEB742B4FC1660001EBAF /* KMAdsWebView.swift */,
+				ADFCEB702B4FC1410001EBAF /* KMAdsManager.swift */,
+				ADFCEB5A2B4FBFC50001EBAF /* images */,
+			);
+			path = AD;
+			sourceTree = "<group>";
+		};
+		ADFCEB5A2B4FBFC50001EBAF /* images */ = {
+			isa = PBXGroup;
+			children = (
+				ADFCEB5B2B4FBFC50001EBAF /* ad_cancel_button00@4x.png */,
+				ADFCEB5C2B4FBFC50001EBAF /* ad_cancel_button00@2x.png */,
+				ADFCEB5D2B4FBFC50001EBAF /* ad_cancel_button00.png */,
+			);
+			path = images;
+			sourceTree = "<group>";
+		};
 		BB00300D298CA367002DD1A0 /* View */ = {
 			isa = PBXGroup;
 			children = (
@@ -9994,6 +10038,7 @@
 		BB2C6A7128F2652500478A33 /* Class */ = {
 			isa = PBXGroup;
 			children = (
+				ADFCEB582B4FBFC50001EBAF /* AD */,
 				ADFCEB2F2B4F77CC0001EBAF /* KMFileManager */,
 				BB42C7EB2B46421B003FF2D4 /* README.md */,
 				BBFEF7112B3A766C00C28AC0 /* SystemMenu */,
@@ -11630,6 +11675,7 @@
 				BB6347C32AF24F6300F5438E /* KMBatchoperateConvertCollectionViewItem.swift */,
 				BB6347C72AF24F6C00F5438E /* KMBatchoperateConvertCollectionViewItem.xib */,
 				BB90E4F12AF37F9F00B04B9F /* KMCustomViewButton.swift */,
+				BBD4267E2B4FCF1500AC8660 /* KMTextFieldCell.swift */,
 			);
 			path = View;
 			sourceTree = "<group>";
@@ -12426,6 +12472,7 @@
 				ADE86AE92B0AF50B00414DFA /* KMCompareCoveringSettingWindowController.xib in Resources */,
 				BBEC00D4295C33D600A26C98 /* KMCreateBatesController.xib in Resources */,
 				AD3AAD302B0B700500DE5FE7 /* KMCompareCoveringView.xib in Resources */,
+				ADFCEB672B4FBFC50001EBAF /* ad_cancel_button00.png in Resources */,
 				BB99ACD2292E2AEF0048AFD9 /* KMMergeCollectionViewItem.xib in Resources */,
 				9FF94F1429A7476000B1EF69 /* KMDesignPropertySelector.xib in Resources */,
 				BBC348462956A638008D2CD1 /* KMEditBackgroundController.xib in Resources */,
@@ -12476,6 +12523,7 @@
 				ADD272D429B9CFE20032B5D6 /* KMLightNoNetworkView.xib in Resources */,
 				9F8539E7294712D600DF644E /* KMChromiumTabContents.xib in Resources */,
 				BB04FD102B206F4000D80F7B /* KMPlanViewController.xib in Resources */,
+				ADFCEB642B4FBFC50001EBAF /* ad_cancel_button00@2x.png in Resources */,
 				BB003018298CA446002DD1A0 /* KMPreferenceGeneralController.xib in Resources */,
 				ADBC376129CC637900D93208 /* KMReadModelView.xib in Resources */,
 				ADDF83832B391A5D00A81A4E /* DSignatureSaveTypeViewController.xib in Resources */,
@@ -12682,6 +12730,7 @@
 				89DB5DAA291B8DE70029624F /* KMOutlineEditViewController.xib in Resources */,
 				BB003029298CF7EC002DD1A0 /* KMPreferenceDisplayController.xib in Resources */,
 				9F0CB5452986953A00007028 /* KMURLToPDFWindowController.xib in Resources */,
+				ADFCEB612B4FBFC50001EBAF /* ad_cancel_button00@4x.png in Resources */,
 				9FBA0F0129015A82001117AF /* KMFastToolCollectionViewItem.xib in Resources */,
 				ADAFDA4C2AEA7F2700F084BC /* KMAdvertisementShowView.xib in Resources */,
 				BB8810612B4F74DD00AFA63E /* KMRepeatTrialAlertController.xib in Resources */,
@@ -12865,6 +12914,7 @@
 				AD199DF42B23121D00D56FEE /* KMPrintPamphletView.xib in Resources */,
 				AD3AAD942B1034C000DE5FE7 /* KMHeaderFooterView.xib in Resources */,
 				AD1D481D2AFB6B96007AC1F0 /* KMMergeWindowController.xib in Resources */,
+				ADFCEB652B4FBFC50001EBAF /* ad_cancel_button00@2x.png in Resources */,
 				8997010228F40710009AF911 /* KMBookMarkViewController.xib in Resources */,
 				BBFE6E69293097A600142C01 /* KMPageRangePickerWindowController.xib in Resources */,
 				89752DB12936F505003FF08E /* KMCustomButtonPopMenuViewController.xib in Resources */,
@@ -12872,6 +12922,7 @@
 				89D9897028FD50EF003A3E87 /* KMAnnotationCollectionViewItem.xib in Resources */,
 				BB1B0B052B4FC6E900889528 /* KMCustomColorGuideView.xib in Resources */,
 				9FBA0EEA28FFC2FE001117AF /* Image.xcassets in Resources */,
+				ADFCEB682B4FBFC50001EBAF /* ad_cancel_button00.png in Resources */,
 				BB4F7E922B0C80000077EC8C /* KMNoteColorCollectionViewItem.xib in Resources */,
 				89E4E6F02963D1B7002DBA6F /* KMColorPickerViewController.xib in Resources */,
 				ADE86AEA2B0AF50B00414DFA /* KMCompareCoveringSettingWindowController.xib in Resources */,
@@ -13106,6 +13157,7 @@
 				ADC63E3B2A49813E00854E02 /* KMSubscribeSuccessWindowController.xib in Resources */,
 				BBFD2B172AEFAC9C0016C456 /* KMBatchOperateBaseViewController.xib in Resources */,
 				BB1BFF7E2AEA0BE8003EB179 /* KMBatchOperateRightViewController.xib in Resources */,
+				ADFCEB622B4FBFC50001EBAF /* ad_cancel_button00@4x.png in Resources */,
 				9FD0FA4F29D43D6800F2AB0D /* KMDeviceBrowserWindowController.xib in Resources */,
 				9F1F82CE292F6CF90092C4B4 /* KMPDFInsertPageWindow.xib in Resources */,
 				9F0201822A1BAC1600C9B673 /* KMAIRewritingVC.xib in Resources */,
@@ -13367,6 +13419,7 @@
 				BB65A05F2AF8BF2A003A27A0 /* NotesPreferences.xib in Resources */,
 				BBB376A62B10A7FD009539CC /* a_4b.png in Resources */,
 				ADED71DB29B57C01005EEC0A /* Localizable.strings in Resources */,
+				ADFCEB692B4FBFC50001EBAF /* ad_cancel_button00.png in Resources */,
 				9F0201932A1DDAA500C9B673 /* KMAITranslationWindowController.xib in Resources */,
 				9F72D20D2994BDAF00DCACF1 /* KMNotificationVC.xib in Resources */,
 				AD1D48272AFB6BCB007AC1F0 /* KMMergeView.xib in Resources */,
@@ -13417,6 +13470,7 @@
 				BBA19F3829ADACC5001A285A /* signPicture_nor.pdf in Resources */,
 				9FBA0EE628FEC253001117AF /* KMProductPromotionViewController.xib in Resources */,
 				89E9B3FB295BE2EC00AEFA61 /* KMEditPDFTextPropertyViewController.xib in Resources */,
+				ADFCEB662B4FBFC50001EBAF /* ad_cancel_button00@2x.png in Resources */,
 				9F02018B2A1DA28B00C9B673 /* KMAILanguagePopVC.xib in Resources */,
 				AD58F41C2B1DAC1500299EE0 /* KMPrintSettingView.xib in Resources */,
 				BB1EC8032967B26700EC0BC3 /* KMPDFEditViewController.xib in Resources */,
@@ -13623,6 +13677,7 @@
 				ADBC2D3C299F0A5A006280C8 /* KMPrintHelpViewController.xib in Resources */,
 				AD1D481E2AFB6B96007AC1F0 /* KMMergeWindowController.xib in Resources */,
 				ADB2D6F4294741720029D2B3 /* KMPrintPaperSetView.xib in Resources */,
+				ADFCEB632B4FBFC50001EBAF /* ad_cancel_button00@4x.png in Resources */,
 				ADAFDA4E2AEA7F2700F084BC /* KMAdvertisementShowView.xib in Resources */,
 				BB65A0842AF8FEA1003A27A0 /* KMBatchOperateRemoveHeaderFooterViewController.xib in Resources */,
 				BB8810632B4F74DD00AFA63E /* KMRepeatTrialAlertController.xib in Resources */,
@@ -13852,6 +13907,7 @@
 				9F1FE4D229406E4700E952CA /* CTTabView.m in Sources */,
 				ADBC372929CA950500D93208 /* KMComparativeOutlineView.swift in Sources */,
 				9FDD0F64294AB645000C4DAD /* KMMainViewController.swift in Sources */,
+				BBD4267F2B4FCF1500AC8660 /* KMTextFieldCell.swift in Sources */,
 				89D2D2FB294C806000BFF5FE /* KMPDFThumbnailItem.swift in Sources */,
 				BB9599CB2B3184230062D346 /* KMRedactSelectPagesWindowController.swift in Sources */,
 				BBB9B313299A5D6D004F3235 /* DropboxModel.m in Sources */,
@@ -14189,6 +14245,7 @@
 				AD1CA4212A061D190070541F /* KMAnnotationScreenAuthorViewItem.swift in Sources */,
 				BB2F9AB82AFCC3AD00F9DD93 /* KMProfileInfo.swift in Sources */,
 				BBC3481C295593F0008D2CD1 /* KMBackgroundListController.swift in Sources */,
+				ADFCEB752B4FC1660001EBAF /* KMAdsWebView.swift in Sources */,
 				9F5664872988B16F00020985 /* KMTextfieldVC.swift in Sources */,
 				9F1F82DA292F84D60092C4B4 /* KMHomeInsertActionViewController.swift in Sources */,
 				BB31DA622AFA3088006D63CB /* KMPreferenceController.swift in Sources */,
@@ -14551,6 +14608,7 @@
 				BB897251294C3F660045787C /* KMMenuTableView.swift in Sources */,
 				BB9695B229BDA46500FD68D3 /* SKLocalization.m in Sources */,
 				9F0CB4ED298655A800007028 /* KMDesignToken+PaddingLeft.swift in Sources */,
+				ADFCEB712B4FC1410001EBAF /* KMAdsManager.swift in Sources */,
 				BB00302E298D315E002DD1A0 /* KMPreferenceMarkupController.swift in Sources */,
 				ADDF83A12B391A5D00A81A4E /* DSignatureFileListViewController.swift in Sources */,
 				9F1FE49C29406E4700E952CA /* HoverCloseButton.m in Sources */,
@@ -14799,6 +14857,7 @@
 				BB46CF4D2AFBB34900281EDF /* AutoSaveManager.swift in Sources */,
 				9FB220E02B10850400A5B208 /* KMAnnotationStampViewController.swift in Sources */,
 				BB3A66A42B0783BD00575343 /* KMTocTableCellView.swift in Sources */,
+				BBD426802B4FCF1500AC8660 /* KMTextFieldCell.swift in Sources */,
 				BBA00AC52B157C880043D903 /* KMToolbarZoomItemView.swift in Sources */,
 				BB1B0AC62B4FC6E900889528 /* KMGuideInfoWindow.swift in Sources */,
 				BBC3484B2958222C008D2CD1 /* KMBackgroundOutsideView.swift in Sources */,
@@ -15211,6 +15270,7 @@
 				ADE787AB2AA5A8D3002EC85A /* KMAccountExceptionView.swift in Sources */,
 				ADDEEA932AD796FF00EF675D /* KMSelfSignAnnotationFreeText.swift in Sources */,
 				ADD1B6ED2946C04C00C3FFF7 /* KMPrintChoosePageSizePamphletView.swift in Sources */,
+				ADFCEB762B4FC1660001EBAF /* KMAdsWebView.swift in Sources */,
 				BB4EEF3529764166003A3537 /* KMRedactPropertyWindowController.swift in Sources */,
 				BB8F4561295AA39F0037EA22 /* KMHeaderFooterModel.swift in Sources */,
 				BBFEF7142B3A766C00C28AC0 /* KMSystemMenu.swift in Sources */,
@@ -15323,6 +15383,7 @@
 				BB3EAEAE293E3D6000D92407 /* KMConvertBaseWindowController.swift in Sources */,
 				BB8810D72B4F984000AFA63E /* JSONKit.m in Sources */,
 				ADDF83242B391A5C00A81A4E /* CDSDrawView.m in Sources */,
+				ADFCEB722B4FC1410001EBAF /* KMAdsManager.swift in Sources */,
 				BB1BFF5E2AE9F1FF003EB179 /* KMBatchOperateBaseWindowController.swift in Sources */,
 				894A00F32976314C0070ED83 /* KMPDFViewPanelSetViewController.swift in Sources */,
 				BB135C2B29B6CD9A00FD5965 /* KMTools.swift in Sources */,
@@ -15834,6 +15895,7 @@
 				BB8810662B4F74DD00AFA63E /* KMRepeatTrialAlertController.m in Sources */,
 				9F1FE51329407B4000E952CA /* KMFileSearchView.swift in Sources */,
 				BBEC00B1295C2AF300A26C98 /* KMBatesPreviewController.swift in Sources */,
+				BBD426812B4FCF1500AC8660 /* KMTextFieldCell.swift in Sources */,
 				BB897260294C5DDA0045787C /* KMWatermarkPropertyInfoController.swift in Sources */,
 				BB0A55162A3052F800B6E84B /* KMCustomTextField.swift in Sources */,
 				9F0201882A1DA28B00C9B673 /* KMAILanguagePopVC.swift in Sources */,
@@ -15986,6 +16048,7 @@
 				9FB220E12B10850400A5B208 /* KMAnnotationStampViewController.swift in Sources */,
 				ADBC375F29CC61E100D93208 /* KMReadModelView.swift in Sources */,
 				AD867F8829D94F5100F00440 /* KMBOTAOutlineView.swift in Sources */,
+				ADFCEB772B4FC1660001EBAF /* KMAdsWebView.swift in Sources */,
 				BB146FEF299DC0D100784A6A /* GTLRBatchResult.m in Sources */,
 				BBFEF7192B3A77E700C28AC0 /* KMSystemFileMenu.swift in Sources */,
 				9F8539C02943085A00DF644E /* KMBrowser.swift in Sources */,
@@ -16603,6 +16666,7 @@
 				BB74DA812AC42959006EDFE7 /* NSButton+KMExtension.swift in Sources */,
 				ADDF83942B391A5D00A81A4E /* DSignatureFilelistRow.swift in Sources */,
 				9F0CB4F3298655BC00007028 /* KMDesignToken+ItemSpacing.swift in Sources */,
+				ADFCEB732B4FC1410001EBAF /* KMAdsManager.swift in Sources */,
 				8942F819292B678100389627 /* KMAnnotationTableCellView.swift in Sources */,
 				AD3AAD6F2B0DCC6800DE5FE7 /* KMCompareSaveWindow.swift in Sources */,
 				BB8810CC2B4F97D000AFA63E /* VerificationManager.m in Sources */,

+ 295 - 0
PDF Office/PDF Master/Class/AD/KMAdsManager.swift

@@ -0,0 +1,295 @@
+import Cocoa
+import SystemConfiguration
+
+enum KMAdsState: Int {
+    case none = 0
+    case initialize
+    case requestOk
+    case requestFail
+    case show
+    case finish
+}
+
+//最后加载完广告的日期
+let kLastLoadingDate = "LastLoadingDate"
+//今天加载的频次
+let kTodayLoadingNumber = "TodayLoadingNumber"
+
+//评价后最后加载完广告的日期
+let kLastLoadingDateAfter = "LastLoadingDateAfter"
+//评价后今天加载的频次
+let kTodayLoadingNumberAfter = "TodayLoadingNumberAfter"
+
+let kADViewWithTag = 1000
+
+class KMAdsManager: NSObject {
+    private var adViews: [KMAdsWebView] = []
+    private var isEnableShowAds: Bool = true
+    private var appFreeTimeAdsCount: Int = 0
+    private var adsState: KMAdsState = .none
+    private var appFreeAfterTimeAdsCount: Int = 0
+
+    static let defaultManager = KMAdsManager()
+
+    private override init() {
+        super.init()
+        adViews = []
+        isEnableShowAds = true
+        appFreeTimeAdsCount = UserDefaults.standard.integer(forKey: "KMEvaluateBeforeCloseAdsNumbersKey")
+        appFreeAfterTimeAdsCount = UserDefaults.standard.integer(forKey: "KMEvaluateAfterCloseAdsNumbersKey")
+        adsState = .none
+    }
+
+    func beginSheetModal(for view: NSView, directions: KMADViewDirections, animated: Bool, completionHandler handler: @escaping (Int) -> Void) -> Bool {
+        return beginSheetModalForView(view, directions: directions, adPosY: 30.0, animated: animated, completionHandler: handler)
+    }
+
+    func beginSheetModalForView(_ view: NSView, directions: KMADViewDirections, adPosY posY: CGFloat, animated: Bool, completionHandler handler: @escaping (Int) -> Void) -> Bool {
+        
+        if let adView = self.adView(at: view) {
+            adView.removeFromSuperview()
+            adView.adPosY = posY
+            view.addSubview(adView)
+            return false
+        }
+        
+        if !isValidLastShowAds() {
+            return false
+        }
+        
+        if !checkTheDate() {
+            return false
+        }
+        
+        if !checkNetworkAvailable() {
+            return false
+        }
+        
+        switch adsState {
+        case .none, .finish:
+            adsState = .show
+        default:
+            break
+        }
+        
+        let adView = KMAdsWebView()
+        adView.adPosY = posY
+        adView.sortAdsData()
+        adView.adDelegate = self
+//        adView.tag = kADViewWithTag
+        adView.beginSheetModalForView(view: view, directions: directions, animated: animated, completionHandler: handler)
+        adViews.append(adView)
+        
+        return true
+    }
+
+    func adView(at view: NSView) -> KMAdsWebView? {
+        guard let adView = adViews.first else {
+            return nil
+        }
+//        guard let adView = view.viewWithTag(kADViewWithTag) as? KMAdsWebView else {
+//            return nil
+//        }
+        return adView
+    }
+
+    func dismissSheetModal(for view: NSView) {
+        if let adView = adViews.first {
+            adViews.removeAll { $0 == adView }
+            adView.removeFromSuperview()
+        }
+//        if let adView = view.viewWithTag(kADViewWithTag) as? KMAdsWebView {
+//            adViews.removeAll { $0 == adView }
+//            adView.removeFromSuperview()
+//        }
+
+        adsState = .finish
+        updateShowAdsDate()
+    }
+
+    func showFreeTimeAdsInfo() {
+        print("KMPurchaseCompareWindowController")
+//        KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
+    }
+
+    func checkNetworkAvailable() -> Bool {
+        guard let reachability = SCNetworkReachabilityCreateWithName(nil, "www.apple.com") else {
+            return false
+        }
+
+        var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0)
+        if SCNetworkReachabilityGetFlags(reachability, &flags) {
+            let isDataSourceAvailable = flags.contains(.reachable) && !flags.contains(.connectionRequired)
+            return isDataSourceAvailable
+        }
+
+        return false
+    }
+
+    func refreshLoadingDate() {
+        var todayLoadingNumber = 0
+
+        if !UserDefaults.standard.bool(forKey: "kUserHaveClickRateUsKey") {
+            todayLoadingNumber = UserDefaults.standard.integer(forKey: kTodayLoadingNumber)
+            todayLoadingNumber += 1
+            UserDefaults.standard.set(todayLoadingNumber, forKey: kTodayLoadingNumber)
+            let date = Date()
+            let formatter = DateFormatter()
+            formatter.dateFormat = "yyyy-MM-dd"
+            let str = formatter.string(from: date)
+            UserDefaults.standard.set(str, forKey: kLastLoadingDate)
+        } else {
+            todayLoadingNumber = UserDefaults.standard.integer(forKey: kTodayLoadingNumberAfter)
+            todayLoadingNumber += 1
+            UserDefaults.standard.set(todayLoadingNumber, forKey: kTodayLoadingNumberAfter)
+            let date = Date()
+            let formatter = DateFormatter()
+            formatter.dateFormat = "yyyy-MM-dd"
+            let str = formatter.string(from: date)
+            UserDefaults.standard.set(str, forKey: kLastLoadingDateAfter)
+        }
+    }
+
+    func checkTheDate() -> Bool {
+        if !UserDefaults.standard.bool(forKey: "kUserHaveClickRateUsKey") {
+            let dateToday = Date()
+            let formatter = DateFormatter()
+            formatter.dateFormat = "yyyy-MM-dd"
+            let str = formatter.string(from: dateToday)
+            let string = UserDefaults.standard.string(forKey: kLastLoadingDate) ?? str
+            let dateFormatter = DateFormatter()
+            dateFormatter.dateFormat = "yyyy-MM-dd"
+            guard let lastDate = dateFormatter.date(from: string) else {
+                return false
+            }
+
+            let isToday = Calendar.current.isDateInToday(lastDate)
+            if !isToday {
+                UserDefaults.standard.set(0, forKey: kTodayLoadingNumber)
+                return true
+            } else {
+                var todayLoadingNumber = 0
+                if UserDefaults.standard.integer(forKey: kTodayLoadingNumber) != 0 {
+                    todayLoadingNumber = UserDefaults.standard.integer(forKey: kTodayLoadingNumber)
+                }
+                if todayLoadingNumber >= KMKdanRemoteConfig.remoteConfig().refreshAdsRate() {
+                    return false
+                }
+            }
+        } else {
+            let dateToday = Date()
+            let formatter = DateFormatter()
+            formatter.dateFormat = "yyyy-MM-dd"
+            let str = formatter.string(from: dateToday)
+            let string = UserDefaults.standard.string(forKey: kLastLoadingDateAfter) ?? str
+            let dateFormatter = DateFormatter()
+            dateFormatter.dateFormat = "yyyy-MM-dd"
+            guard let lastDate = dateFormatter.date(from: string) else {
+                return false
+            }
+
+            let isToday = Calendar.current.isDateInToday(lastDate)
+            if !isToday {
+                UserDefaults.standard.set(0, forKey: kTodayLoadingNumberAfter)
+                return true
+            } else {
+                var todayLoadingNumber = 0
+                if UserDefaults.standard.integer(forKey: kTodayLoadingNumberAfter) != 0 {
+                    todayLoadingNumber = UserDefaults.standard.integer(forKey: kTodayLoadingNumberAfter)
+                }
+                if todayLoadingNumber >= KMKdanRemoteConfig.remoteConfig().refreshAdsRateEvaluateAfter() {
+                    return false
+                }
+            }
+        }
+        return true
+    }
+
+    func updateShowAdsDate() {
+        let defaults = UserDefaults.standard
+
+        let format = DateFormatter()
+        format.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
+        let currentDate = Date()
+        let strCurDate = format.string(from: currentDate)
+
+        defaults.setValue(strCurDate, forKey: "km_app_show_ads_date")
+        defaults.synchronize()
+    }
+
+    func isValidLastShowAds() -> Bool {
+        let defaults = UserDefaults.standard
+        var tAdsFlag = false
+
+        if let startStr = defaults.string(forKey: "km_app_show_ads_date") {
+            let format = DateFormatter()
+            format.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
+
+            guard let startD = format.date(from: startStr) else {
+                return false
+            }
+
+            var closeDate = 0
+
+            if !UserDefaults.standard.bool(forKey: "kUserHaveClickRateUsKey") {
+                closeDate = KMKdanRemoteConfig.remoteConfig().closeIntervalDate()
+            } else {
+                closeDate = KMKdanRemoteConfig.remoteConfig().closeIntervalDateEvaluateAfter()
+            }
+
+            let tCurDate = Date(timeIntervalSinceNow: TimeInterval(-closeDate))
+
+            let result = tCurDate.compare(startD)
+            if result == .orderedDescending {
+                tAdsFlag = true
+            }
+        } else {
+            if !UserDefaults.standard.bool(forKey: "kUserHaveClickRateUsKey") {
+                tAdsFlag = KMKdanRemoteConfig.remoteConfig().isDisplayAds()
+            } else {
+                tAdsFlag = KMKdanRemoteConfig.remoteConfig().isDisplayAdsEvaluateAfter()
+            }
+        }
+
+        return tAdsFlag
+    }
+}
+
+extension KMAdsManager: AdsWebViewDelegate {
+    // MARK: - KMADViewDelegate
+    func kmAdViewClose(_ tView: KMAdsWebView) {
+        for view in self.adViews {
+            view.stopLoading()
+            view.removeFromSuperview()
+        }
+        self.adViews.removeAll()
+
+        self.adsState = .finish
+        self.updateShowAdsDate()
+
+        if !UserDefaults.standard.bool(forKey: "kUserHaveClickRateUsKey") {
+            self.appFreeTimeAdsCount = (self.appFreeTimeAdsCount + 1) % KMKdanRemoteConfig.remoteConfig().appEvaluateBeforeAdsCount()
+            UserDefaults.standard.set(self.appFreeTimeAdsCount, forKey: "KMEvaluateBeforeCloseAdsNumbersKey")
+            if 0 == (self.appFreeTimeAdsCount % KMKdanRemoteConfig.remoteConfig().appEvaluateBeforeAdsCount()) {
+                self.showFreeTimeAdsInfo()
+            }
+        } else {
+            self.appFreeAfterTimeAdsCount = (self.appFreeAfterTimeAdsCount + 1) % KMKdanRemoteConfig.remoteConfig().appEvaluateAfterAdsCount()
+            UserDefaults.standard.set(self.appFreeAfterTimeAdsCount, forKey: "KMEvaluateAfterCloseAdsNumbersKey")
+            if 0 == (self.appFreeAfterTimeAdsCount % KMKdanRemoteConfig.remoteConfig().appEvaluateAfterAdsCount()) {
+                self.showFreeTimeAdsInfo()
+            }
+        }
+    }
+
+    func kmAdViewClicked(_ tView: KMAdsWebView) {
+        for view in self.adViews {
+            view.stopLoading()
+            view.removeFromSuperview()
+        }
+        self.adViews.removeAll()
+
+        self.adsState = .finish
+        self.updateShowAdsDate()
+    }
+}

+ 338 - 0
PDF Office/PDF Master/Class/AD/KMAdsWebView.swift

@@ -0,0 +1,338 @@
+import Cocoa
+import WebKit
+
+protocol AdsWebViewDelegate: AnyObject {
+    func kmAdViewClicked(_ adView: KMAdsWebView)
+    func kmAdViewClose(_ adView: KMAdsWebView)
+}
+
+enum KMADViewDirections: Int {
+    case up
+    case down
+}
+
+// Banner Ads Width,Height
+let kAD_View_Width = 728.0
+let kAD_View_Height = 90.0
+// Banner Ads refresh rate in second, 新广告会自动刷新,所以时间延长
+let kAD_Refresh_Rate = 6000.0
+
+class KMAdsWebView: NSView, WKNavigationDelegate, CAAnimationDelegate {
+    weak var adDelegate: AdsWebViewDelegate?
+
+    private var closeButton: NSButton
+    private var timer: Timer?
+    private var currentPage: Int = 0
+    private var completionHandler: ((Int) -> Void)?
+
+    private var adsWebView: WKWebView
+
+    var adPosY: CGFloat = 30.0
+
+    override init(frame frameRect: NSRect) {
+        closeButton = NSButton(frame: NSRect(x: frameRect.size.width - 30, y: frameRect.size.height - 30, width: 30, height: 30))
+        adsWebView = WKWebView(frame: frameRect)
+        
+        super.init(frame: frameRect)
+        
+        wantsLayer = true
+        self.frame = NSRect(x: 0, y: 0, width: kAD_View_Width, height: kAD_View_Height)
+        autoresizingMask = [.minXMargin, .maxXMargin]
+
+        adsWebView.navigationDelegate = self
+        adsWebView.autoresizingMask = [.width, .height]
+        addSubview(adsWebView)
+
+        adPosY = 30.0
+
+        closeButton.isHidden = false
+        closeButton.imagePosition = .imageOnly
+//        closeButton.cell?.highlightsBy = .contentsCellMask
+        closeButton.imageScaling = .scaleProportionallyUpOrDown
+        closeButton.image = NSImage(named: "ad_cancel_button00")
+        closeButton.isBordered = false
+        closeButton.target = self
+        closeButton.action = #selector(buttonItemClicked_Close(_:))
+        addSubview(closeButton)
+
+        NotificationCenter.default.addObserver(self, selector: #selector(handleUserHaveClickRateUsNotification(_:)), name: NSNotification.Name("kUserHaveClickRateUsNotification"), object: nil)
+        NotificationCenter.default.addObserver(self, selector: #selector(adsWebView_Switch), name: NSNotification.Name("KMFirebaseRemateConfigRequestIsSuccessful"), object: nil)
+    }
+
+    required init?(coder: NSCoder) {
+        fatalError("init(coder:) has not been implemented")
+    }
+
+    deinit {
+        adDelegate = nil
+        adsWebView.navigationDelegate = nil
+        adsWebView.stopLoading()
+        timer?.invalidate()
+        timer = nil
+        completionHandler = nil
+        NotificationCenter.default.removeObserver(self)
+    }
+
+    var adsData: [String] {
+        get {
+            #if VERSION_DMG
+            if !UserDefaults.standard.bool(forKey: "kUserHaveClickRateUsKey") {
+                return ["https://test.sitemaji.com/native/pdfreaderpro.html?s=PDFReaderPro_Mac_DMG_HouseAD_728x90"]
+            } else {
+                return ["https://test.sitemaji.com/native/pdfreaderpro.html?s=PDFReaderPro_Mac_DMG_728x90"]
+            }
+            #else
+            if !UserDefaults.standard.bool(forKey: "kUserHaveClickRateUsKey") {
+                return ["https://test.sitemaji.com/native/pdfreaderpro.html?s=PDFReaderPro_Mac_Store_HouseAD_728x90"]
+            } else {
+                return ["https://test.sitemaji.com/native/pdfreaderpro.html?s=PDFReaderPro_Mac_Store_728x90"]
+            }
+            #endif
+
+            if !UserDefaults.standard.bool(forKey: "kUserHaveClickRateUsKey") {
+                return [KMKdanRemoteConfig.remoteConfig().displayHouseAdsUrl()]
+            } else {
+                return [KMKdanRemoteConfig.remoteConfig().displayAdsUrl()]
+            }
+
+            #if DEBUG
+            #if VERSION_DMG
+            return ["http://test-pdf-pro.kdan.cn:3021/native?s=PDFReaderPro_Mac_DMG_HouseAD_728x90&testflag=on"]
+            #else
+            return ["http://test-pdf-pro.kdan.cn:3021/native?s=PDFReaderPro_Mac_Store_HouseAD_728x90&testflag=on"]
+            #endif
+            #endif
+        }
+        
+        set {
+            
+        }
+    }
+
+    func restoreDefaultAdPosY() {
+        adPosY = 30.0
+    }
+
+    func sortAdsData() {
+        return
+        
+        let tLength = self.adsData.count
+        
+        for _ in 0..<24 {
+            let tIndex0 = Int(arc4random()) % tLength
+            var tIndex1 = Int(arc4random()) % tLength
+            
+            if tIndex0 == tIndex1 {
+                tIndex1 = (tIndex1 + 1) % tLength
+            }
+            
+            self.adsData.swapAt(tIndex0, tIndex1)
+        }
+    }
+
+    func startAdsDataRequest() {
+        adsWebView.navigationDelegate = self
+        if adsData.count > 0 {
+            let url = URL(string: adsData[currentPage])
+            adsWebView.load(URLRequest(url: url!))
+            KMAdsManager.defaultManager.refreshLoadingDate()
+        }
+    }
+
+    func stopLoading() {
+        adsWebView.navigationDelegate = nil
+        adsWebView.stopLoading()
+    }
+
+    func resizeWithOldSuperviewSize(oldSize: NSSize) {
+        var width = kAD_View_Width
+        var height = kAD_View_Height
+        if superview?.frame.size.width ?? 0 < width {
+            let newWidth = (superview?.frame.size.width ?? 0) - 20
+            height = height / width * newWidth
+            width = newWidth
+        }
+        
+        self.frame = NSRect(x: (superview?.frame.size.width ?? 0 - width) / 2.0, y: frame.origin.y, width: width, height: height)
+        adsWebView.frame = bounds
+    }
+
+    func beginSheetModalForView(view: NSView, directions: KMADViewDirections, animated: Bool, completionHandler handler: ((Int) -> Void)?) {
+        self.completionHandler = handler
+
+        if adPosY < 0 {
+            restoreDefaultAdPosY()
+        }
+
+        let tWidth = frame.size.width
+        let tHeight = frame.size.height
+
+        view.addSubview(self)
+
+        if animated {
+            switch directions {
+            case .up:
+                frame = NSRect(x: (view.frame.size.width - tWidth) / 2.0, y: view.frame.size.height, width: tWidth, height: tHeight)
+                animator().frame = NSRect(x: frame.origin.x, y: view.frame.size.height - tHeight - adPosY, width: tWidth, height: tHeight)
+            case .down:
+                frame = NSRect(x: (view.frame.size.width - tWidth) / 2.0, y: -tHeight, width: tWidth, height: tHeight)
+                animator().frame = NSRect(x: frame.origin.x, y: adPosY, width: tWidth, height: tHeight)
+            default:
+                frame = NSRect(x: 0, y: 0, width: tWidth, height: tHeight)
+            }
+        } else {
+            switch directions {
+            case .up:
+                frame = NSRect(x: (view.frame.size.width - tWidth) / 2.0, y: view.frame.size.height - tHeight - adPosY, width: tWidth, height: tHeight)
+            case .down:
+                frame = NSRect(x: (view.frame.size.width - tWidth) / 2.0, y: adPosY, width: tWidth, height: tHeight)
+            default:
+                frame = NSRect(x: 0, y: 0, width: tWidth, height: tHeight)
+            }
+        }
+
+        adsWebView.frame = bounds
+
+        currentPage = 0
+        startAdsDataRequest()
+
+        if timer != nil {
+            timer?.invalidate()
+            timer = nil
+        }
+        var interval = 0
+        if !UserDefaults.standard.bool(forKey: "kUserHaveClickRateUsKey") {
+            interval = KMKdanRemoteConfig.remoteConfig().refreshAdsDate()
+        } else {
+            interval = KMKdanRemoteConfig.remoteConfig().refreshAdsDateEvaluateAfter()
+        }
+        timer = Timer.scheduledTimer(timeInterval: TimeInterval(interval), target: self, selector: #selector(adsWebView_Switch), userInfo: nil, repeats: true
+
+)
+
+        RunLoop.current.add(timer!, forMode: .common)
+    }
+
+    @objc func adsWebView_Switch() {
+        DispatchQueue.main.async {
+            if !KMKdanRemoteConfig.remoteConfig().isDisplayAds() || !KMAdsManager.defaultManager.checkTheDate() || !KMAdsManager.defaultManager.isValidLastShowAds() {
+                self.removeFromSuperview()
+                return
+            }
+
+            let transition = CATransition()
+            transition.type = .moveIn
+
+            let tRandomData = arc4random() % 100
+            if tRandomData > 50 {
+                transition.subtype = .fromBottom
+            } else {
+                transition.subtype = .fromTop
+            }
+
+            transition.duration = 0.6
+            transition.delegate = self
+            self.layer?.add(transition, forKey: "KMTransitionAnimation")
+
+            self.currentPage += 1
+            if self.currentPage >= self.adsData.count {
+                self.currentPage = 0
+            }
+
+            let url = URL(string: self.adsData[self.currentPage])
+            self.adsWebView.load(URLRequest(url: url!))
+            KMAdsManager.defaultManager.refreshLoadingDate()
+        }
+    }
+
+    @objc func buttonItemClicked_Open(_ sender: Any) {
+        guard let newURL = (sender as? NSURL) else {
+            return
+        }
+
+        NSWorkspace.shared.open(newURL as URL)
+
+        adDelegate?.kmAdViewClicked(self)
+
+        if let completionHandler = self.completionHandler {
+            completionHandler(currentPage + 1)
+            self.completionHandler = nil
+        }
+        removeFromSuperview()
+    }
+
+    @objc func buttonItemClicked_Close(_ sender: Any) {
+        adDelegate?.kmAdViewClose(self)
+
+        if let completionHandler = self.completionHandler {
+            completionHandler(0)
+            self.completionHandler = nil
+        }
+        removeFromSuperview()
+    }
+
+    func animationDidStart(_ anim: CAAnimation) {
+        if timer != nil {
+            timer?.invalidate()
+        }
+
+        closeButton.alphaValue = 0
+    }
+
+    func animationDidStop(_ anim: CAAnimation, finished flag: Bool) {
+        if !flag {
+            return
+        }
+
+        if timer != nil {
+            timer?.invalidate()
+        }
+        var interval = 0
+        if !UserDefaults.standard.bool(forKey: "kUserHaveClickRateUsKey") {
+            interval = KMKdanRemoteConfig.remoteConfig().refreshAdsDate()
+        } else {
+            interval = KMKdanRemoteConfig.remoteConfig().refreshAdsDateEvaluateAfter()
+        }
+        timer = Timer.scheduledTimer(timeInterval: TimeInterval(interval), target: self, selector: #selector(adsWebView_Switch), userInfo: nil, repeats: true)
+
+        RunLoop.current.add(timer!, forMode: .common)
+
+        closeButton.alphaValue = 1.0
+
+        adsWebView.frame = bounds
+    }
+
+    // MARK: - WKNavigationDelegate
+
+    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
+        if navigationAction.navigationType == .linkActivated {
+            let tURL = navigationAction.request.url
+            if tURL != nil {
+                buttonItemClicked_Open(tURL as Any)
+                decisionHandler(.cancel)
+                return
+            }
+        }
+
+        decisionHandler(.allow)
+    }
+
+    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
+        webView.evaluateJavaScript("document.body.scrollHeight") { [weak self] (result, error) in
+            if let height = result as? CGFloat, height > 0 {
+                let newHeight = min(height, kAD_View_Height)
+                self?.adsWebView.frame = NSRect(x: 0, y: 0, width: (self?.adsWebView.frame.size.width)!, height: newHeight)
+                self?.frame.size.height = newHeight
+                self?.closeButton.frame = NSRect(x: (self?.frame.size.width)! - 30, y: (self?.frame.size.height)! - 30, width: 30, height: 30)
+            }
+        }
+    }
+
+    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
+        print(error)
+    }
+
+    @objc func handleUserHaveClickRateUsNotification(_ notification: Notification) {
+        adsWebView_Switch()
+    }
+}

BIN
PDF Office/PDF Master/Class/AD/images/ad_cancel_button00.png


BIN
PDF Office/PDF Master/Class/AD/images/ad_cancel_button00@2x.png


BIN
PDF Office/PDF Master/Class/AD/images/ad_cancel_button00@4x.png


+ 0 - 22
PDF Office/PDF Master/Class/Appearance/Image.xcassets/PDF Tools/KMImageNameUXIconBtnArrowDown.imageset/Contents.json

@@ -1,22 +0,0 @@
-{
-  "images" : [
-    {
-      "filename" : "light_ic_btn_arrow_down.pdf",
-      "idiom" : "mac"
-    },
-    {
-      "appearances" : [
-        {
-          "appearance" : "luminosity",
-          "value" : "dark"
-        }
-      ],
-      "filename" : "light_ic_btn_arrow_down-1.pdf",
-      "idiom" : "mac"
-    }
-  ],
-  "info" : {
-    "author" : "xcode",
-    "version" : 1
-  }
-}

BIN
PDF Office/PDF Master/Class/Appearance/Image.xcassets/PDF Tools/KMImageNameUXIconBtnArrowDown.imageset/light_ic_btn_arrow_down-1.pdf


BIN
PDF Office/PDF Master/Class/Appearance/Image.xcassets/PDF Tools/KMImageNameUXIconBtnArrowDown.imageset/light_ic_btn_arrow_down.pdf


+ 24 - 0
PDF Office/PDF Master/Class/Batch/View/KMTextFieldCell.swift

@@ -0,0 +1,24 @@
+//
+//  KMTextFieldCell.swift
+//  PDF Master
+//
+//  Created by liujiajie on 2024/1/11.
+//
+
+import Cocoa
+
+class KMTextFieldCell: NSTextFieldCell{
+    override func drawingRect(forBounds rect: NSRect) -> NSRect {
+        var newRect:NSRect = super.drawingRect(forBounds: rect)
+        let textSize:NSSize = self.cellSize(forBounds: rect)
+        let heightDelta:CGFloat = newRect.size.height - textSize.height
+        if heightDelta > 0 {
+            newRect.size.height = textSize.height
+            newRect.origin.y += heightDelta * 0.5
+        }
+        newRect.origin.x += 3
+        return newRect
+    }
+}
+
+

+ 2 - 2
PDF Office/PDF Master/Class/Batch/WindowController/VC/KMBatchOperateImageToPDFViewController.xib

@@ -72,8 +72,8 @@
                     <rect key="frame" x="34" y="279" width="430" height="24"/>
                     <subviews>
                         <textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="AKV-3R-iGQ">
-                            <rect key="frame" x="1" y="1" width="400" height="22"/>
-                            <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" state="on" drawsBackground="YES" id="V8A-qR-hoa">
+                            <rect key="frame" x="-1" y="1" width="404" height="22"/>
+                            <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" state="on" alignment="left" id="V8A-qR-hoa" customClass="KMTextFieldCell" customModule="PDF_Master" customModuleProvider="target">
                                 <font key="font" metaFont="system"/>
                                 <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                                 <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>

+ 1 - 1
PDF Office/PDF Master/Class/GuideInfo/Controllers/FunctionGuide/KMConvertGuideView.swift

@@ -118,7 +118,7 @@ class KMConvertGuideView: NSView, NibLoadable {
         self.shadowView.layer?.shadowRadius = 3.0
         let shadowPath = NSBezierPath(rect: self.shadowView.bounds)
         if #available(macOS 14.0, *) {
-            self.shadowView.layer?.shadowPath = shadowPath.cgPath
+            self.shadowView.layer?.shadowPath = shadowPath.kmCGPath()
         }
         
         DistributedNotificationCenter.default().addObserver(self, selector: #selector(themeChange), name: NSNotification.Name(rawValue: "AppleInterfaceThemeChangedNotification"), object: nil)

+ 1 - 1
PDF Office/PDF Master/Class/GuideInfo/Controllers/FunctionGuide/KMCustomColorGuideView.swift

@@ -91,7 +91,7 @@ class KMCustomColorGuideView: NSView, NibLoadable {
         self.shadowView.layer?.shadowRadius = 3.0
         let shadowPath = NSBezierPath(rect: self.shadowView.bounds)
         if #available(macOS 14.0, *) {
-            self.shadowView.layer?.shadowPath = shadowPath.cgPath
+            self.shadowView.layer?.shadowPath = shadowPath.kmCGPath()
         }
         
         DistributedNotificationCenter.default().addObserver(self, selector: #selector(themeChange), name: NSNotification.Name(rawValue: "AppleInterfaceThemeChangedNotification"), object: nil)

+ 1 - 1
PDF Office/PDF Master/Class/GuideInfo/Controllers/FunctionGuide/KMOpenFileFunctionView.swift

@@ -120,7 +120,7 @@ class KMOpenFileFunctionView: NSView, NibLoadable {
             self.shadowView.frame = self.tipInfoView.frame
             let shadowPath = NSBezierPath(rect: self.shadowView.bounds)
             if #available(macOS 14.0, *) {
-                self.shadowView.layer?.shadowPath = shadowPath.cgPath
+                self.shadowView.layer?.shadowPath = shadowPath.kmCGPath()
             }
         }
         self.getItBox.fillColor = KMAppearance.KMColor_Interactive_A0()

+ 1 - 1
PDF Office/PDF Master/Class/GuideInfo/Controllers/OpenFileGuide/KMOpenFileGuidePanel.swift

@@ -105,7 +105,7 @@ class KMOpenFileGuidePanel: NSView, NibLoadable {
         self.shadowView.layer?.shadowRadius = 3.0
         let shadowPath = NSBezierPath(rect: self.shadowView.bounds)
         if #available(macOS 14.0, *) {
-            self.shadowView.layer?.shadowPath = shadowPath.cgPath
+            self.shadowView.layer?.shadowPath = shadowPath.kmCGPath()
         }
     }
     

+ 1 - 1
PDF Office/PDF Master/Class/GuideInfo/Controllers/OpenFileGuide/KMOpenFileGuideProperty.swift

@@ -129,7 +129,7 @@ class KMOpenFileGuideProperty: NSView, NibLoadable {
         self.shadowView.layer?.shadowRadius = 3.0
         let shadowPath = NSBezierPath(rect: self.shadowView.bounds)
         if #available(macOS 14.0, *) {
-            self.shadowView.layer?.shadowPath = shadowPath.cgPath
+            self.shadowView.layer?.shadowPath = shadowPath.kmCGPath()
         }
         
         DistributedNotificationCenter.default().addObserver(self, selector: #selector(themeChange), name: NSNotification.Name(rawValue: "AppleInterfaceThemeChangedNotification"), object: nil)

+ 1 - 1
PDF Office/PDF Master/Class/GuideInfo/Controllers/OpenFileGuide/KMOpenFileGuideToolbar.swift

@@ -131,7 +131,7 @@ class KMOpenFileGuideToolbar: NSView, NibLoadable {
         self.shadowView.layer?.shadowRadius = 3.0
         let shadowPath = NSBezierPath(rect: self.shadowView.bounds)
         if #available(macOS 14.0, *) {
-            self.shadowView.layer?.shadowPath = shadowPath.cgPath
+            self.shadowView.layer?.shadowPath = shadowPath.kmCGPath()
         }
         
         DistributedNotificationCenter.default().addObserver(self, selector: #selector(themeChange), name: NSNotification.Name(rawValue: "AppleInterfaceThemeChangedNotification"), object: nil)

+ 2 - 2
PDF Office/PDF Master/Class/Home/View/KMComboBox.swift

@@ -24,8 +24,8 @@ class KMComboBox: NSComboBox {
             var p = comboxRect.origin
             p.x += comboxRect.width - 23
             p.y += (comboxRect.height - 16) / 2
-
-            NSColor.clear.setFill()
+            
+            NSColor.init(red: 245/255.0, green: 246/255.0, blue: 249/255.0, alpha: 1.0).setFill()
             NSRect(x: p.x, y: 0, width: 16.0, height: comboxRect.height).fill()
 
             let image = NSImage(named: "KMImageNameUXIconBtnArrowDown")

+ 3 - 0
PDF Office/PDF Master/Class/PDFTools/Convert/ExtractImage/Controller/KMExtractImageWindowController.xib

@@ -49,6 +49,9 @@
                         <buttonCell key="cell" type="push" title="Button" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="m1D-HD-mdF">
                             <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
                             <font key="font" metaFont="system"/>
+                            <string key="keyEquivalent" base64-UTF8="YES">
+DQ
+</string>
                         </buttonCell>
                         <constraints>
                             <constraint firstAttribute="height" constant="20" id="8ps-dr-hvn"/>

+ 2 - 1
PDF Office/PDF Master/Class/PDFTools/Print/KMPrintWindowController.swift

@@ -210,7 +210,8 @@ class KMPrintWindowController: KMBaseWindowController, NetServiceBrowserDelegate
         let filePath = KMPrintPresenter.fetchSaveFilePath("")
         var password: String = ""
         if inputDocument != nil {
-            if inputDocument != nil {
+//            if inputDocument != nil {
+            if inputDocument is CPDFDocument {
                 let success = inputDocument?.writeDecrypt(to: URL(fileURLWithPath: filePath))
                 password = inputDocument?.password ?? ""
                 if success != nil {