KMMainViewController.swift 181 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372
  1. //
  2. // KMMainViewController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by wanjun on 2022/12/15.
  6. //
  7. import Cocoa
  8. import KMComponentLibrary
  9. @objcMembers class KMMainViewController: KMBaseViewController, NSTextFieldDelegate {
  10. @IBOutlet var contendBox: NSBox!
  11. @IBOutlet var toolbarBox: NSBox! //工具栏Box
  12. @IBOutlet var bottomContendBox: NSBox! //
  13. @IBOutlet var sidebarBox: NSBox! //左侧边栏Box
  14. @IBOutlet var infoContendSplitView: KMPDFSplitView!
  15. @IBOutlet var infoSplitLeftView: NSView!
  16. @IBOutlet var infoSplitRightView: NSView!
  17. @IBOutlet var infoSplitCenterView: NSView!
  18. @IBOutlet var pdfSplitView: NSSplitView!
  19. @IBOutlet var pdfSplitTopView: NSView!
  20. @IBOutlet var pdfSplitBottomView: NSView!
  21. @IBOutlet var toolbarBoxHeightConst: NSLayoutConstraint!
  22. @IBOutlet var infoSplitViewLeftConst: NSLayoutConstraint!
  23. var viewManager: KMPDFViewManager = KMPDFViewManager.init()
  24. var toolbarManager: KMPDFToolbarManager = KMPDFToolbarManager.init()
  25. var listView: CPDFListView = CPDFListView.init()
  26. var document: CPDFDocument?
  27. var myDocument: NSDocument?
  28. var insertDocuments: Set<CPDFDocument> = [] //插入新文档时,SDK会出现崩溃,临时记录
  29. //工具栏
  30. private var pdfToolbarController: KMPDFToolbarController?
  31. //BOTA SideBar
  32. private var sideBarController: KMPDFSideBarController?
  33. //页面编辑
  34. private var pageEditViewController: KMNPageEditViewController?
  35. //DisplaySetting
  36. private var displaySettingController: KMNDisplayViewController?
  37. //SPlitPDF分屏视图
  38. private var splitPDFController: KMSplitPDFViewController?
  39. private var pdfBottomToolbar: KMSplitToolbar?
  40. //PPT操作界面
  41. var presentationTopViewController: KMPresentationTopViewController?
  42. //Edit
  43. var editToolbarView: KMEditToolbarView?
  44. //水印
  45. var watermarkViewController: KMWatermarkController?
  46. //背景
  47. var backgroundViewController: KMBackgroundController?
  48. //左边
  49. var botaViewController: KMNLeftSideViewController?
  50. //MARK: - 旧代码,有需要用到的拿出来,写好备注
  51. @IBOutlet var PDFContendView: NSView!
  52. @IBOutlet var centerContentView: NSView!
  53. @IBOutlet weak var readContentView: NSView!
  54. @IBOutlet weak var tipCurrentPageBox: KMBox!
  55. @IBOutlet weak var rightView: NSView!
  56. @IBOutlet weak var leftView: NSView!
  57. @IBOutlet weak var mianSplitView: KMSplitView!
  58. @IBOutlet weak var newPDFSplitView: KMSplitView!
  59. @IBOutlet weak var pdfContentView: NSView!
  60. @IBOutlet var childToolbarController: KMToolbarViewController!
  61. @IBOutlet var toolbarController: KMToolbarController!
  62. @IBOutlet weak var heightOffset: NSLayoutConstraint!
  63. //页码显示器
  64. @IBOutlet weak var pageNumberDisplayView: KMPageNumberDisplayView!
  65. var model = KMMainModel()
  66. //自动滚动
  67. var autoFlowOptionsSheetController: KMAutoFlowOptionsSheetController?
  68. //Search
  69. var searchIndex: Int = 0
  70. //Form
  71. var formAlertView: KMFormAlertView?
  72. //Secure
  73. var secureAlertView: KMSecureAlertView?
  74. //对比
  75. var isCompareModel: Bool = false {
  76. didSet {
  77. self.toolbarController.updataItemVisible()
  78. }
  79. }
  80. //合并
  81. var mergeWindowController: KMMergeWindowController?
  82. //水印
  83. var watermarkWindowController: KMWatermarkWindowController?
  84. //密码弹窗
  85. var passwordWindow: KMPasswordInputWindow?
  86. //对比
  87. var compressWIndowControllerNew: KMCompressWIndowControllerNew?
  88. //
  89. var securityWindowController: KMSecurityWindowController?
  90. //引导
  91. var guideInfoWindowController: KMGuideInfoWindowController?
  92. //春季活动
  93. var recommondPopWindowVC: KMRecommondPopWindow?
  94. var removeAllAnnotationsStore = KMPDFViewRemoveAllAnnotationsStore()
  95. private var _needSave = false
  96. var needSave: Bool {
  97. set {
  98. _needSave = newValue
  99. if (_needSave == false) {
  100. self.clearIsPDFDocumentEdited()
  101. }
  102. }
  103. get {
  104. return _needSave
  105. }
  106. }
  107. var isPDFDocumentEdited: Bool {
  108. get {
  109. return self.model.isPDFDocumentEdited
  110. }
  111. }
  112. var leftSideViewController: KMLeftSideViewController = KMLeftSideViewController.init(type: KMLeftMethodMode())
  113. var rightSideViewController: KMRightSideViewController!
  114. var searchResults: [KMSearchMode] = []
  115. var mwcFlags: MwcFlags = MwcFlags()
  116. weak var browserWindowController: KMBrowserWindowController? //慎直接使用这个方法
  117. var cropSettingWindowController: KMCropSettingWindowController!
  118. var currentWindowController: NSWindowController!
  119. var savedNormalSetup: NSMutableDictionary = NSMutableDictionary()
  120. //数字签名
  121. var digitalSignController: KMPDFDigitalSignViewController?
  122. var redactController: KMPDFRedactViewController!
  123. let CPDFOfficeLeftSidePaneWidthKey = "CPDFOfficeLeftSidePaneWidthKey"
  124. let CPDFOfficeRightSidePaneWidthKey = "CPDFOfficeRightSidePaneWidthKey"
  125. var extract: KMExtractImageWindowController?
  126. var functionWidth: Double {
  127. get {
  128. if self.viewManager.isPDFReadMode {
  129. if !self.model.isShowBOTA {
  130. return 0
  131. }
  132. }
  133. return 48-4
  134. }
  135. }
  136. var pageNumber: UInt?
  137. var secondaryPdfContentView: NSView?
  138. var lastSplitPDFHeight: Float = 0.0
  139. var pdfEditController: KMPDFEditViewController? {
  140. get {
  141. return self.getPDFEditController()
  142. }
  143. }
  144. var autoSaveTimer: Timer?
  145. private var _documentFirstLoad: Bool = true
  146. var eventMonitor: Any?
  147. var keyEventMonitor: Any?
  148. var mouseRightMenuEvent: NSEvent?
  149. lazy private var homeVC: KMNHomeViewController? = {
  150. let vc = KMNHomeViewController()
  151. return vc
  152. }()
  153. private var background_mask: NSView?
  154. fileprivate var _secureOptions: [CPDFDocumentWriteOption : Any]?
  155. var secureOptions: [CPDFDocumentWriteOption : Any]? {
  156. get {
  157. return self._secureOptions
  158. }
  159. }
  160. var documentAttribute: [CPDFDocumentAttribute : Any]?
  161. fileprivate var _removeSecureFlag = false
  162. var removeSecureFlag: Bool {
  163. get {
  164. return self._removeSecureFlag
  165. }
  166. }
  167. fileprivate var _saveWatermarkFlag = false
  168. var saveWatermarkFlag: Bool {
  169. get {
  170. return self._saveWatermarkFlag
  171. }
  172. }
  173. private var mainWindow_: NSWindow?
  174. var mainWindow: NSWindow? {
  175. get {
  176. return self.mainWindow_
  177. }
  178. set {
  179. self.mainWindow_ = newValue
  180. }
  181. }
  182. var setDocument: CPDFDocument? {
  183. get {
  184. return document
  185. }
  186. set {
  187. if document != newValue {
  188. document = newValue
  189. }
  190. listView.document = document
  191. botaViewController?.changeDocument(document: document)
  192. }
  193. }
  194. var setPageNumber: UInt {
  195. get {
  196. return pageNumber!
  197. }
  198. set {
  199. let pageCount = listView.document?.pageCount ?? 0
  200. var value = newValue
  201. if value > pageCount {
  202. value = pageCount
  203. }
  204. if value > 0 && listView.currentPage().pageIndex() != value-1 {
  205. listView.go(to: listView.document?.page(at: value-1))
  206. }
  207. if pageNumber != value {
  208. pageNumber = value
  209. }
  210. }
  211. }
  212. let editPDFHanddler = KMEditPDfHanddler()
  213. var distanceMeasureInfoWindowController: CDistanceMeasureInfoWindowController?
  214. var perimeterMeasureInfoWindowController: CPerimeterMeasureInfoWindowController?
  215. var areaMeasureInfoWindowController: CAreaMeasureInfoWindowController?
  216. var srHanddler: KMSearchReplaceHanddler = KMSearchReplaceHanddler()
  217. //MARK: - func
  218. deinit {
  219. NotificationCenter.default.removeObserver(self)
  220. self.listView.delegate = nil
  221. self.listView.document?.delegate = nil
  222. self.editPDFHanddler.clearData()
  223. self.removeEventMonitor()
  224. self.removeKeyEventMonitor()
  225. }
  226. override func viewDidLoad() {
  227. super.viewDidLoad()
  228. // Do view setup here.
  229. toolbarManager.pdfViewManager = viewManager
  230. }
  231. override func viewDidAppear() {
  232. super.viewDidAppear()
  233. setupUI()
  234. }
  235. func setupUI() {
  236. initPDFView()
  237. initToolbar()
  238. initSideBar()
  239. setUpSplitView()
  240. }
  241. private func documentLoadComplete() {
  242. initBotaView()
  243. }
  244. func leftSidePaneIsOpen() -> Bool {
  245. if(botaViewController != nil) {
  246. return infoContendSplitView.isSubviewCollapsed(botaViewController!.view)
  247. }
  248. return false
  249. }
  250. private func toggleOpenLeftSide(pdfSideBarType: KMPDFSidebarType) {
  251. if(leftSidePaneIsOpen() == false) {
  252. infoContendSplitView.setPosition(264, ofDividerAt: 0)
  253. }
  254. if pdfSideBarType == .search {
  255. KMPrint(" search")
  256. } else if pdfSideBarType == .thumbnail {
  257. botaViewController?.leftsideType = pdfSideBarType
  258. KMPrint(" thumbnail")
  259. } else if pdfSideBarType == .outline {
  260. KMPrint(" outline")
  261. } else if pdfSideBarType == .bookmark {
  262. botaViewController?.bookmarkViewC.handdler = KMNBookmarkHanddler(pdfView: self.listView)
  263. botaViewController?.leftsideType = pdfSideBarType
  264. } else if pdfSideBarType == .annotation {
  265. KMPrint(" annotation")
  266. }
  267. }
  268. private func toggleCloseLeftSide() {
  269. if(leftSidePaneIsOpen() == true) {
  270. infoContendSplitView.setPosition(-20, ofDividerAt: 0)
  271. }
  272. }
  273. //MARK: - PDFView
  274. func initPDFView() {
  275. listView.autoresizingMask = [.width, .height]
  276. listView.delegate = self
  277. listView.pdfListViewDelegate = self
  278. listView.document = self.document
  279. reloadPDFSplitInfo()
  280. }
  281. //MARK: - SplitView
  282. func setUpSplitView() {
  283. infoContendSplitView.wantsLayer = true
  284. infoContendSplitView.layer?.backgroundColor = NSColor.clear.cgColor
  285. infoContendSplitView.delegate = self
  286. infoContendSplitView.layer?.masksToBounds = true
  287. infoContendSplitView.setPosition(-10, ofDividerAt: 0)
  288. infoContendSplitView.setPosition(CGRectGetWidth(infoContendSplitView.frame), ofDividerAt: 1)
  289. }
  290. func setupSplitPDFController() {
  291. if splitPDFController == nil {
  292. splitPDFController = KMSplitPDFViewController.init()
  293. }
  294. splitPDFController?.view.frame = pdfSplitBottomView.bounds
  295. splitPDFController?.view.autoresizingMask = [.height, .width]
  296. splitPDFController?.viewManager = self.viewManager
  297. splitPDFController?.delegate = self
  298. splitPDFController?.reloadData()
  299. pdfSplitBottomView.addSubview(splitPDFController!.view)
  300. }
  301. //MARK: - 工具栏
  302. func initToolbar() {
  303. toolbarBox.borderWidth = 0
  304. if pdfToolbarController == nil {
  305. pdfToolbarController = KMPDFToolbarController.init()
  306. }
  307. pdfToolbarController?.view.frame = toolbarBox.bounds
  308. pdfToolbarController?.view.autoresizingMask = [.width, .height]
  309. pdfToolbarController?.delegate = self
  310. toolbarBox.contentView = pdfToolbarController?.view
  311. pdfToolbarController?.viewManager = viewManager
  312. pdfToolbarController?.toolbarManager = toolbarManager
  313. pdfToolbarController?.pdfView = listView
  314. pdfToolbarController?.setUpData()
  315. refreshToolbarView()
  316. }
  317. func refreshToolbarView() {
  318. let _manager = viewManager
  319. if _manager.isPageEditMode {
  320. toolbarBoxHeightConst.constant = 80
  321. } else if _manager.editType == .watermark || _manager.editType == .background || _manager.editType == .header_Footer || _manager.editType == .bates {
  322. toolbarBoxHeightConst.constant = 40
  323. } else if _manager.toolMode == .Markup ||
  324. _manager.toolMode == .Edit ||
  325. _manager.toolMode == .Form ||
  326. _manager.toolMode == .Fill ||
  327. _manager.toolMode == .Convert ||
  328. _manager.toolMode == .Protect ||
  329. _manager.toolMode == .Tools {
  330. toolbarBoxHeightConst.constant = 80
  331. } else {
  332. toolbarBoxHeightConst.constant = 40
  333. }
  334. }
  335. //MARK: - 侧边栏
  336. func initSideBar() {
  337. sidebarBox.borderWidth = 0
  338. if sideBarController == nil {
  339. sideBarController = KMPDFSideBarController.init()
  340. }
  341. sideBarController?.view.frame = sidebarBox.bounds
  342. sideBarController?.view.autoresizingMask = [.width, .height]
  343. sidebarBox.contentView = sideBarController?.view
  344. sideBarController?.pdfView = listView
  345. sideBarController?.delegate = self
  346. sideBarController?.pdfViewManager = viewManager
  347. sideBarController?.reloadData()
  348. }
  349. //MARK: - 侧边栏
  350. func initBotaView() {
  351. if botaViewController == nil {
  352. botaViewController = KMNLeftSideViewController(listView.document)
  353. }
  354. botaViewController?.leftSideViewDelegate = self
  355. botaViewController?.view.frame = infoSplitLeftView.bounds
  356. botaViewController?.view.autoresizingMask = [.width, .height]
  357. if botaViewController != nil {
  358. infoSplitLeftView?.addSubview(botaViewController!.view)
  359. }
  360. }
  361. //MARK: - PDFDisplayView
  362. func updatePDFDisplaySettingView() {
  363. if viewManager.showDisplayView {
  364. infoSplitViewLeftConst.constant = 264
  365. } else {
  366. infoSplitViewLeftConst.constant = 44
  367. }
  368. if viewManager.showDisplayView {
  369. if displaySettingController == nil {
  370. displaySettingController = KMNDisplayViewController.init()
  371. }
  372. displaySettingController?.view.frame = CGRectMake(0, 0, 264, CGRectGetHeight(bottomContendBox.frame))
  373. displaySettingController?.view.autoresizingMask = [.height, .maxXMargin]
  374. bottomContendBox.addSubview(displaySettingController!.view)
  375. displaySettingController?.pdfView = self.listView
  376. displaySettingController?.viewManager = self.viewManager
  377. displaySettingController?.delegate = self
  378. displaySettingController?.reloadData()
  379. } else {
  380. displaySettingController?.view.removeFromSuperview()
  381. displaySettingController = nil
  382. }
  383. }
  384. //MARK: - 页面编辑
  385. func enterPageEditMode() {
  386. pageEditViewController = KMNPageEditViewController(self.document)
  387. if(pageEditViewController != nil) {
  388. bottomContendBox.addSubview(pageEditViewController!.view)
  389. pageEditViewController?.view.frame = bottomContendBox.bounds
  390. pageEditViewController?.thumbnailBaseViewDelegate = self
  391. pageEditViewController?.selectionIndexPaths = [IndexPath(item: listView.currentPageIndex, section: 0)]
  392. pageEditViewController?.view.autoresizingMask = [.width,.height]
  393. }
  394. }
  395. func exitPageEditMode() {
  396. if pageEditViewController != nil {
  397. pageEditViewController?.view.removeFromSuperview()
  398. pageEditViewController = nil
  399. }
  400. }
  401. //MARK: - 阅读模式
  402. func openPDFReadMode() {
  403. if viewManager.showDisplayView {
  404. viewManager.showDisplayView = false
  405. pdfToolbarController?.reloadLeftIconView()
  406. updatePDFDisplaySettingView()
  407. }
  408. infoSplitViewLeftConst.constant = 0
  409. toolbarBoxHeightConst.constant = 0
  410. view.window?.makeFirstResponder(listView)
  411. }
  412. func exitPDFReadMode() {
  413. viewManager.isPDFReadMode = false
  414. updatePDFDisplaySettingView()
  415. refreshToolbarView()
  416. }
  417. //MARK: - PPT
  418. func togglePresentation(_ sender: Any?) {
  419. if self.canExitPresentation() {
  420. exitFullScreen()
  421. } else if self.canEnterPresentation() {
  422. NotificationCenter.default.addObserver(self, selector: #selector(willEnterInteractionModeNotification), name: NSWindow.willEnterInteractionModeNotification, object: nil)
  423. NotificationCenter.default.addObserver(self, selector: #selector(didEnterInteractionModeNotification), name: NSWindow.didEnterInteractionModeNotification, object: nil)
  424. NotificationCenter.default.addObserver(self, selector: #selector(willShowFullScreenNotification), name: NSWindow.willShowFullScreenNotification, object: nil)
  425. NotificationCenter.default.addObserver(self, selector: #selector(didShowFullScreenNotification), name: NSWindow.didShowFullScreenNotification, object: nil)
  426. view.window?.enterPresentation(provider: self)
  427. }
  428. }
  429. func enterPresentationMode() {
  430. let scrollView = listView.documentView().enclosingScrollView
  431. savedNormalSetup.setValue(scrollView?.hasHorizontalScroller, forKey: KMMainModel.Key.kHasHorizontalScroller)
  432. savedNormalSetup.setValue(scrollView?.hasVerticalScroller, forKey: KMMainModel.Key.kHasVerticalsCroller)
  433. savedNormalSetup.setValue(scrollView?.autohidesScrollers, forKey: KMMainModel.Key.kAutoHidesScrollers)
  434. listView.backgroundColor = NSColor.clear
  435. listView.setDisplay(.singlePage)
  436. listView.autoScales = true
  437. listView.displayBox = .cropBox
  438. listView.displaysPageBreaks = false
  439. scrollView?.autohidesScrollers = true
  440. scrollView?.hasHorizontalScroller = false
  441. scrollView?.hasVerticalScroller = false
  442. listView.setCurrentSelection(nil, animate: true)
  443. }
  444. func exitPresentationMode() {
  445. NotificationCenter.default.removeObserver(self, name: NSWindow.willEnterInteractionModeNotification, object: nil)
  446. NotificationCenter.default.removeObserver(self, name: NSWindow.didEnterInteractionModeNotification, object: nil)
  447. NotificationCenter.default.removeObserver(self, name: NSWindow.willShowFullScreenNotification, object: nil)
  448. NotificationCenter.default.removeObserver(self, name: NSWindow.willShowFullScreenNotification, object: nil)
  449. }
  450. func exitFullScreen() {
  451. if self.canExitPresentation() == true {
  452. let mainDocument = self.myDocument as? KMMainDocument
  453. let browserWindowController = mainDocument?.browser?.windowController as? KMBrowserWindowController
  454. browserWindowController?.exitFullscreen()
  455. }
  456. }
  457. func exitFullscreenMode() {
  458. if self.interactionMode == .presentation {
  459. self.exitPresentationMode()
  460. }
  461. self.applyPDFSettings(self.savedNormalSetup)
  462. self.savedNormalSetup.removeAllObjects()
  463. listView.layoutDocumentView()
  464. listView.requiresDisplay()
  465. if let backgroundColor = UserDefaults.standard.color(forKey: KMBackgroundColorKey) {
  466. listView.backgroundColor = backgroundColor
  467. }
  468. }
  469. func applyPDFSettings(_ setup: NSDictionary) {
  470. if let data = setup.object(forKey: KMMainModel.Key.kAutoScales) as? NSNumber {
  471. self.listView.autoScales = data.boolValue
  472. }
  473. if self.listView.autoScales == false {
  474. if let data = setup.object(forKey: KMMainModel.Key.kScaleFactor) as? NSNumber {
  475. self.listView.scaleFactor = data.floatValue.cgFloat
  476. }
  477. }
  478. if let data = setup.object(forKey: KMMainModel.Key.kDisplayMode) as? NSNumber {
  479. self.listView.setDisplay(CPDFDisplayViewMode(rawValue: data.intValue) ?? .singlePage)
  480. }
  481. if let data = setup.object(forKey: KMMainModel.Key.kDisplaysAsBook) as? NSNumber {
  482. self.listView.displaysAsBook = data.boolValue
  483. }
  484. if let data = setup.object(forKey: KMMainModel.Key.kDisplaysPageBreaks) as? NSNumber {
  485. self.listView.displaysPageBreaks = data.boolValue
  486. }
  487. if let data = setup.object(forKey: KMMainModel.Key.kDisplayBox) as? NSNumber {
  488. }
  489. self.listView.layoutDocumentView()
  490. }
  491. func currentPDFSettings() -> NSDictionary {
  492. let setup = NSMutableDictionary()
  493. setup[KMMainModel.Key.kDisplaysPageBreaks] = NSNumber(value: listView.displaysPageBreaks)
  494. setup[KMMainModel.Key.kDisplaysAsBook] = NSNumber(value: listView.displaysAsBook)
  495. setup[KMMainModel.Key.kDisplayBox] = NSNumber(value: listView.displayBox.rawValue)
  496. setup[KMMainModel.Key.kScaleFactor] = NSNumber(value: listView.scaleFactor)
  497. setup[KMMainModel.Key.kAutoScales] = NSNumber(value: listView.autoScales)
  498. setup[KMMainModel.Key.kDisplayMode] = NSNumber(value: listView.fetchDisplayViewMode().rawValue)
  499. return setup
  500. }
  501. func canEnterFullscreen() -> Bool {
  502. if (mwcFlags.isSwitchingFullScreen != 0) {
  503. return false
  504. }
  505. if useNativeFullScreen() {
  506. return interactionMode == .normal || interactionMode == .presentation
  507. } else {
  508. return !self.listView.document.isLocked && (interactionMode == .normal || interactionMode == .presentation) && self.view.window?.tabbedWindows?.count ?? 0 < 2
  509. }
  510. }
  511. override func canEnterPresentation() -> Bool {
  512. let can = super.canEnterPresentation()
  513. if can == false {
  514. return false
  515. }
  516. guard let doc = self.listView.document, doc.isLocked == false else {
  517. return false
  518. }
  519. return can
  520. }
  521. func fadeOutFullScreenWindow() {
  522. guard let fullScreenWindow = self.view.window as? KMFullScreenWindow else {
  523. NSSound.beep()
  524. return
  525. }
  526. let mainWindow = fullScreenWindow.interactionParent
  527. let collectionBehavior = mainWindow?.collectionBehavior
  528. mainWindow?.alphaValue = 0
  529. if let data = mainWindow?.responds(to: NSSelectorFromString("setAnimationBehavior:")), data {
  530. mainWindow?.animationBehavior = .none
  531. }
  532. // trick to make sure the main window shows up in the same space as the fullscreen window
  533. fullScreenWindow.addChildWindow(mainWindow!, ordered: .below)
  534. fullScreenWindow.removeChildWindow(mainWindow!)
  535. fullScreenWindow.level = .popUpMenu
  536. // these can change due to the child window trick
  537. mainWindow?.level = .normal
  538. mainWindow?.alphaValue = 1.0
  539. mainWindow?.collectionBehavior = collectionBehavior!
  540. mainWindow?.display()
  541. mainWindow?.makeFirstResponder(self.listView)
  542. mainWindow?.recalculateKeyViewLoop()
  543. // mainWindow?.delegate = self
  544. mainWindow?.makeKey()
  545. if let data = mainWindow?.responds(to: NSSelectorFromString("setAnimationBehavior:")), data {
  546. mainWindow?.animationBehavior = .default
  547. }
  548. NSApp.removeWindowsItem(fullScreenWindow)
  549. fullScreenWindow.fadeOut()
  550. }
  551. //MARK: - PDF分屏视图
  552. func reloadPDFSplitInfo() {
  553. if listView.viewSplitMode == .disable {
  554. pdfSplitView.isHidden = true
  555. listView.frame = infoSplitCenterView.bounds
  556. infoSplitCenterView.addSubview(listView)
  557. if splitPDFController != nil {
  558. splitPDFController = nil
  559. }
  560. } else {
  561. pdfSplitView.isHidden = false
  562. listView.frame = pdfSplitTopView.bounds
  563. pdfSplitTopView.addSubview(listView)
  564. setUpPDFBottomToolbar()
  565. setupSplitPDFController()
  566. if listView.viewSplitMode == .horizontal {
  567. pdfSplitView.isVertical = true
  568. } else if listView.viewSplitMode == .vertical {
  569. pdfSplitView.isVertical = false
  570. }
  571. }
  572. }
  573. func setUpPDFBottomToolbar() {
  574. if pdfBottomToolbar != nil {
  575. pdfBottomToolbar = nil
  576. }
  577. pdfBottomToolbar = KMSplitToolbar.init()
  578. pdfBottomToolbar?.frame = CGRectMake(CGRectGetWidth(pdfSplitTopView.frame)/2-144, 20, 288, 40)
  579. pdfBottomToolbar?.pdfView = self.listView
  580. pdfBottomToolbar?.reloadData()
  581. pdfSplitTopView.addSubview(pdfBottomToolbar!)
  582. }
  583. func reloadPDFBottomToolbar() {
  584. if viewManager.splitShowBottomBar {
  585. pdfBottomToolbar?.isHidden = false
  586. pdfBottomToolbar?.reloadData()
  587. } else {
  588. pdfBottomToolbar?.isHidden = true
  589. }
  590. }
  591. //MARK: - Edit模式
  592. func showEditToolbarView() {
  593. if editToolbarView == nil {
  594. editToolbarView = KMEditToolbarView()
  595. }
  596. editToolbarView?.frame = toolbarBox.bounds
  597. editToolbarView?.delegate = self
  598. editToolbarView?.autoresizingMask = [.width, .height]
  599. toolbarBox.contentView = editToolbarView
  600. }
  601. //MARK: - Watermark水印
  602. func showWatermarkController() {
  603. listView.isHidden = true
  604. viewManager.editType = .watermark
  605. showEditToolbarView()
  606. editToolbarView?.editType = .watermark
  607. if KMWatermarkManager.defaultManager.watermarks.count == 0 {
  608. editToolbarView?.editSubType = .add
  609. } else {
  610. editToolbarView?.editSubType = .template
  611. }
  612. editToolbarView?.reloadData()
  613. if watermarkViewController == nil {
  614. watermarkViewController = KMWatermarkController.init()
  615. }
  616. watermarkViewController?.view.frame = CGRectMake(44, 0, CGRectGetWidth(bottomContendBox.frame)-44, CGRectGetHeight(bottomContendBox.frame))
  617. watermarkViewController?.view.autoresizingMask = [.maxXMargin, .width, .height]
  618. watermarkViewController?.delegate = self
  619. bottomContendBox.addSubview(watermarkViewController!.view)
  620. watermarkViewController?.editSubType = editToolbarView?.editSubType ?? .template
  621. updateWatermarkDocument()
  622. }
  623. func updateWatermarkDocument() {
  624. guard let controller = watermarkViewController else { return }
  625. controller.pdfDocument = nil
  626. var editDocument = CPDFDocument.init()
  627. let page = listView.document.page(at: UInt(listView.currentPageIndex))
  628. editDocument?.insertPageObject(page, at: 0)
  629. watermarkViewController?.pdfDocument = editDocument
  630. watermarkViewController?.reloadData()
  631. }
  632. func exitWatermarkController() {
  633. listView.isHidden = false
  634. viewManager.editType = .none
  635. editToolbarView?.removeFromSuperview()
  636. editToolbarView = nil
  637. watermarkViewController?.view.removeFromSuperview()
  638. watermarkViewController = nil
  639. refreshToolbarView()
  640. toolbarBox.contentView = pdfToolbarController?.view
  641. }
  642. //移除文档水印
  643. func removePDFWatermark() {
  644. let watermarks = self.listView.document.watermarks()
  645. if (watermarks == nil || watermarks!.count <= 0) {
  646. let alert = NSAlert()
  647. alert.alertStyle = .warning
  648. alert.messageText = NSLocalizedString("Could not find a removable watermark in this document. If you see a watermark, it was not added with PDF Reader Pro and therefore cannot be detected.", comment: "")
  649. alert.addButton(withTitle: NSLocalizedString("Confirm", comment: ""))
  650. alert.runModal()
  651. return
  652. }
  653. let alert = NSAlert()
  654. alert.alertStyle = .warning
  655. alert.messageText = NSLocalizedString("Are you sure you want to remove the watermark?", comment: "")
  656. alert.addButton(withTitle: NSLocalizedString("Delete", comment: ""))
  657. alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))
  658. let result = alert.runModal()
  659. if (result == .alertFirstButtonReturn) {
  660. for watermark in watermarks! {
  661. listView.document.removeWatermark(watermark)
  662. }
  663. listView.layoutDocumentView()
  664. }
  665. }
  666. func batchAddWatermark() {
  667. }
  668. func batchRemoveWatermark() {
  669. }
  670. //MARK: - Background背景
  671. func showBackgroundController() {
  672. listView.isHidden = true
  673. viewManager.editType = .background
  674. showEditToolbarView()
  675. editToolbarView?.editType = .background
  676. if KMBackgroundManager.defaultManager.datas.count == 0 {
  677. editToolbarView?.editSubType = .add
  678. } else {
  679. editToolbarView?.editSubType = .template
  680. }
  681. editToolbarView?.reloadData()
  682. if backgroundViewController == nil {
  683. backgroundViewController = KMBackgroundController.init()
  684. }
  685. backgroundViewController?.view.frame = CGRectMake(44, 0, CGRectGetWidth(bottomContendBox.frame)-44, CGRectGetHeight(bottomContendBox.frame))
  686. backgroundViewController?.view.autoresizingMask = [.maxXMargin, .width, .height]
  687. // backgroundViewController?.delegate = self
  688. bottomContendBox.addSubview(backgroundViewController!.view)
  689. backgroundViewController?.editSubType = editToolbarView?.editSubType ?? .template
  690. updateBackgroundDocument()
  691. }
  692. func updateBackgroundDocument() {
  693. guard let controller = backgroundViewController else { return }
  694. controller.pdfDocument = nil
  695. let editDocument = CPDFDocument.init()
  696. let page = listView.document.page(at: UInt(listView.currentPageIndex))
  697. editDocument?.insertPageObject(page, at: 0)
  698. backgroundViewController?.pdfDocument = editDocument
  699. backgroundViewController?.reloadData()
  700. }
  701. func exitBackgroundController() {
  702. listView.isHidden = false
  703. viewManager.editType = .none
  704. editToolbarView?.removeFromSuperview()
  705. editToolbarView = nil
  706. backgroundViewController?.view.removeFromSuperview()
  707. backgroundViewController = nil
  708. refreshToolbarView()
  709. toolbarBox.contentView = pdfToolbarController?.view
  710. }
  711. func removePDFBackground() {
  712. let background = listView.document.background()
  713. background?.clear()
  714. }
  715. func batchAddBackground() {
  716. }
  717. func batchRemoveBackground() {
  718. }
  719. //MARK: - header&footer
  720. //MARK: - Bates
  721. }
  722. //MARK: - NSSplitViewDelegate
  723. extension KMMainViewController: NSSplitViewDelegate {
  724. func splitView(_ splitView: NSSplitView, shouldHideDividerAt dividerIndex: Int) -> Bool {
  725. return true
  726. }
  727. func splitView(_ splitView: NSSplitView, canCollapseSubview subview: NSView) -> Bool {
  728. return true
  729. }
  730. func splitView(_ splitView: NSSplitView, constrainMaxCoordinate proposedMaximumPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat {
  731. return proposedMaximumPosition
  732. }
  733. func splitView(_ splitView: NSSplitView, constrainMinCoordinate proposedMinimumPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat {
  734. return proposedMinimumPosition
  735. }
  736. func splitView(_ splitView: NSSplitView, constrainSplitPosition proposedPosition: CGFloat, ofSubviewAt dividerIndex: Int) -> CGFloat {
  737. if dividerIndex == 0 {
  738. if proposedPosition > CGRectGetWidth(infoContendSplitView.frame)/2 - 10 {
  739. print(CGRectGetWidth(infoContendSplitView.frame)/2 - 10, NSDate())
  740. return CGRectGetWidth(infoContendSplitView.frame)/2 - 10
  741. }
  742. } else if dividerIndex == 1 {
  743. print(CGRectGetWidth(infoContendSplitView.frame)/2 - 10, NSDate())
  744. }
  745. return proposedPosition
  746. }
  747. func splitViewDidResizeSubviews(_ notification: Notification) {
  748. let splitView = notification.object as? NSSplitView
  749. if((splitView?.isEqual(to: infoContendSplitView)) == true) {
  750. leftSplitViewResizeFinish()
  751. }
  752. NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(splitViewResizeFinish), object: nil)
  753. self.perform(#selector(splitViewResizeFinish), with: nil, afterDelay: 0.15)
  754. }
  755. @objc func leftSplitViewResizeFinish() {
  756. botaViewController?.changeLeftSideBounds()
  757. }
  758. @objc func splitViewResizeFinish() {
  759. if infoContendSplitView.isSubviewCollapsed(infoSplitLeftView) {
  760. if viewManager.pdfSideBarType != .none {
  761. viewManager.pdfSideBarType = .none
  762. sideBarController?.reloadBOTAData()
  763. }
  764. }
  765. }
  766. }
  767. //MARK: - KMPDFSideBarControllerDelegate 左侧Sidebar代理
  768. extension KMMainViewController: KMPDFSideBarControllerDelegate {
  769. func kmPDFSideBarControllerDidSidebarTypeUpdated(_ view: KMPDFSideBarController) {
  770. if viewManager.pdfSideBarType == .none {
  771. toggleCloseLeftSide()
  772. } else {
  773. toggleOpenLeftSide(pdfSideBarType: viewManager.pdfSideBarType)
  774. }
  775. }
  776. func kmPDFSideBarControllerDidGotoPage(_ view: KMPDFSideBarController, _ pageIndex: Int) {
  777. listView.go(toPageIndex: pageIndex, animated: true)
  778. }
  779. }
  780. //MARK: - KMPDFToolbarControllerDelegate 工具栏代理
  781. extension KMMainViewController: KMPDFToolbarControllerDelegate {
  782. func kmPDFToolbarControllerDidToolbarItemClicked(_ controller: KMPDFToolbarController, _ itemIdentifier: String) {
  783. print("toolbar点击", itemIdentifier)
  784. if itemIdentifier == KMPDFToolbar_ViewDisplay_Identifier {
  785. updatePDFDisplaySettingView()
  786. } else if itemIdentifier == KMPDFToolbar_PageEdit_Identifier {
  787. if viewManager.isPageEditMode == true {
  788. enterPageEditMode()
  789. } else {
  790. exitPageEditMode()
  791. }
  792. } else if itemIdentifier == KMPDFToolbar_convert_word_Identifier {
  793. let winC = KMConvertWordWindowController()
  794. let model = KMDocumentModel(url: listView.document.documentURL)
  795. winC.documentModel = model
  796. winC.own_beginSheetModal(for: self.view.window, completionHandler: nil)
  797. } else if itemIdentifier == KMPDFToolbar_convert_ppt_Identifier {
  798. let winC = KMConvertPPTsWindowController()
  799. winC.subType = 1
  800. let model = KMDocumentModel(url: listView.document.documentURL)
  801. winC.documentModel = model
  802. winC.own_beginSheetModal(for: self.view.window, completionHandler: nil)
  803. } else if itemIdentifier == KMPDFToolbar_convert_RTF_Identifier {
  804. let winC = KMConvertPPTsWindowController()
  805. winC.subType = 2
  806. let model = KMDocumentModel(url: listView.document.documentURL)
  807. winC.documentModel = model
  808. winC.own_beginSheetModal(for: self.view.window, completionHandler: nil)
  809. } else if itemIdentifier == KMPDFToolbar_convert_Text_Identifier {
  810. let winC = KMConvertPPTsWindowController()
  811. winC.subType = 4
  812. let model = KMDocumentModel(url: listView.document.documentURL)
  813. winC.documentModel = model
  814. winC.own_beginSheetModal(for: self.view.window, completionHandler: nil)
  815. } else if itemIdentifier == KMPDFToolbar_convert_CSV_Identifier {
  816. let winC = KMConvertPPTsWindowController()
  817. winC.subType = 5
  818. let model = KMDocumentModel(url: listView.document.documentURL)
  819. winC.documentModel = model
  820. winC.own_beginSheetModal(for: self.view.window, completionHandler: nil)
  821. } else if itemIdentifier == KMPDFToolbar_convert_excel_Identifier {
  822. let winC = KMConvertExcelWindowController()
  823. let model = KMDocumentModel(url: listView.document.documentURL)
  824. winC.documentModel = model
  825. winC.own_beginSheetModal(for: self.view.window, completionHandler: nil)
  826. } else if itemIdentifier == KMPDFToolbar_convert_HTML_Identifier {
  827. let winC = KMConvertHtmlWindowController()
  828. let model = KMDocumentModel(url: listView.document.documentURL)
  829. winC.documentModel = model
  830. winC.own_beginSheetModal(for: self.view.window, completionHandler: nil)
  831. } else if itemIdentifier == KMPDFToolbar_convert_Json_Identifier {
  832. let winC = KMConvertJsonWindowController()
  833. let model = KMDocumentModel(url: listView.document.documentURL)
  834. winC.documentModel = model
  835. winC.own_beginSheetModal(for: view.window, completionHandler: nil)
  836. } else if itemIdentifier == KMPDFToolbar_convert_image_Identifier {
  837. let winC = KMConvertImageWindowController()
  838. let model = KMDocumentModel(url: listView.document.documentURL)
  839. winC.documentModel = model
  840. winC.own_beginSheetModal(for: view.window, completionHandler: nil)
  841. } else if itemIdentifier == KMPDFToolbar_convert_imageToPDF_Identifier {
  842. NSApplication.ShowImageToPDFWindow()
  843. } else if itemIdentifier == KMPDFToolbar_PageEdit_InsertFile_Identifier {
  844. pageEditViewController?.insertFromPDFAction()
  845. } else if itemIdentifier == KMPDFToolbar_PageEdit_InsertBlank_Identifier {
  846. pageEditViewController?.insertFromBlankAction()
  847. } else if itemIdentifier == KMPDFToolbar_PageEdit_InsertClip_Identifier {
  848. pageEditViewController?.insertFromClipboardAction()
  849. } else if itemIdentifier == KMPDFToolbar_PageEdit_InsertScanner_Identifier {
  850. pageEditViewController?.insertFromScannerAction()
  851. } else if itemIdentifier == KMPDFToolbar_PageEdit_Extract_Identifier {
  852. pageEditViewController?.extractPDFAction()
  853. } else if itemIdentifier == KMPDFToolbar_PageEdit_Replace_Identifier {
  854. pageEditViewController?.replacePDFAction()
  855. } else if itemIdentifier == KMPDFToolbar_PageEdit_Split_Identifier {
  856. pageEditViewController?.splitPDFAction()
  857. } else if itemIdentifier == KMPDFToolbar_PageEdit_Reverse_Identifier {
  858. pageEditViewController?.reversePDFAction()
  859. } else if itemIdentifier == KMPDFToolbar_PageEdit_LeftRotate_Identifier {
  860. pageEditViewController?.rotatePageLeftAction()
  861. } else if itemIdentifier == KMPDFToolbar_PageEdit_RightRotate_Identifier{
  862. pageEditViewController?.rotatePageRightAction()
  863. } else if itemIdentifier == KMPDFToolbar_PageEdit_Delete_Identifier {
  864. pageEditViewController?.deletePageAction()
  865. } else if itemIdentifier == KMPDFToolbar_PageEdit_Reduce_Identifier {
  866. pageEditViewController?.zoomOutPageAction()
  867. if(pageEditViewController?.canZoomInPageSize() == false) {
  868. toolbarManager.page_Increase_Property.isDisabled = true
  869. } else {
  870. toolbarManager.page_Increase_Property.isDisabled = false
  871. }
  872. if(pageEditViewController?.canZoomOutPageSize() == false) {
  873. toolbarManager.page_Reduce_Property.isDisabled = true
  874. } else {
  875. toolbarManager.page_Reduce_Property.isDisabled = false
  876. }
  877. controller.refreshSecondToolbarItemsState()
  878. } else if itemIdentifier == KMPDFToolbar_PageEdit_Increase_Identifier {
  879. pageEditViewController?.zoomInPageAction()
  880. if(pageEditViewController?.canZoomInPageSize() == false) {
  881. toolbarManager.page_Increase_Property.isDisabled = true
  882. } else {
  883. toolbarManager.page_Increase_Property.isDisabled = false
  884. }
  885. if(pageEditViewController?.canZoomOutPageSize() == false) {
  886. toolbarManager.page_Reduce_Property.isDisabled = true
  887. } else {
  888. toolbarManager.page_Reduce_Property.isDisabled = false
  889. }
  890. controller.refreshSecondToolbarItemsState()
  891. } else if itemIdentifier == KMPDFToolbar_PageEdit_page_oddPage_Identifier {
  892. pageEditViewController?.thumbnailChoosePageStyle = .odd
  893. if(toolbarManager.page_pageInfo_Property.creatable == true) {
  894. toolbarManager.page_pageInfo_Property.creatable = false
  895. controller.refreshSecondToolbarItemsState()
  896. }
  897. } else if itemIdentifier == KMPDFToolbar_PageEdit_page_EvenPage_Identifier {
  898. pageEditViewController?.thumbnailChoosePageStyle = .even
  899. if(toolbarManager.page_pageInfo_Property.creatable == true) {
  900. toolbarManager.page_pageInfo_Property.creatable = false
  901. controller.refreshSecondToolbarItemsState()
  902. }
  903. } else if itemIdentifier == KMPDFToolbar_PageEdit_page_PortraitPage_Identifier {
  904. pageEditViewController?.thumbnailChoosePageStyle = .horizontal
  905. if(toolbarManager.page_pageInfo_Property.creatable == true) {
  906. toolbarManager.page_pageInfo_Property.creatable = false
  907. controller.refreshSecondToolbarItemsState()
  908. }
  909. } else if itemIdentifier == KMPDFToolbar_PageEdit_page_LandscapePage_Identifier {
  910. pageEditViewController?.thumbnailChoosePageStyle = .vertical
  911. if(toolbarManager.page_pageInfo_Property.creatable == true) {
  912. toolbarManager.page_pageInfo_Property.creatable = false
  913. controller.refreshSecondToolbarItemsState()
  914. }
  915. } else if itemIdentifier == KMPDFToolbar_PageEdit_page_AllPage_Identifier {
  916. pageEditViewController?.thumbnailChoosePageStyle = .allPage
  917. if(toolbarManager.page_pageInfo_Property.creatable == true) {
  918. toolbarManager.page_pageInfo_Property.creatable = false
  919. controller.refreshSecondToolbarItemsState()
  920. }
  921. } else if itemIdentifier == KMPDFToolbar_PageEdit_page_CustomPage_Identifier {
  922. pageEditViewController?.thumbnailChoosePageStyle = .custom
  923. toolbarManager.page_pageInfo_Property.text = nil
  924. if(toolbarManager.page_pageInfo_Property.creatable == false) {
  925. toolbarManager.page_pageInfo_Property.creatable = true
  926. }
  927. controller.refreshSecondToolbarItemsState()
  928. } else if itemIdentifier == KMPDFToolbar_edit_addWatermark_Identifier {
  929. showWatermarkController()
  930. } else if itemIdentifier == KMPDFToolbar_edit_removeWatermark_Identifier {
  931. removePDFWatermark()
  932. } else if itemIdentifier == KMPDFToolbar_edit_batch_AddWatermark_Identifier {
  933. batchAddWatermark()
  934. } else if itemIdentifier == KMPDFToolbar_edit_batchRemoveWatermark_Identifier {
  935. batchRemoveWatermark()
  936. } else if itemIdentifier == KMPDFToolbar_edit_addBG_Identifier {
  937. showBackgroundController()
  938. } else if itemIdentifier == KMPDFToolbar_edit_removeBG_Identifier {
  939. removePDFBackground()
  940. } else if itemIdentifier == KMPDFToolbar_edit_batch_AddBG_Identifier {
  941. batchAddBackground()
  942. } else if itemIdentifier == KMPDFToolbar_edit_batchRemoveBG_Identifier {
  943. batchRemoveBackground()
  944. } else {
  945. print("click else")
  946. }
  947. refreshToolbarView()
  948. }
  949. func kmPDFToolbarControllerDidSelectTextDidBeginEditing(_ controller: KMPDFToolbarController, _ view: ComponentSelect) {
  950. }
  951. func kmPDFToolbarControllerDidSelectTextDidChange(_ controller: KMPDFToolbarController, _ view: ComponentSelect) {
  952. }
  953. func kmPDFToolbarControllerDidSelectTextDidEndEditing(_ controller: KMPDFToolbarController, _ view: ComponentSelect) {
  954. }
  955. }
  956. //MARK: - KMNDisplayViewControllerDelegate代理
  957. extension KMMainViewController: KMNDisplayViewControllerDelegate {
  958. //Display Mode
  959. func displayViewControllerDidDisplayModeChanged(_ controller: KMNDisplayViewController) {
  960. listView.layoutDocumentView()
  961. }
  962. //阅读模式
  963. func displayViewControllerDidReadModeUpdated(_ controller: KMNDisplayViewController) {
  964. if viewManager.isPDFReadMode {
  965. openPDFReadMode()
  966. } else {
  967. exitPDFReadMode()
  968. }
  969. }
  970. //PPT
  971. func displayViewControllerDidGotoSlideShow(_ controller: KMNDisplayViewController) {
  972. togglePresentation(nil)
  973. }
  974. //SplitView
  975. func displayViewControllerDidSplitModeChanged(_ controller: KMNDisplayViewController) {
  976. reloadPDFSplitInfo()
  977. }
  978. func displayViewControllerDidSplitFileChanged(_ controller: KMNDisplayViewController) {
  979. splitPDFController?.reloadData()
  980. }
  981. func displayViewControllerDidToolbarStateChanged(_ controller: KMNDisplayViewController) {
  982. splitPDFController?.refreshToolbarState()
  983. reloadPDFBottomToolbar()
  984. }
  985. }
  986. //MARK: - PPT
  987. extension KMMainViewController: KMInteractionProviderProtocol {
  988. func providerContentView(fullScreenWindow: NSWindow, inset: CGFloat) -> NSView? {
  989. if(interactionMode == .presentation) {
  990. if listView.presentationDrawView == nil {
  991. listView.createPresentationDraw()
  992. }
  993. presentationTopViewController = KMPresentationTopViewController.init(nibName: "KMPresentationTopViewController", bundle: nil)
  994. presentationTopViewController?.pdfView = listView
  995. presentationTopViewController?.delegate = self
  996. presentationTopViewController?.isSelectionPre = true
  997. listView.isPresentationMode = true
  998. presentationTopViewController?.view.frame = CGRect(x: 0, y: (fullScreenWindow.contentView?.bounds.height ?? 0) - 42, width: fullScreenWindow.contentView?.bounds.width ?? 0, height: 42)
  999. if((presentationTopViewController) != nil) {
  1000. fullScreenWindow.contentView?.addSubview(presentationTopViewController!.view)
  1001. }
  1002. } else {
  1003. listView.frame = NSInsetRect(fullScreenWindow.contentView?.bounds ?? .zero, 0, 0)
  1004. }
  1005. fullScreenWindow.contentView?.addSubview(listView)
  1006. if(interactionMode == .presentation) {
  1007. let frame = fullScreenWindow.frame
  1008. listView.frame = CGRectMake(0, 0, frame.size.width, frame.size.height-42)
  1009. listView.autoresizingMask = [.width, .maxYMargin]
  1010. }
  1011. return view
  1012. }
  1013. @objc func willEnterInteractionModeNotification(_ sender: Notification) {
  1014. guard let win = sender.object as? NSWindow, win.isEqual(to: self.view.window) else {
  1015. return
  1016. }
  1017. let interactionMode = sender.userInfo?[NSWindow.UserInfo.interactionModeKey] as? KMInteractionMode
  1018. if interactionMode == .presentation {
  1019. let backgroundColor = NSColor.black
  1020. let level = UserDefaults.standard.bool(forKey: "SKUseNormalLevelForPresentationKey") ? NSWindow.Level.normal : NSWindow.Level.popUpMenu
  1021. let wasInteractionMode = self.interactionMode
  1022. if wasInteractionMode == .normal {
  1023. self.savedNormalSetup.setDictionary(self.currentPDFSettings() as! [AnyHashable : Any])
  1024. }
  1025. if wasInteractionMode == .legacyFullScreen {
  1026. self.enterPresentationMode()
  1027. self.pdfSplitView.frame = CGRect(x: 0, y: 0, width: NSWidth(centerContentView.bounds), height: NSHeight(centerContentView.bounds)-1)
  1028. self.centerContentView.addSubview(pdfSplitView)
  1029. self.listView.frame = (self.view.window?.contentView?.bounds)!
  1030. self.view.window?.contentView?.addSubview(listView)
  1031. // self.view.window?.backgroundColor = backgroundColor
  1032. self.view.window?.level = level
  1033. self.listView.layoutDocumentView()
  1034. self.listView.requiresDisplay()
  1035. self.forceSubwindowsOnTop(false)
  1036. }
  1037. } else {
  1038. KMPrint("2")
  1039. }
  1040. }
  1041. @objc func didEnterInteractionModeNotification(_ sender: Notification) {
  1042. guard let win = sender.object as? NSWindow, win.isEqual(to: self.view.window) else {
  1043. return
  1044. }
  1045. if self.interactionMode == .presentation {
  1046. self.listView.layoutDocumentView()
  1047. self.listView.requiresDisplay()
  1048. }
  1049. }
  1050. @objc func willShowFullScreenNotification(_ sender: Notification) {
  1051. guard let win = sender.object as? NSWindow, win.isEqual(to: self.view.window) else {
  1052. return
  1053. }
  1054. if self.interactionMode == .presentation {
  1055. let view = self.view.window?.firstResponder as? NSView
  1056. if let data = view?.isDescendant(of: self.pdfSplitView), data {
  1057. self.view.window?.makeFirstResponder(nil)
  1058. }
  1059. }
  1060. }
  1061. @objc func didShowFullScreenNotification(_ sender: Notification) {
  1062. guard let win = sender.object as? NSWindow, win.isEqual(to: self.view.window) else {
  1063. return
  1064. }
  1065. if self.interactionMode == .presentation {
  1066. self.enterPresentationMode()
  1067. }
  1068. }
  1069. }
  1070. // MARK: -KMPresentationTopViewControllerDelegate (幻灯片)
  1071. extension KMMainViewController: KMPresentationTopViewControllerDelegate {
  1072. func presentationTopViewExit(_ presentationTopViewController: KMPresentationTopViewController, withButton: NSButton) {
  1073. self.exitFullScreen()
  1074. }
  1075. func presentationTopViewClear(_ presentationTopViewController: KMPresentationTopViewController, withButton: NSButton) {
  1076. listView.presentationDrawView?.clear()
  1077. }
  1078. func presentationTopViewUndo(_ presentationTopViewController: KMPresentationTopViewController, withButton: NSButton) {
  1079. let presentationDrawView = listView.presentationDrawView
  1080. if presentationDrawView?.canUndo() == true {
  1081. presentationDrawView?.undo()
  1082. }
  1083. }
  1084. func presentationTopViewType(_ presentationTopViewController: KMPresentationTopViewController, withButton: NSButton, isSeletion: Bool) {
  1085. listView.isPresentationMode = isSeletion
  1086. if listView.isEnterPresentationDrawMode() == true {
  1087. listView.exitPresentationDrawMode()
  1088. }
  1089. }
  1090. func presentationTopViewDrawColor(_ presentationTopViewController: KMPresentationTopViewController, withView: NSView,color:NSColor?) {
  1091. if color == nil{
  1092. listView.exitPresentationDrawMode()
  1093. } else {
  1094. if listView.isEnterPresentationDrawMode() == false {
  1095. listView.enterPresentationDrawMode()
  1096. }
  1097. listView.changePresentationDrawModelColor(color)
  1098. }
  1099. }
  1100. }
  1101. //MARK: - KMSplitPDFViewControllerDelegate SplitPDFView分屏视图
  1102. extension KMMainViewController: KMSplitPDFViewControllerDelegate {
  1103. func splitPDFViewControllerDidUpdateFilePath(_ controller: KMSplitPDFViewController) {
  1104. displaySettingController?.reloadData()
  1105. }
  1106. func splitPDFViewControllerDidUpdatePDFScale(_ controller: KMSplitPDFViewController) {
  1107. if let scaleFactor = controller.pdfView?.scaleFactor {
  1108. listView.scaleFactor = scaleFactor
  1109. }
  1110. }
  1111. func splitPDFViewControllerDidUpdatePDFPageIndex(_ controller: KMSplitPDFViewController) {
  1112. if let pageIndex = controller.pdfView?.currentPageIndex {
  1113. listView.go(toPageIndex: pageIndex, animated: false)
  1114. }
  1115. }
  1116. }
  1117. //MARK: - KMWatermarkControllerDelegate 水印相关代理
  1118. extension KMMainViewController: KMWatermarkControllerDelegate {
  1119. func kmWatermarkControllerDidUpdateMode(_ view: KMWatermarkController) {
  1120. editToolbarView?.editSubType = view.editSubType
  1121. }
  1122. func kmWatermarkControllerDidWatermarkUpdated(_ view: KMWatermarkController) {
  1123. var applyEnable = true
  1124. if let model = view.currentWatermarkData {
  1125. if model.watermarkType == .text {
  1126. if model.text == nil || model.text?.count == 0 {
  1127. applyEnable = false
  1128. }
  1129. } else if model.watermarkType == .image {
  1130. if model.imagePath == nil {
  1131. applyEnable = false
  1132. }
  1133. }
  1134. } else {
  1135. applyEnable = false
  1136. }
  1137. editToolbarView?.applyEnable = applyEnable
  1138. editToolbarView?.reloadData()
  1139. }
  1140. }
  1141. extension KMMainViewController: KMEditToolbarViewDelegate {
  1142. func kmEditToolbarViewDidUpdateMode(_ view: KMEditToolbarView) {
  1143. if view.editType == .watermark {
  1144. watermarkViewController?.editSubType = editToolbarView?.editSubType ?? .template
  1145. watermarkViewController?.reloadData()
  1146. }
  1147. }
  1148. func kmEditToolbarViewDidChooseBatch(_ view: KMEditToolbarView) {
  1149. }
  1150. func kmEditToolbarViewDidChooseApply(_ view: KMEditToolbarView) {
  1151. if view.editType == .watermark {
  1152. if let model = watermarkViewController?.currentWatermarkData {
  1153. let pageIndex = view.getSelectedPageIndex(listView.document)
  1154. if pageIndex.isEmpty {
  1155. let alert = NSAlert()
  1156. alert.alertStyle = .critical
  1157. alert.messageText = KMLocalizedString("Invalid page range or the page number is out of range. Please try again.")
  1158. alert.runModal()
  1159. return
  1160. }
  1161. let pageString = view.getSelectedPageString(listView.document, pageIndex)
  1162. let watermark = KMPDFWatermarkData.returnWaterMarkWith(model, listView.document)
  1163. watermark.pageString = pageString
  1164. listView.document.addWatermark(watermark)
  1165. listView.layoutDocumentView()
  1166. exitWatermarkController()
  1167. }
  1168. }
  1169. }
  1170. func kmEditToolbarViewDidChooseExit(_ view: KMEditToolbarView) {
  1171. if view.editType == .watermark {
  1172. if view.applyEnable {
  1173. let alert = NSAlert()
  1174. alert.messageText = NSLocalizedString("There are unapplied watermark settings, do you want to apply them?", comment: "")
  1175. alert.informativeText = NSLocalizedString("If not, the changes will be lost.", comment: "")
  1176. alert.addButton(withTitle: NSLocalizedString("Apply", comment: ""))
  1177. alert.addButton(withTitle: NSLocalizedString("Don't Apply", comment: ""))
  1178. alert.addButton(withTitle: NSLocalizedString("Cancel", comment: ""))
  1179. let result = alert.runModal()
  1180. if (result == .alertFirstButtonReturn) {
  1181. self.kmEditToolbarViewDidChooseApply(view)
  1182. } else if (result == .alertSecondButtonReturn) {
  1183. //"Don't Apply"
  1184. exitWatermarkController()
  1185. } else if (result == .alertThirdButtonReturn) {
  1186. //Cancel
  1187. }
  1188. } else {
  1189. exitWatermarkController()
  1190. }
  1191. }
  1192. }
  1193. }
  1194. //MARK: - CPDFViewDelegate PDFView代理
  1195. extension KMMainViewController: CPDFViewDelegate,CPDFListViewDelegate {
  1196. func pdfViewDocumentDidLoaded(_ pdfView: CPDFView!) {
  1197. sideBarController?.reloadPageTurnerData()
  1198. documentLoadComplete()
  1199. }
  1200. func pdfViewCurrentPageDidChanged(_ pdfView: CPDFView!) {
  1201. sideBarController?.reloadPageTurnerData()
  1202. var indexpaths: Set<IndexPath> = []
  1203. indexpaths.insert(IndexPath(item: listView.currentPageIndex, section: 0))
  1204. botaViewController?.thumnailViewController?.selectionIndexPaths = indexpaths
  1205. //分屏视图
  1206. reloadPDFBottomToolbar()
  1207. if viewManager.splitSyncScroll {
  1208. if splitPDFController?.inPDFFirst == false && splitPDFController?.outPDFFirst == false {
  1209. splitPDFController?.outPDFFirst = true
  1210. if let splitPDFView = splitPDFController?.pdfView, let document = splitPDFView.document {
  1211. var index = pdfView.currentPageIndex
  1212. if index > document.pageCount {
  1213. index = Int(splitPDFView.document.pageCount - 1)
  1214. }
  1215. splitPDFView.go(toPageIndex: index, animated: false)
  1216. }
  1217. NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(pdfUpdatedFinish), object: nil)
  1218. self.perform(#selector(pdfUpdatedFinish), with: nil, afterDelay: 0.35)
  1219. } else if splitPDFController?.outPDFFirst == true {
  1220. if let splitPDFView = splitPDFController?.pdfView, let document = splitPDFView.document {
  1221. var index = pdfView.currentPageIndex
  1222. if index > document.pageCount {
  1223. index = Int(splitPDFView.document.pageCount - 1)
  1224. }
  1225. splitPDFView.go(toPageIndex: index, animated: false)
  1226. }
  1227. NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(pdfUpdatedFinish), object: nil)
  1228. self.perform(#selector(pdfUpdatedFinish), with: nil, afterDelay: 0.35)
  1229. }
  1230. }
  1231. //水印
  1232. updateWatermarkDocument()
  1233. //
  1234. }
  1235. func pdfViewScaleDidChanged(_ pdfView: CPDFView!) {
  1236. pdfToolbarController?.reloadSelectZoomView()
  1237. reloadPDFBottomToolbar()
  1238. //分屏视图
  1239. if viewManager.splitSyncScroll {
  1240. if splitPDFController?.inPDFFirst == false && splitPDFController?.outPDFFirst == false {
  1241. splitPDFController?.outPDFFirst = true
  1242. NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(pdfUpdatedFinish), object: nil)
  1243. self.perform(#selector(pdfUpdatedFinish), with: nil, afterDelay: 0.35)
  1244. } else if splitPDFController?.outPDFFirst == true {
  1245. if let splitPDFView = splitPDFController?.pdfView {
  1246. splitPDFView.scaleFactor = pdfView.scaleFactor
  1247. }
  1248. NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(pdfUpdatedFinish), object: nil)
  1249. self.perform(#selector(pdfUpdatedFinish), with: nil, afterDelay: 0.35)
  1250. }
  1251. }
  1252. }
  1253. func pdfViewDidClick(onLink pdfView: CPDFView!, withURL url: String!) {
  1254. if let urlString = url, urlString == kKMPurchaseProductURLString {
  1255. //跳转订阅比较表
  1256. let _ = KMComparativeTableViewController.show(window: NSApp.mainWindow ?? NSWindow())
  1257. return
  1258. }
  1259. if url.hasPrefix("smb://") {
  1260. NSWorkspace.shared.openFile(url)
  1261. } else {
  1262. KMTools.openURL(urlString: url)
  1263. }
  1264. }
  1265. func pdfViewPerformURL(_ pdfView: CPDFView!, withContent content: String!) {
  1266. KMPrint("pdfViewPerformURL")
  1267. if content != nil {
  1268. NSWorkspace.shared.open(URL(string: content)!)
  1269. } else {
  1270. let alert = NSAlert()
  1271. alert.alertStyle = .critical
  1272. alert.informativeText = NSLocalizedString("The hyperlink is invalid.", comment: "")
  1273. alert.messageText = ""
  1274. alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
  1275. alert.runModal()
  1276. return
  1277. }
  1278. }
  1279. func pdfViewPerformPrint(_ pdfView: CPDFView!) {
  1280. KMPrint("pdfViewPerformPrint")
  1281. self.showPrintWindow()
  1282. }
  1283. func pdfViewPerformGo(toPage pdfView: CPDFView!) {
  1284. KMPrint("pdfViewPerformGo")
  1285. }
  1286. func pdfViewOpenPDF(_ pdfView: CPDFView!, forRemoteGoTo action: CPDFAction!) {
  1287. KMPrint("pdfViewOpenPDF")
  1288. }
  1289. func pdfViewPerformReset(_ pdfView: CPDFView!) {
  1290. KMPrint("pdfViewPerformReset")
  1291. pdfView.document?.resetForm()
  1292. }
  1293. func pdfViewEditingBlockDidChanged(_ pdfView: CPDFView!) {
  1294. KMPrint("pdfViewEditingBlockDidChanged")
  1295. }
  1296. func pdfViewAsBookBookmark() -> NSImage! {
  1297. return NSImage(named: "KMImageNameBookmarkIcon")!
  1298. }
  1299. func pdfViewEditingSelectionDidChanged(_ pdfView: CPDFView!) {
  1300. self.editPDFHanddler.pdfViewEditingSelectionDidChanged(pdfView)
  1301. }
  1302. func pdfViewEditingAreaDidChanged(_ pdfView: CPDFView!) {
  1303. self.editPDFHanddler.pdfViewEditingAreaDidChanged(pdfView)
  1304. }
  1305. func pdfViewEditingCropBoundsDidChanged(_ pdfView: CPDFView!, editing editArea: CPDFEditArea!) {
  1306. self.editPDFHanddler.pdfViewEditingCropBoundsDidChanged(pdfView, editing: editArea)
  1307. }
  1308. //编辑PDF 创建图片区域回调
  1309. func pdfViewEditingAddImageArea(_ pdfView: CPDFView!, add page: CPDFPage!, add rect: CGRect) {
  1310. self.editPDFHanddler.pdfViewEditingAddImageArea(pdfView, add: page, add: rect)
  1311. }
  1312. func pdfViewEditingAddTextArea(_ pdfView: CPDFView!, add page: CPDFPage!, add rect: CGRect) {
  1313. self.editPDFHanddler.pdfViewEditingAddTextArea(pdfView, add: page, add: rect)
  1314. }
  1315. func pdfViewMobileEditingBegan(_ point: CGPoint, for pdfView: CPDFView!, forEditing editingAreas: [CPDFEditArea]!) {
  1316. self.editPDFHanddler.pdfViewMobileEditingBegan(point, for: pdfView, forEditing: editingAreas)
  1317. }
  1318. func pdfViewMobileEditingMove(_ point: CGPoint, for pdfView: CPDFView!, forEditing editingAreas: [CPDFEditArea]!) {
  1319. self.editPDFHanddler.pdfViewMobileEditingMove(point, for: pdfView, forEditing: editingAreas)
  1320. }
  1321. func pdfViewMobileEditingEnd(_ point: CGPoint, for pdfView: CPDFView!, forEditing editingAreas: [CPDFEditArea]!) {
  1322. self.editPDFHanddler.pdfViewMobileEditingEnd(point, for: pdfView, forEditing: editingAreas)
  1323. }
  1324. func pdfViewEditingSelectCharDidChanged(_ pdfView: CPDFView!) {
  1325. self.editPDFHanddler.pdfViewEditingSelectCharDidChanged(pdfView)
  1326. }
  1327. func pdfViewEditingExitCropMode(_ pdfView: CPDFView!, forEditing editingArea: CPDFEditImageArea!) {
  1328. self.editPDFHanddler.pdfViewEditingExitCropMode(pdfView, forEditing: editingArea)
  1329. }
  1330. func pdfListViewKeyDownIsContinue(_ pdfListView: CPDFListView!, theEvent: NSEvent!) -> Bool {
  1331. let command = theEvent.modifierFlags.contains(.command)
  1332. let control = theEvent.modifierFlags.contains(.control)
  1333. KMPrint(theEvent.keyCode)
  1334. if self.listView.isEditing() == true {
  1335. if control && theEvent.keyCode == 11 { // ctr + b
  1336. self.editPDFHanddler.fontBoldAction()
  1337. return false
  1338. } else if control && theEvent.keyCode == 34 { // ctr +i
  1339. self.editPDFHanddler.fontItalicAction()
  1340. return false
  1341. } else if theEvent.keyCode == 36 { // enter
  1342. if self.listView.isCropMode {
  1343. self.editPDFHanddler.cropComfirmAction()
  1344. return false
  1345. }
  1346. }
  1347. }
  1348. if (theEvent.keyCode == 11 && command) { // command + B [添加书签]
  1349. self.menuItemBookMarkClick_add(sender: NSMenuItem())
  1350. return false
  1351. } else if (command && control && theEvent.keyCode == 14) { // command + control + E [注释 橡皮擦]
  1352. return false
  1353. } else if (theEvent.keyCode == 123) { // 向左
  1354. if(self.listView.isEditing() && !self.listView.isSelecteditAreaNotEdit()) {
  1355. return false
  1356. } else {
  1357. if (self.pdfViewCanHorizontalScroll() == false && self.listView.canGoToPreviousPage()) {
  1358. self.listView.goToPreviousPage(nil)
  1359. return false
  1360. }
  1361. }
  1362. } else if (theEvent.keyCode == 126) { // 向上
  1363. if(self.listView.isEditing() && !self.listView.isSelecteditAreaNotEdit()) {
  1364. return false
  1365. } else {
  1366. if (self.listView.isContinousScroll()) {
  1367. return true
  1368. }
  1369. if (self.pdfViewCanVerticalScroll() == false && self.listView.canGoToPreviousPage()) {
  1370. self.listView.goToPreviousPage(nil)
  1371. return false
  1372. }
  1373. }
  1374. } else if (theEvent.keyCode == 124) { // 向右
  1375. if(self.listView.isEditing() && !self.listView.isSelecteditAreaNotEdit()) {
  1376. return false
  1377. } else {
  1378. if (self.pdfViewCanHorizontalScroll() == false && self.listView.canGoToNextPage()) {
  1379. self.listView.goToNextPage(nil)
  1380. return false
  1381. }
  1382. }
  1383. } else if (theEvent.keyCode == 125) { // 向下
  1384. if(self.listView.isEditing() && !self.listView.isSelecteditAreaNotEdit()) {
  1385. return false
  1386. } else {
  1387. if (self.listView.isContinousScroll()) {
  1388. return true
  1389. }
  1390. if (self.pdfViewCanVerticalScroll() == false && self.listView.canGoToNextPage()) {
  1391. self.listView.goToNextPage(nil)
  1392. return false
  1393. }
  1394. }
  1395. } else if (theEvent.keyCode == 36) {
  1396. if self.listView.annotationType == .addImage || self.listView.annotationType == .addText {
  1397. if self.listView.isEditImage {
  1398. self.menuItemEditingClick_CropImage(sender: NSMenuItem())
  1399. }
  1400. }
  1401. }
  1402. if theEvent.keyCode == 53 {
  1403. //ESC
  1404. // self.exitFullScreen()
  1405. if viewManager.isPDFReadMode {
  1406. self.exitPDFReadMode()
  1407. }
  1408. self.leftSideViewCancelSelect()
  1409. }
  1410. return true
  1411. }
  1412. func pdfListViewMenuValidate(_ pdfListView: CPDFListView!, menuItem: NSMenuItem!, isTakesEffect: UnsafeMutablePointer<ObjCBool>!) -> Bool {
  1413. guard let action = menuItem.action else {
  1414. isTakesEffect.pointee = false
  1415. return false
  1416. }
  1417. if (KMSystemMenu.isEditSelector(sel: action)) {
  1418. if (KMSystemMenu.Edit.deleteSelector == action) {
  1419. isTakesEffect.pointee = true
  1420. return self.listView.activeAnnotations.count > 0
  1421. } else if (KMSystemMenu.Edit.copySelector == action) {
  1422. isTakesEffect.pointee = true
  1423. return true//self.listView.canCopy()
  1424. } else if (KMSystemMenu.Edit.cutSelector == action) {
  1425. isTakesEffect.pointee = true
  1426. return self.listView.canCopy()
  1427. } else if (KMSystemMenu.Edit.pasteSelector == action) {
  1428. isTakesEffect.pointee = true
  1429. return self.listView.canPaste()
  1430. }
  1431. }
  1432. isTakesEffect.pointee = false
  1433. return false
  1434. }
  1435. func pdfViewEditingOperationDidChanged(_ pdfView: CPDFView!) {
  1436. self.editPDFHanddler.pdfViewEditingOperationDidChanged(pdfView)
  1437. }
  1438. func pdfViewEditingDoubleClick(_ pdfView: CPDFView!, imageArea editArea: CPDFEditArea!) {
  1439. self.editPDFHanddler.pdfViewEditingDoubleClick(pdfView, imageArea: editArea)
  1440. }
  1441. //MARK: - CPDFListViewDelegate
  1442. func cPDFListView(_ pdfListView: CPDFListView, didDelete annotation: CPDFAnnotation, in pdfPage: CPDFPage) {
  1443. self.leftSideViewController.updateThumbnail(at: Int(pdfPage.pageIndex()))
  1444. }
  1445. func pdfListViewChangeatioActiveAnnotations(_ pdfListView: CPDFListView!, forActiveAnnotations annotations: [CPDFAnnotation]!, isRightMenu: Bool) {
  1446. self.view.window?.makeFirstResponder(self.listView)
  1447. if isRightMenu {
  1448. } else if annotations.count > 0 {
  1449. if annotations.count > 1 {
  1450. let fristAnnotation = annotations.first
  1451. var isSameAnnotation = true
  1452. let className = NSStringFromClass(fristAnnotation!.classForCoder)
  1453. for annotation in annotations {
  1454. let cunrrentClassName = NSStringFromClass(annotation.classForCoder)
  1455. if (className == "CPDFSquareAnnotation") ||
  1456. (className == "CPDFCircleAnnotation") ||
  1457. (className == "CPDFLineAnnotation") {
  1458. if (cunrrentClassName != "CPDFSquareAnnotation") &&
  1459. (cunrrentClassName != "CPDFCircleAnnotation") &&
  1460. (cunrrentClassName != "CPDFLineAnnotation") {
  1461. isSameAnnotation = false
  1462. }
  1463. } else {
  1464. if className != cunrrentClassName {
  1465. isSameAnnotation = false
  1466. }
  1467. }
  1468. }
  1469. if isSameAnnotation == false {
  1470. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: false)
  1471. } else {
  1472. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: true)
  1473. self.openRightPane()
  1474. }
  1475. } else {
  1476. let fristAnnotation = annotations.first
  1477. let className = NSStringFromClass(fristAnnotation!.classForCoder)
  1478. if self.viewManager.isPDFReadMode {
  1479. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: false)
  1480. self.closeRightPane()
  1481. } else {
  1482. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: true)
  1483. if className != "CPDFStampAnnotation" &&
  1484. className != "CPDFSignatureAnnotation" &&
  1485. className != "CPDFListStampAnnotation" {
  1486. self.openRightPane()
  1487. }
  1488. }
  1489. }
  1490. if (listView.activeAnnotation.isKind(of: CPDFLineAnnotation.self)) {
  1491. if (!(listView.activeAnnotation as! CPDFLineAnnotation).isMeasure) {
  1492. cancelMeasureType()
  1493. } else {
  1494. if distanceMeasureInfoWindowController == nil {
  1495. let measureInfo = CPDFDistanceMeasureInfo()
  1496. distanceMeasureInfoWindowController = CDistanceMeasureInfoWindowController()
  1497. distanceMeasureInfoWindowController?.measureInfo = measureInfo
  1498. distanceMeasureInfoWindowController?.delegate = self
  1499. }
  1500. }
  1501. } else if (!listView.activeAnnotation.isKind(of: CPDFPolygonAnnotation.self) && !listView.activeAnnotation.isKind(of: CPDFPolylineAnnotation.self)) {
  1502. cancelMeasureType()
  1503. } else if (listView.activeAnnotation.isKind(of: CPDFPolygonAnnotation.self) || listView.activeAnnotation.isKind(of: CPDFPolylineAnnotation.self)) {
  1504. if perimeterMeasureInfoWindowController == nil {
  1505. let measureInfo = CPDFPerimeterMeasureInfo()
  1506. perimeterMeasureInfoWindowController = CPerimeterMeasureInfoWindowController()
  1507. perimeterMeasureInfoWindowController?.measureInfo = measureInfo
  1508. perimeterMeasureInfoWindowController?.delegate = self
  1509. }
  1510. if areaMeasureInfoWindowController == nil {
  1511. let measureInfo = CPDFAreaMeasureInfo()
  1512. areaMeasureInfoWindowController = CAreaMeasureInfoWindowController()
  1513. areaMeasureInfoWindowController?.measureInfo = measureInfo
  1514. areaMeasureInfoWindowController?.delegate = self
  1515. }
  1516. }
  1517. } else if (annotations.count == 0){
  1518. if pdfListView.annotationType == .unkown {
  1519. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: false)
  1520. self.closeRightPane()
  1521. } else {
  1522. if self.viewManager.isPDFReadMode {
  1523. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: false)
  1524. self.closeRightPane()
  1525. } else {
  1526. self.rightSideViewController?.reloadDataWithPDFView(pdfView: pdfListView, isShow: true)
  1527. self.openRightPane()
  1528. }
  1529. }
  1530. }
  1531. }
  1532. func pdfListViewChangedAnnotationType(_ pdfListView: CPDFListView!, for annotationType: CAnnotationType) {
  1533. if(annotationType == .unkown) {
  1534. self.rightSideViewController.isHidden = true
  1535. self.closeRightPane()
  1536. }
  1537. let aType = annotationType
  1538. if aType.isMarkup() || aType == .anchored || aType == .freeText || aType.isSquare() || aType == .link {
  1539. KMDataManager.ud_set(annotationType.rawValue, forKey: SKLastAnnotationModeKey)
  1540. }
  1541. }
  1542. ///开始定位链接注释
  1543. func pdfListViewLinkDestinationStart(_ pdfListView: CPDFListView!, withActiveAnnotation annotation: CPDFAnnotation!) {
  1544. }
  1545. ///刷新链接注释
  1546. func pdfListViewLinkDestinationEnd(_ pdfListView: CPDFListView!, withActiveAnnotation annotation: CPDFAnnotation!) {
  1547. }
  1548. func pdfListViewMenuItemsEditing(at point: CGPoint, for page: CPDFPage!, menuItems: [NSMenuItem]!) -> [NSMenuItem]! {
  1549. if (listView.toolMode != CToolMode.editPDFToolMode) {
  1550. return menuItems
  1551. }
  1552. var tMenuItems = menuItems;
  1553. if(listView.isSelectEditCharRange() ||
  1554. listView.isSelecteditArea(with: point)) {
  1555. tMenuItems?.append(NSMenuItem.separator())
  1556. }
  1557. let areas = self.listView.editingAreas() ?? []
  1558. if areas.count == 1 {
  1559. let fristAreas = areas.first
  1560. if fristAreas is CPDFEditImageArea {
  1561. self.listView.selectImageAreas = fristAreas as? CPDFEditImageArea
  1562. if self.listView.isEditImage {
  1563. tMenuItems?.removeAll()
  1564. tMenuItems?.append(self.corpImageMenuItem())
  1565. tMenuItems?.append(self.cancelCorpImageMenuItem())
  1566. tMenuItems?.append(self.restoreCorpImageMenuItem())
  1567. } else {
  1568. tMenuItems?.append(NSMenuItem.separator())
  1569. tMenuItems?.append(self.cutImageArea())
  1570. tMenuItems?.append(self.replaceImageArea())
  1571. tMenuItems?.append(self.exportImageArea())
  1572. }
  1573. } else {
  1574. if tMenuItems?.count != 1 {
  1575. tMenuItems?.swapAt(0, 1)
  1576. }
  1577. }
  1578. } else if areas.count == 0 {
  1579. tMenuItems?.append(NSMenuItem.separator())
  1580. tMenuItems?.append(self.addText())
  1581. tMenuItems?.append(self.addImage())
  1582. }
  1583. return tMenuItems
  1584. }
  1585. func pdfListViewMenu(forEvent pdfListView: CPDFListView!, for theEvent: NSEvent!, click menu: AutoreleasingUnsafeMutablePointer<NSMenu?>!, isMoveSelectAnno: Bool) {
  1586. self.mouseRightMenuEvent = theEvent
  1587. var currentMenu : NSMenu = menu.pointee!
  1588. if let activeAnno = listView.activeAnnotation as? KMTableAnnotation {//Table
  1589. var pagePoint = NSPoint()
  1590. _ = self.listView.pageAndPoint(&pagePoint, for: theEvent, nearest: true)
  1591. currentMenu.removeAllItems()
  1592. let annotation = activeAnno
  1593. annotation.completeEditCellText()
  1594. if !(NSIsEmptyRect(annotation.drawRect)) {
  1595. annotation.drawLine(pagePoint)
  1596. NotificationCenter.default.post(name: NSNotification.Name.KMPDFViewTableAnnotationDidChange, object: self, userInfo: ["point": NSValue(point: pagePoint)])
  1597. }
  1598. if (annotation.rowNumber - annotation.currentCell.row - 1) < 0 {
  1599. return
  1600. }
  1601. currentMenu = tableMenu(currentMenu, withTable: listView.activeAnnotation as! KMTableAnnotation, point: pagePoint)
  1602. listView.needsDisplay = true
  1603. return
  1604. }
  1605. var pagePoint: NSPoint = .zero
  1606. if let page = self.listView.pageAndPoint(&pagePoint, for: theEvent, nearest: true) {
  1607. let anno = page.annotation(at: pagePoint)
  1608. let item1 = NSMenuItem(title: NSLocalizedString("Delete", comment: ""), action: #selector(menuItemActionMeasureDelete), target: self)
  1609. item1.representedObject = anno
  1610. let item2 = NSMenuItem(title: NSLocalizedString("Edit Note", comment: ""), action: #selector(menuItemActionMeasureEditNote), target: self)
  1611. item2.representedObject = anno
  1612. let item3 = NSMenuItem(title: NSLocalizedString("Settings", comment: ""), action: #selector(menuItemActionMeasureSetting), target: self)
  1613. item3.representedObject = anno
  1614. if let data = anno as? CPDFPolygonAnnotation { // 多变形
  1615. currentMenu.removeAllItems()
  1616. currentMenu.insertItem(item1, at: 0)
  1617. currentMenu.insertItem(item2, at: 1)
  1618. currentMenu.insertItem(item3, at: 2)
  1619. return
  1620. }
  1621. if let data = anno as? CPDFPolylineAnnotation {
  1622. currentMenu.removeAllItems()
  1623. currentMenu.insertItem(item1, at: 0)
  1624. currentMenu.insertItem(item2, at: 1)
  1625. currentMenu.insertItem(item3, at: 2)
  1626. return
  1627. }
  1628. if let data = anno as? CPDFLineAnnotation, data.isMeasure {
  1629. currentMenu.removeAllItems()
  1630. currentMenu.insertItem(item1, at: 0)
  1631. currentMenu.insertItem(item2, at: 1)
  1632. currentMenu.insertItem(item3, at: 2)
  1633. return
  1634. }
  1635. }
  1636. if (listView.toolMode == .selectToolMode){
  1637. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1638. currentMenu.insertItem(self.printingMenu(), at: 3)
  1639. currentMenu.insertItem(self.setTTSStype(), at: 3)
  1640. currentMenu.insertItem(self.setCropStype(), at: 3)
  1641. currentMenu.insertItem(self.setSnapshotStype(), at: 3)
  1642. let export = NSMenuItem(title: NSLocalizedString("Export", comment: ""), action: nil, target: self)
  1643. export.submenu = self.exportMenu()
  1644. currentMenu.insertItem(export, at: 3)
  1645. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1646. if listView.activeAnnotation == nil{
  1647. currentMenu.insertItem(self.setAnnotationToolStype(), at: 3)
  1648. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1649. }
  1650. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 3)
  1651. currentMenu.insertItem(self.addReadModelStype(), at: currentMenu.items.count - 3)
  1652. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1653. currentMenu.insertItem(self.setAITranslateStype(), at: 0)
  1654. currentMenu.insertItem(self.setAIProofreadStype(), at: 0)
  1655. currentMenu.insertItem(self.setAIRewriteStype(), at: 0)
  1656. return
  1657. }
  1658. if (listView.toolMode == .moveToolMode || listView.toolMode == .magnifyToolMode){
  1659. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1660. currentMenu.insertItem(self.setTTSStype(), at: 0)
  1661. currentMenu.insertItem(self.setCropStype(), at: 0)
  1662. currentMenu.insertItem(self.setSnapshotStype(), at: 0)
  1663. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1664. currentMenu.insertItem(self.addOutlineStype(), at: 0)
  1665. currentMenu.insertItem(self.addBookmarkMenu(), at: 0)
  1666. if listView.activeAnnotation == nil{
  1667. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1668. currentMenu.insertItem(self.setAnnotationToolStype(), at: 0)
  1669. }
  1670. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1671. currentMenu.insertItem(self.setAITranslateStype(), at: 0)
  1672. currentMenu.insertItem(self.setAIProofreadStype(), at: 0)
  1673. currentMenu.insertItem(self.setAIRewriteStype(), at: 0)
  1674. return
  1675. }
  1676. if currentMenu.items.count > 3 {
  1677. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 3)
  1678. currentMenu.insertItem(self.addReadModelStype(), at: currentMenu.items.count - 3)
  1679. }
  1680. if listView.currentSelection != nil && listView.activeAnnotations.count < 1{
  1681. if listView.currentSelection.selectionType() == .text {
  1682. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1683. currentMenu.insertItem(self.setSearchBaiduStype(), at: 3)
  1684. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1685. currentMenu.insertItem(self.setLookUpStype(), at: 3)
  1686. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1687. currentMenu.insertItem(self.addOutlineStype(), at: 3)
  1688. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1689. currentMenu.insertItem(self.setAnnotationToolStype(), at: 3)
  1690. currentMenu.insertItem(self.setTTSStype(), at: 3)
  1691. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1692. currentMenu.insertItem(self.setShareStype(), at: 3)
  1693. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1694. }
  1695. currentMenu.insertItem(self.enterAnnotationStype(), at: 3)
  1696. currentMenu.insertItem(NSMenuItem.separator(), at: 3)
  1697. if listView.currentSelection.selectionType() == .image{
  1698. currentMenu.insertItem(NSMenuItem.separator(), at: 6)
  1699. currentMenu.insertItem(self.addOutlineStype(), at: 6)
  1700. currentMenu.insertItem(NSMenuItem.separator(), at: 6)
  1701. currentMenu.insertItem(self.setAnnotationToolStype(), at: 6)
  1702. }
  1703. if listView.currentSelection.selectionType() == .text {
  1704. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count)
  1705. currentMenu.insertItem(self.setTranslateStype(), at: currentMenu.items.count)
  1706. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count)
  1707. }
  1708. }
  1709. if listView.activeAnnotation != nil || isMoveSelectAnno {
  1710. if let data = self.listView.activeAnnotation?.type?.lowercased(), data == "stamp"{
  1711. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  1712. currentMenu.insertItem(self.enterAnnotationStype(), at: currentMenu.items.count - 15)
  1713. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  1714. }else{
  1715. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  1716. currentMenu.insertItem(self.enterAnnotationStype(), at: currentMenu.items.count - 15)
  1717. if let anno = self.listView.activeAnnotation, anno.isKind(of: CPDFStampAnnotation.self) {
  1718. } else {
  1719. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  1720. currentMenu.insertItem(self.setShareStype(), at: currentMenu.items.count - 15)
  1721. }
  1722. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count - 15)
  1723. }
  1724. }
  1725. if listView.activeAnnotation == nil && listView.currentSelection == nil{
  1726. currentMenu.insertItem(NSMenuItem.separator(), at: currentMenu.items.count)
  1727. if(listView.toolMode == .selectToolMode) {
  1728. if NSIsEmptyRect(listView.currentSelectionRect()) {
  1729. currentMenu.insertItem(self.zoomSelectionMenuItem(), at: 0)
  1730. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1731. }
  1732. currentMenu.insertItem(self.printingMenu(), at: 0)
  1733. currentMenu.insertItem(self.setTTSStype(), at: 0)
  1734. currentMenu.insertItem(self.setCropStype(), at: 0)
  1735. currentMenu.insertItem(self.setSnapshotStype(), at: 0)
  1736. let export = NSMenuItem(title: NSLocalizedString("Export", comment: ""), action: nil, target: self)
  1737. export.submenu = self.exportMenu()
  1738. currentMenu.insertItem(export, at: currentMenu.items.count)
  1739. }else{
  1740. currentMenu.insertItem(NSMenuItem.separator(), at: 2)
  1741. currentMenu.insertItem(self.setTTSStype(), at: 2)
  1742. currentMenu.insertItem(self.setCropStype(), at: 2)
  1743. currentMenu.insertItem(self.setSnapshotStype(), at: 2)
  1744. currentMenu.insertItem(NSMenuItem.separator(), at: 2)
  1745. currentMenu.insertItem(self.addOutlineStype(), at: 2)
  1746. currentMenu.insertItem(NSMenuItem.separator(), at: 2)
  1747. currentMenu.insertItem(self.enterAnnotationStype(), at: 2)
  1748. currentMenu.insertItem(NSMenuItem.separator(), at: 2)
  1749. if(currentMenu.items.count > 4) {
  1750. currentMenu.insertItem(NSMenuItem.separator(), at: 5)
  1751. }
  1752. if(currentMenu.items.count > 5) {
  1753. currentMenu.insertItem(self.addBookmarkMenu(), at: 6)
  1754. }
  1755. currentMenu.insertItem(self.setAutoScrollStype(), at: currentMenu.items.count)
  1756. }
  1757. currentMenu.insertItem(self.setAnnotationToolStype(), at: 5)
  1758. }
  1759. currentMenu.insertItem(NSMenuItem.separator(), at: 0)
  1760. currentMenu.insertItem(self.setAITranslateStype(), at: 0)
  1761. currentMenu.insertItem(self.setAIProofreadStype(), at: 0)
  1762. currentMenu.insertItem(self.setAIRewriteStype(), at: 0)
  1763. for item in currentMenu.items {
  1764. if (item.action == NSSelectorFromString("menuItemClick_HidenorShowNote:")) {
  1765. // 显示与隐藏注释 item action 截取
  1766. item.action = #selector(menuItemClick_HidenorShowNote)
  1767. item.target = self
  1768. break
  1769. }
  1770. }
  1771. }
  1772. func pdfListViewAddAnnotations(_ pdfListView: CPDFListView!, forAdd annotations: [CPDFAnnotation]!, in pdfPage: CPDFPage!) {
  1773. var addRedact = false
  1774. for anno in annotations {
  1775. if (anno.isKind(of: CPDFRedactAnnotation.self)) {
  1776. addRedact = true
  1777. } else if anno is CPDFSquareAnnotation || anno is CPDFCircleAnnotation {
  1778. anno.contents = pdfPage?.string(for: anno.bounds) ?? ""
  1779. }
  1780. }
  1781. self.model.hasAddRedact = addRedact
  1782. if self.listView.toolMode == .moveToolMode {
  1783. self.listView.toolMode = .textToolMode
  1784. self.listView.annotationType = .unkown
  1785. self.toolbarController.toolbarType = .Annatiton
  1786. }
  1787. if (self.model.rightMouseEventing) {
  1788. self.model.rightMouseEventing = false
  1789. if (self.toolbarController.ignoreCurrentAnnotationTypeChange && self.listView.annotationType == .ink) {
  1790. self.listView.toolMode = .textToolMode
  1791. self.listView.annotationType = .unkown
  1792. }
  1793. }
  1794. self.toolbarController.ignoreCurrentAnnotationTypeChange = false
  1795. self.leftSideViewController.refreshUIForAddAnnotation(annos: annotations, page: pdfPage)
  1796. }
  1797. func pdfListViewRemoveAnnotations(_ pdfListView: CPDFListView!, forRemove annotations: [CPDFAnnotation]!, in pdfPage: CPDFPage!) {
  1798. self.leftSideViewController.annoList_refreshUIForDeleteAnnotations(annos: annotations, page: pdfPage)
  1799. }
  1800. func pdfListViewDidSelectionEnd(_ pdfListView: CPDFListView!) {
  1801. if (!self.listView.isEqual(to: pdfListView)) {
  1802. return
  1803. }
  1804. if (self.listView.toolMode != .selectToolMode) {
  1805. return
  1806. }
  1807. }
  1808. func pdfListViewKeyDowClosePanel(_ speedy: CPDFViewSidebarSpeedMode, event theEvent: NSEvent!) {
  1809. if(speedy == .right) {
  1810. self.toggleRightPane()
  1811. } else if (speedy == .left) {
  1812. self.menuItemAction_hiddenLeftSide(speedy)
  1813. }
  1814. }
  1815. func pdfListViewEventMarkupColor(with annotation: CPDFAnnotation!) -> [NSColor]! {
  1816. if (annotation.isKind(of: CPDFMarkupAnnotation.self)) {
  1817. if (annotation as! CPDFMarkupAnnotation).markupType() == .highlight {
  1818. return KMAnnotationPropertiesColorManager.manager.markHighlightColors
  1819. } else {
  1820. return KMAnnotationPropertiesColorManager.manager.markOtherColors
  1821. }
  1822. } else {
  1823. return KMAnnotationPropertiesColorManager.manager.markOtherColors
  1824. }
  1825. }
  1826. func pdfListViewHaveDocumentAttribute() -> Bool {
  1827. if(!self.listView.document.allowsCopying) {
  1828. self.removeOwnerPassword()
  1829. return false
  1830. }
  1831. return true
  1832. }
  1833. func pdfListView(_ sender: CPDFListView!, showSnapshotAtPageNumber pageNum: Int, for rect: NSRect, scaleFactor: CGFloat, autoFits: Bool) {
  1834. let swc = KMSnapshotWindowController(windowNibName: "SnapshotWindow")
  1835. swc.delegate = self
  1836. swc.setPdfDocument(self.listView.document, goToPageNumber: pageNum, rect: rect, scaleFactor: scaleFactor, autoFits: autoFits)
  1837. swc.forceOnTop = self.interactionMode != .normal
  1838. self.myDocument?.addWindowController(swc)
  1839. }
  1840. func pdfListView(_ pdfView: CPDFListView!, documentDataDidChanged docData: Any!, withInfo info: [AnyHashable : Any]!) {
  1841. if let data = info?[CPDFListView.outlineKey] as? Bool, data { // 大纲改变
  1842. guard let ol = docData as? CPDFOutline else {
  1843. return
  1844. }
  1845. let add = info?[CPDFListView.outlineAddKey] as? Bool ?? false
  1846. let remove = info?[CPDFListView.outlineRemoveKey] as? Bool ?? false
  1847. if add {
  1848. self.leftSideViewController.addOutlineAfter(ol)
  1849. }
  1850. if remove {
  1851. self.leftSideViewController.removeOutlineAfter(ol)
  1852. }
  1853. let demote = info?[CPDFListView.outlineDemoteKey] as? Bool ?? false
  1854. let promote = info?[CPDFListView.outlinePromoteKey] as? Bool ?? false
  1855. if demote {
  1856. self.leftSideViewController.demoteOutlineAfter(ol)
  1857. }
  1858. if promote {
  1859. self.leftSideViewController.promoteOutlineAfter(ol)
  1860. }
  1861. }
  1862. }
  1863. //TextEdit
  1864. func pdfListViewDidTextFontChanged(_ pdfListView: CPDFListView!) {
  1865. self.rightSideViewController.eidtPDFTextProperty.reloadData()
  1866. }
  1867. func pdfListViewDidTextColorChanged(_ pdfListView: CPDFListView!, with color: NSColor!) {
  1868. self.rightSideViewController.eidtPDFTextProperty.fontColorChangeAction()
  1869. }
  1870. func pdfListViewAnnotationMeasureInfoChange(_ pdfListView: CPDFListView!, with annotation: CPDFAnnotation!) {
  1871. guard let data = annotation else {
  1872. if distanceMeasureInfoWindowController?.window?.isVisible == true {
  1873. distanceMeasureInfoWindowController?.clearData()
  1874. }
  1875. return
  1876. }
  1877. if let lineAnnotation = annotation as? CPDFLineAnnotation {
  1878. handleLineAnnotation(lineAnnotation)
  1879. } else if let polylineAnnotation = annotation as? CPDFPolylineAnnotation {
  1880. handlePolylineAnnotation(polylineAnnotation)
  1881. } else if let polygonAnnotation = annotation as? CPDFPolygonAnnotation {
  1882. handlePolygonAnnotation(polygonAnnotation)
  1883. }
  1884. }
  1885. func pdfListViewMeasureCancel(_ pdfListView: CPDFListView!) {
  1886. cancelMeasureType()
  1887. }
  1888. func tableMenu(_ menu: NSMenu, withTable table: KMTableAnnotation, point: CGPoint) -> NSMenu {
  1889. if table.currentCell.row >= 0 && table.currentCell.column >= 0 {
  1890. let itemTitles = ["Edit", "", "Add Row Above", "Add Row Below", "", "Add Column Before", "Add Column After", "", "Delete Row", "Delete Column", "Delete Table", "Cut", "Copy", "Paste", "Paste and Match Style", "Delete Cell Contents", "Clear All"]
  1891. let actions = ["formAnnotTextEdit:", "", "addRowAbove:", "addRowBelow:", "", "addColumnBefore:", "addColumnAfter:", "", "deleteRow:", "deleteColumn:", "deleteTabel", "cutCell:", "copyCell:", "pasteCell:", "pasteAndMatchStyle:", "deleteCellContents:", "clearAll:"]
  1892. for i in 0..<itemTitles.count {
  1893. var item: NSMenuItem? = nil
  1894. if itemTitles[i] == "" {
  1895. item = NSMenuItem.separator()
  1896. menu.insertItem(item!, at: i)
  1897. } else {
  1898. item = NSMenuItem(title: itemTitles[i], action: nil, keyEquivalent: "")
  1899. item!.target = self
  1900. item!.action = NSSelectorFromString(actions[i])
  1901. if itemTitles[i] == "Paste" /*&& !_copyCellData*/ {
  1902. item!.action = nil
  1903. } else if itemTitles[i] == "Paste and Match Style" /*&& !_copyCellData */{
  1904. item!.action = nil
  1905. } else if itemTitles[i] == "Add Row Above" {
  1906. let path1 = table.crossLines[table.rowNumber - table.currentCell.row]
  1907. let path2 = table.crossLines[table.rowNumber - table.currentCell.row - 1]
  1908. if (path1 as AnyObject).lineJoinStyle == NSBezierPath.LineJoinStyle.round && table.headerCount() >= 5 {
  1909. item!.action = nil
  1910. } else if (path2 as AnyObject).lineJoinStyle == NSBezierPath.LineJoinStyle.bevel && table.footerCount() >= 5 {
  1911. item!.action = nil
  1912. }
  1913. }
  1914. item!.title = NSLocalizedString(item!.title, comment: "")
  1915. item!.representedObject = NSValue(point: point)
  1916. menu.insertItem(item!, at: i)
  1917. }
  1918. }
  1919. } else {
  1920. let itemTitles = ["Cut", "Copy", "Paste", "Delete"]
  1921. let actions = ["cut:", "copy:", "paste:", "delete:"]
  1922. for i in 0..<itemTitles.count {
  1923. let item = NSMenuItem(title: itemTitles[i], action: nil, keyEquivalent: "")
  1924. item.target = self
  1925. item.action = NSSelectorFromString(actions[i])
  1926. item.title = NSLocalizedString(item.title, comment: "")
  1927. menu.insertItem(item, at: i)
  1928. item.representedObject = NSValue(point: point)
  1929. }
  1930. }
  1931. return menu
  1932. }
  1933. private func handleLineAnnotation(_ annotation: CPDFLineAnnotation) {
  1934. if perimeterMeasureInfoWindowController?.window?.isVisible == true {
  1935. perimeterMeasureInfoWindowController?.hideFloatingWindow()
  1936. distanceMeasureInfoWindowController?.showWindow(self)
  1937. } else if areaMeasureInfoWindowController?.window?.isVisible == true {
  1938. areaMeasureInfoWindowController?.hideFloatingWindow()
  1939. distanceMeasureInfoWindowController?.showWindow(self)
  1940. } else if distanceMeasureInfoWindowController?.window?.isVisible == false {
  1941. distanceMeasureInfoWindowController?.showWindow(self)
  1942. }
  1943. let measureInfo = annotation.measureInfo
  1944. let startPoint = annotation.startPoint
  1945. let endPoint = annotation.endPoint
  1946. let angle = atan2(endPoint.y - startPoint.y, endPoint.x - startPoint.x) * (180.0 / .pi)
  1947. distanceMeasureInfoWindowController?.angleLabel.stringValue = String(format: "%.2f°", abs(angle))
  1948. distanceMeasureInfoWindowController?.xLabel.stringValue = String(format: "%.0f", abs(endPoint.x - startPoint.x))
  1949. distanceMeasureInfoWindowController?.yLabel.stringValue = String(format: "%.0f", abs(endPoint.y - startPoint.y))
  1950. distanceMeasureInfoWindowController?.reloadData(with: measureInfo!)
  1951. }
  1952. private func handlePolylineAnnotation(_ annotation: CPDFPolylineAnnotation) {
  1953. if distanceMeasureInfoWindowController?.window?.isVisible == true {
  1954. distanceMeasureInfoWindowController?.hideFloatingWindow()
  1955. perimeterMeasureInfoWindowController?.showWindow(self)
  1956. } else if areaMeasureInfoWindowController?.window?.isVisible == true {
  1957. areaMeasureInfoWindowController?.hideFloatingWindow()
  1958. perimeterMeasureInfoWindowController?.showWindow(self)
  1959. } else if perimeterMeasureInfoWindowController?.window?.isVisible == false {
  1960. perimeterMeasureInfoWindowController?.showWindow(self)
  1961. }
  1962. let measureInfo = annotation.measureInfo
  1963. let savePoints = annotation.savePoints()
  1964. var angle: CGFloat = 0
  1965. if savePoints.count >= 3 {
  1966. let count = savePoints.count
  1967. let startPoint = savePoints[count - 3].pointValue
  1968. let midPoint = savePoints[count - 2].pointValue
  1969. let endPoint = savePoints.last!.pointValue
  1970. angle = angleBetweenPoints(startPoint, midPoint, endPoint)
  1971. }
  1972. angle = 180 - angle
  1973. perimeterMeasureInfoWindowController?.angleLabel.stringValue = String(format: "%.2f°", abs(angle))
  1974. perimeterMeasureInfoWindowController?.reloadData(with: measureInfo!)
  1975. }
  1976. private func handlePolygonAnnotation(_ annotation: CPDFPolygonAnnotation) {
  1977. if distanceMeasureInfoWindowController?.window?.isVisible == true {
  1978. distanceMeasureInfoWindowController?.hideFloatingWindow()
  1979. areaMeasureInfoWindowController?.showWindow(self)
  1980. } else if perimeterMeasureInfoWindowController?.window?.isVisible == true {
  1981. perimeterMeasureInfoWindowController?.hideFloatingWindow()
  1982. areaMeasureInfoWindowController?.showWindow(self)
  1983. } else if areaMeasureInfoWindowController?.window?.isVisible == false {
  1984. areaMeasureInfoWindowController?.showWindow(self)
  1985. }
  1986. let measureInfo = annotation.measureInfo
  1987. let savePoints = annotation.savePoints
  1988. var angle: CGFloat = 0
  1989. if savePoints.count >= 3 {
  1990. let count = savePoints.count
  1991. let startPoint = (savePoints[count - 3] as AnyObject).pointValue
  1992. let midPoint = (savePoints[count - 2] as AnyObject).pointValue
  1993. let endPoint = (savePoints.lastObject as AnyObject).pointValue
  1994. angle = angleBetweenPoints(startPoint!, midPoint!, endPoint!)
  1995. }
  1996. angle = 180 - angle
  1997. areaMeasureInfoWindowController?.angleLabel.stringValue = String(format: "%.2f°", abs(angle))
  1998. areaMeasureInfoWindowController?.reloadData(measureInfo!)
  1999. }
  2000. private func angleBetweenPoints(_ startPoint: CGPoint, _ midPoint: CGPoint, _ endPoint: CGPoint) -> CGFloat {
  2001. let vector1 = CGPoint(x: midPoint.x - startPoint.x, y: midPoint.y - startPoint.y)
  2002. let vector2 = CGPoint(x: endPoint.x - midPoint.x, y: endPoint.y - midPoint.y)
  2003. let dotProduct = vector1.x * vector2.x + vector1.y * vector2.y
  2004. let magnitude1 = sqrt(vector1.x * vector1.x + vector1.y * vector1.y)
  2005. let magnitude2 = sqrt(vector2.x * vector2.x + vector2.y * vector2.y)
  2006. return acos(dotProduct / (magnitude1 * magnitude2)) * (180.0 / .pi)
  2007. }
  2008. @objc func pdfUpdatedFinish() {
  2009. splitPDFController?.inPDFFirst = false
  2010. splitPDFController?.outPDFFirst = false
  2011. }
  2012. }
  2013. //MARK: - KMNThumbnailBaseViewDelegate
  2014. extension KMMainViewController: KMNThumbnailBaseViewDelegate {
  2015. func clickThumbnailViewControlle(pageEditVC:KMNThumbnailBaseViewController?,currentIndex:Int) {
  2016. exitPageEditMode()
  2017. viewManager.isPageEditMode = false
  2018. pdfToolbarController?.reloadPageEditView()
  2019. }
  2020. func insertPDFThumbnailViewControlle(pageEditVC: KMNThumbnailBaseViewController?, pdfDocment: CPDFDocument?) {
  2021. if(pdfDocment != nil) {
  2022. insertDocuments.insert(pdfDocment!)
  2023. }
  2024. }
  2025. func changeIndexPathsThumbnailViewControlle(pageEditVC: KMNThumbnailBaseViewController?, selectionIndexPaths: Set<IndexPath>, selectionStrings: String) {
  2026. toolbarManager.page_pageInfo_Property.text = selectionStrings
  2027. if(toolbarManager.page_pageInfo_Property.creatable == false) {
  2028. toolbarManager.page_pageInfo_Property.creatable = true
  2029. }
  2030. pdfToolbarController?.refreshSecondToolbarItemsState()
  2031. }
  2032. }
  2033. extension KMMainViewController: KMNLeftSideViewControllerDelegate {
  2034. func enterPageEditLeftSideViewController(leftSideViewController: KMNLeftSideViewController) {
  2035. if viewManager.isPageEditMode == false {
  2036. viewManager.isPageEditMode = true
  2037. if(pdfToolbarController != nil) {
  2038. kmPDFToolbarControllerDidToolbarItemClicked(pdfToolbarController!, KMPDFToolbar_PageEdit_Identifier)
  2039. pdfToolbarController?.reloadSecondToolbar()
  2040. }
  2041. }
  2042. }
  2043. func changeSelectePageLeftSideViewController(leftSideViewController: KMNLeftSideViewController, pageIndex: Int) {
  2044. if(listView.currentPageIndex != pageIndex) {
  2045. listView.go(toPageIndex: pageIndex, animated: true)
  2046. }
  2047. }
  2048. }
  2049. //MARK: -
  2050. //MARK: -
  2051. //MARK: -
  2052. //MARK: - 旧代码,需要用到的内容需要拖出来,写好注释
  2053. extension KMMainViewController {
  2054. func awakeFromNibFunction() {
  2055. self.addBackgroundMaskView()
  2056. self.PDFContendView.backgroundColor(NSColor.km_init(hex: "FFFFFF"))
  2057. listView.delegate = self
  2058. listView.pdfListViewDelegate = self
  2059. if (document != nil) {
  2060. self.listView.document = self.document
  2061. self.listView.document?.delegate = self
  2062. let autoScale = listView.autoScales
  2063. if !autoScale {
  2064. listView.scaleFactor = 1.0
  2065. }
  2066. }
  2067. self.initPDFLeftViewVC()
  2068. self.initRightSideView()
  2069. self.toolbarController.listView = self.listView
  2070. self.toolbarController.mainViewController = self
  2071. self.leftSideViewController.mainViewController = self
  2072. self.newPDFSplitView.delegate = self
  2073. }
  2074. func viewDidAppearFunction() {
  2075. //春季活动
  2076. if ((KMAdvertisementManager.manager.info.popWindowContent) != nil) {
  2077. if KMAdvertisementManager.manager.info.popWindowContent!.content!.count > 0 {
  2078. let info = KMAdvertisementManager.manager.info.popWindowContent!.content?.first
  2079. if KMAdvertisementManager.checkAdvertisementValid(info!) {
  2080. self.loadRecommondPopWindow()
  2081. }
  2082. }
  2083. }
  2084. self.addEventMonitor()
  2085. self.view.window?.makeFirstResponder(self.listView)
  2086. // 更新属性页面的信息
  2087. NotificationCenter.default.post(name: KMInfoWindowC.windowDidBecomeMainNotification, object: self.myDocument)
  2088. self.interfaceThemeDidChanged(self.view.window?.appearance?.name ?? (NSApp.appearance?.name ?? .aqua))
  2089. if (self.document == nil) {
  2090. return
  2091. }
  2092. if (self.document == nil || self.document!.isLocked == false) {
  2093. self.loadFunctionGuide()
  2094. }
  2095. if (self.document?.isLocked == false) {
  2096. if self.model.needConvertNotes && self.tabViewIsDragging() == false {
  2097. self.showConvertNotesProgress()
  2098. }
  2099. return
  2100. }
  2101. if (self.view.window == nil) {
  2102. return
  2103. }
  2104. if (self.model.password != nil) {
  2105. if let data = self.listView.document?.unlock(withPassword: self.model.password), data {
  2106. self.model.isSaveKeyChain = false
  2107. if self.model.needConvertNotes && self.tabViewIsDragging() == false {
  2108. self.showConvertNotesProgress()
  2109. }
  2110. return
  2111. }
  2112. }
  2113. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.3) {
  2114. if self.view.window != nil && self.tabViewIsDragging() == false {
  2115. self.passwordWindow = KMPasswordInputWindow.openWindow(window: self.view.window!, url: self.document!.documentURL) { [weak self] result , password in
  2116. if (result == .cancel) {
  2117. (self?.myDocument as? KMMainDocument)?.browser?.closeTab()
  2118. return
  2119. }
  2120. self?.model.isSaveKeyChain = true
  2121. self?.listView.document = self?.document
  2122. self?.document?.unlock(withPassword: password)
  2123. }
  2124. } else {
  2125. if self.model.needConvertNotes && self.tabViewIsDragging() == false {
  2126. self.showConvertNotesProgress()
  2127. }
  2128. }
  2129. }
  2130. }
  2131. func viewWillDisappearFunction() {
  2132. if self.interactionMode != .presentation {
  2133. self.removeEventMonitor()
  2134. }
  2135. self.editPDFHanddler.hiddenWindows()
  2136. }
  2137. func viewWillLayoutFunction() {
  2138. if (KMTools.isFullScreen(self.view.window ?? NSWindow())) { // 全屏
  2139. self.listView.backgroundColor = KMPreferenceManager.shared.displayBackgroundFullScreenColor
  2140. } else {
  2141. self.listView.backgroundColor = KMPreferenceManager.shared.displayBackgroundNormalColor
  2142. }
  2143. if let guideWC = self.guideInfoWindowController{
  2144. var rect = self.view.window!.frame
  2145. rect.size.height -= 20
  2146. guideWC.window?.setFrame(rect, display: false)
  2147. guideWC.window?.minSize = rect.size
  2148. guideWC.window?.maxSize = rect.size
  2149. guideWC.show()
  2150. }
  2151. }
  2152. func viewDidLoadOld() {
  2153. mwcFlags.settingUpWindow = 1
  2154. toolbarController.delegate = self
  2155. self.editPDFHanddler.viewC = self
  2156. self.srHanddler.pdfView = self.listView
  2157. self.initToolbar()
  2158. if (UserDefaults.standard.object(forKey: CPDFOfficeLeftSidePaneWidthKey) != nil) {
  2159. UserDefaults.standard.set(256, forKey: CPDFOfficeLeftSidePaneWidthKey)
  2160. UserDefaults.standard.synchronize()
  2161. }
  2162. if (UserDefaults.standard.object(forKey: CPDFOfficeRightSidePaneWidthKey) != nil) {
  2163. UserDefaults.standard.set(256, forKey: CPDFOfficeRightSidePaneWidthKey)
  2164. UserDefaults.standard.synchronize()
  2165. }
  2166. let position = mianSplitView.maxPossiblePositionOfDivider(at: 1)
  2167. mianSplitView.setPosition(position, ofDividerAt: 0)
  2168. mianSplitView.setPosition(mianSplitView.minPossiblePositionOfDivider(at: 0), ofDividerAt: 0)
  2169. pdfSplitView.setPosition(mianSplitView.maxPossiblePositionOfDivider(at: 1), ofDividerAt: 0)
  2170. if (KMPreferenceManager.shared.openLastUnlockedDocumentWhenAppStart) {
  2171. if (self.listView.document != nil) {
  2172. let pageNumber = KMPreferenceManager.shared.getPageNumber(forKey: self.listView.document?.documentURL.path ?? "")
  2173. let pageScale = KMPreferenceManager.shared.getPageScale(forKey: self.listView.document?.documentURL.path ?? "")
  2174. if (pageNumber != nil && pageNumber! >= 0 && pageNumber! < (self.listView.document?.pageCount ?? 0)) {
  2175. DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
  2176. if (pageScale != nil) {
  2177. self.listView.scaleFactor = CGFloat(pageScale!)
  2178. }
  2179. self.listView.go(toPageIndex: pageNumber!, animated: false)
  2180. }
  2181. } else {
  2182. self._goToFirstPageForFristAppear()
  2183. }
  2184. }
  2185. } else {
  2186. self._goToFirstPageForFristAppear()
  2187. }
  2188. pageNumberDisplayView.delegate = self
  2189. tipCurrentPageBox.moveCallback = { [unowned self] mouseEntered, mouseBox in
  2190. if !viewManager.isPDFReadMode {
  2191. if mouseEntered {
  2192. self.pageNumberDisplayView.hover = true
  2193. } else {
  2194. self.pageNumberDisplayView.hover = false
  2195. }
  2196. }
  2197. }
  2198. NotificationCenter.default.addObserver(self, selector: #selector(rename(_:)), name: NSNotification.Name.init(rawValue: "KMTabControllerRename"), object: nil)
  2199. NotificationCenter.default.addObserver(self, selector: #selector(closeTab(_:)), name: NSNotification.Name.init(rawValue: "KMTabControllerCloseTabs"), object: nil)
  2200. NotificationCenter.default.addObserver(self, selector: #selector(showInFinder(_:)), name: NSNotification.Name.init(rawValue: "KMTabControllerShowInFinder"), object: nil)
  2201. NotificationCenter.default.addObserver(self, selector: #selector(preferenceDidChangeNotification), name: KMPreferenceManager.didChangeNotification, object: nil)
  2202. NotificationCenter.default.addObserver(self, selector: #selector(documentDidUnlockNotification), name: Notification.Name("CPDFDocumentDidUnlockNotification"), object: nil)
  2203. NotificationCenter.default.addObserver(self, selector: #selector(annotationsAttributeHasChange), name: NSNotification.Name.CPDFListViewAnnotationsAttributeHasChange, object:nil)
  2204. NotificationCenter.default.addObserver(self, selector: #selector(applicationWillTerminateNotification), name: NSApplication.willTerminateNotification, object: nil)
  2205. NotificationCenter.default.addObserver(self, selector: #selector(CPDFDocumentPageCountChangedNotification), name: NSNotification.Name.init(rawValue: "CPDFDocumentPageCountChangedNotification"), object: nil)
  2206. NotificationCenter.default.addObserver(self, selector: #selector(CEditPDFToolModeChangeStateUnkownNotification), name: Notification.Name.init("CEditPDFToolModeChangeStateUnkown"), object: nil)
  2207. NotificationCenter.default.addObserver(self, selector: #selector(handlePageChangedNotification), name: NSNotification.Name.CPDFViewPageChanged, object: self.listView)
  2208. NotificationCenter.default.addObserver(self, selector: #selector(handleDisplayBoxChangedNotification), name: NSNotification.Name.CPDFViewDisplayBoxChanged, object: self.listView)
  2209. NotificationCenter.default.addObserver(self, selector: #selector(didAddContentViewNotification), name: NSWindow.didAddContentViewNotification, object: nil)
  2210. NotificationCenter.default.addObserver(self, selector: #selector(addAutoSaveEvent), name: AutoSaveManager.kTimeValueChangedNotificationName, object: nil)
  2211. NotificationCenter.default.addObserver(self, selector: #selector(didRemoveAnnotationNotification), name: NSNotification.Name.CPDFPageDidRemoveAnnotation, object: nil)
  2212. Task {
  2213. self.addAutoSaveEvent()
  2214. }
  2215. self.toolbarController.selectItem(KMDocumentAnnotationToolbarItemIdentifier)
  2216. self.closeRightPane()
  2217. self.addKeyEventMonitor()
  2218. self.addAdsBannerView()
  2219. var snapshotSetups: NSArray?
  2220. if KMPreferenceManager.shared.rememberSnapshot {
  2221. if let fileUrl = (self.myDocument as? KMMainDocument)?.fileURL {
  2222. snapshotSetups = SKBookmarkController.shared().snapshotsForRecentDocument(at: fileUrl) as NSArray?
  2223. }
  2224. }
  2225. if let cnt = snapshotSetups?.count, cnt > 0 {
  2226. if let data = self.listView.document?.isLocked, data {
  2227. self.savedNormalSetup.setObject(snapshotSetups as Any, forKey: "snapshots" as NSCopying)
  2228. } else {
  2229. self.showSnapshots(setups: snapshotSetups)
  2230. }
  2231. }
  2232. let readModel = UserDefaults.standard.bool(forKey: "kKMPDFViewIsReadMode")
  2233. if readModel == true {
  2234. self.openPDFReadMode()
  2235. }
  2236. let hasWindowSetup = savedNormalSetup.count > 0
  2237. if UserDefaults.standard.dictionary(forKey: KMDefaultPDFDisplaySettingsKey) != nil {
  2238. let pdfSettings: NSDictionary = hasWindowSetup ? savedNormalSetup : UserDefaults.standard.dictionary(forKey: KMDefaultPDFDisplaySettingsKey)! as NSDictionary
  2239. self.applyPDFSettings(pdfSettings)
  2240. } else {
  2241. self.applyPDFSettings(savedNormalSetup)
  2242. }
  2243. //文字
  2244. let fontManager = NSFontManager.shared
  2245. fontManager.target = self
  2246. fontManager.action = #selector(changeFont(_:))
  2247. }
  2248. //MARK: - PDFListView
  2249. func initPDFLeftViewVC() {
  2250. var frame = self.leftView.frame
  2251. frame.size.width += 44
  2252. self.leftView.frame = frame
  2253. leftSideViewController.isFirst = true
  2254. leftSideViewController.listView = self.listView
  2255. leftSideViewController.view.frame = CGRect(x: 0, y:0 , width: self.leftView.frame.size.width, height: self.leftView.frame.size.height)
  2256. leftSideViewController.view.autoresizingMask = [.height,.width]
  2257. leftSideViewController.delegate = self
  2258. self.leftView.addSubview(leftSideViewController.view)
  2259. }
  2260. func initRightSideView() {
  2261. self.rightSideViewController = KMRightSideViewController.init()
  2262. self.rightSideViewController.view.frame = CGRect(x: 0, y: 0, width: self.rightView.frame.width, height: self.rightView.frame.size.height)
  2263. self.rightSideViewController.view.autoresizingMask = [.height,.width]
  2264. self.rightSideViewController.listView = self.listView
  2265. self.rightSideViewController.isHidden = true
  2266. self.rightSideViewController.delegate = self
  2267. self.rightView.addSubview(self.rightSideViewController.view)
  2268. self.rightSideViewController.propertyDidChange = { [weak self] model in
  2269. if let anno = model as? CSelfSignAnnotation {
  2270. self?.leftSideViewController.refreshUIForAnnoAttributeDidChange(anno, attributes: nil)
  2271. }
  2272. }
  2273. }
  2274. func addAdsBannerView() {
  2275. #if VERSION_FREE
  2276. if !IAPProductsManager.default().isAvailableAllFunction(){
  2277. guard let document = self.listView.document else {
  2278. return
  2279. }
  2280. if !document.isLocked {
  2281. KMAdsManager.defaultManager.beginSheetModalForView(self.readContentView, directions: .down, adPosY: 30, animated: false) { pageIndex in
  2282. }
  2283. }
  2284. NotificationCenter.default.addObserver(self, selector: #selector(purchaseStateUpdateNoti), name: NSNotification.Name(rawValue: "KMIAPProductPurchasedNotification"), object: nil)
  2285. NotificationCenter.default.addObserver(self, selector: #selector(purchaseStateUpdateNoti), name: NSNotification.Name(rawValue: "kDeviceActivateNotification"), object: nil)
  2286. }
  2287. #endif
  2288. }
  2289. // MARK: Private Methods
  2290. private func _isArabicLanguage() -> Bool {
  2291. return NSLocalizedString("Right click a color and select “Change Color...“.", comment: "") == "انقر بزر الماوس الأيمن فوق اللون وحدد \"تغيير اللون...\"."
  2292. }
  2293. internal func removeNotifications() {
  2294. NotificationCenter.default.removeObserver(self)
  2295. self.leftSideViewController.clearAnnotationFilterData()
  2296. self.leftSideViewController.clearNotification()
  2297. }
  2298. func checkShouldAutoOpenLeftVC() {
  2299. if KMPreference.shared.showLeftSideBar == false {
  2300. return
  2301. }
  2302. if self.model.leftPanelOpen {
  2303. return
  2304. }
  2305. let readModel = UserDefaults.standard.bool(forKey: "kKMPDFViewIsReadMode")
  2306. if readModel == true {
  2307. return
  2308. }
  2309. DispatchQueue.main.async {
  2310. self.leftSideViewController.showThumbnail()
  2311. self.toolbarController.findItem(KMLeftControlToolbarItemIdentifier)?.isSelected = true
  2312. }
  2313. }
  2314. func applyLeftSideWidth(_ leftSideWidth: CGFloat, rightSideWidth: CGFloat) -> Void {
  2315. mianSplitView.setPosition(leftSideWidth, ofDividerAt: 0)
  2316. mianSplitView.setPosition(mianSplitView.maxPossiblePositionOfDivider(at: 1) - mianSplitView.dividerThickness - rightSideWidth, ofDividerAt: 1)
  2317. self.model.lastLeftPanWidth = leftSideWidth
  2318. self.model.lastRightPanWidth = rightSideWidth
  2319. }
  2320. func removeAllAnnotations() {
  2321. let alert = NSAlert()
  2322. alert.messageText = NSLocalizedString("This will permanently remove all annotations. Are you sure to continue?", comment: "")
  2323. alert.addButton(withTitle: NSLocalizedString("Yes", comment:""))
  2324. alert.addButton(withTitle: NSLocalizedString("No", comment:""))
  2325. if (alert.runModal() != .alertFirstButtonReturn) {
  2326. return
  2327. }
  2328. DispatchQueue.main.async {
  2329. self.removeAllAnnotationsStore.store(t: self.listView)
  2330. }
  2331. }
  2332. @objc func cancelMeasureType() {
  2333. self.hideMeasureFloatingWindows()
  2334. self.toolbarController?.findItem(KMToolbarMeasureItemIdentifier)?.isSelected = false
  2335. }
  2336. func hideMeasureFloatingWindows() {
  2337. if distanceMeasureInfoWindowController?.window?.isVisible == true {
  2338. distanceMeasureInfoWindowController?.hideFloatingWindow()
  2339. } else if perimeterMeasureInfoWindowController?.window?.isVisible == true {
  2340. perimeterMeasureInfoWindowController?.hideFloatingWindow()
  2341. } else if areaMeasureInfoWindowController?.window?.isVisible == true {
  2342. areaMeasureInfoWindowController?.hideFloatingWindow()
  2343. }
  2344. }
  2345. func showMeasureFloatingWindowsIfNeed() {
  2346. let toolMode = self.listView.toolMode
  2347. if toolMode != .measureToolMode {
  2348. return
  2349. }
  2350. let type = self.listView.annotationType
  2351. if type == .line {
  2352. self.distanceMeasureInfoWindowController?.window?.orderFront(nil)
  2353. } else if type == .polyLine {
  2354. self.perimeterMeasureInfoWindowController?.window?.orderFront(nil)
  2355. } else if type == .polyGon {
  2356. self.areaMeasureInfoWindowController?.window?.orderFront(nil)
  2357. } else if type == .square {
  2358. self.areaMeasureInfoWindowController?.window?.orderFront(nil)
  2359. }
  2360. }
  2361. // MARK: - 标记密文
  2362. func enterRedact() {
  2363. if !IAPProductsManager.default().isAvailableAllFunction(){
  2364. let winC = KMPurchaseCompareWindowController.sharedInstance()
  2365. winC?.kEventName = "Reading_Redact_BuyNow"
  2366. winC?.showWindow(nil)
  2367. return
  2368. }
  2369. if self.listView.document?.allowsPrinting == false || self.listView.document?.allowsCopying == false {
  2370. Task {
  2371. _ = await KMAlertTool.runModel(message: KMLocalizedString("This is a secured document. Editing is not permitted."))
  2372. }
  2373. return
  2374. }
  2375. if self.hasEnterRedact() {
  2376. self.exitRedact()
  2377. return
  2378. }
  2379. self.commitEditingIfNeed()
  2380. self.leftSideViewController.thumbnailTableView.isEnabled = false
  2381. self.leftSideViewController.tocOutlineView.isEnabled = false
  2382. self.leftSideViewController.noteOutlineView.isEnabled = false
  2383. self.leftSideViewController.findTableView.isEnabled = false
  2384. self.leftSideViewController.groupedFindTableView.isEnabled = false
  2385. self.leftSideViewController.snapshotTableView.isEnabled = false
  2386. let ttsWindowC = KMTTSWindowController.share
  2387. if ttsWindowC.pdfView?.document?.documentURL.path == self.listView.document?.documentURL.path {
  2388. if let data = ttsWindowC.window?.isVisible, data {
  2389. ttsWindowC.stopSpeaking()
  2390. ttsWindowC.close()
  2391. }
  2392. }
  2393. NSColorPanel.shared.showsAlpha = false
  2394. redactController = KMPDFRedactViewController(url: self.listView.document!.documentURL, password: self.listView.document?.password)
  2395. self.addChild(redactController)
  2396. self.PDFContendView.addSubview(redactController.view)
  2397. redactController.view.frame = self.PDFContendView.bounds
  2398. redactController.view.autoresizingMask = [.width, .height]
  2399. self.listView.isHidden = true
  2400. redactController.scaleFactor = self.listView.scaleFactor
  2401. redactController.titleBack = { [weak self] title in
  2402. self?.view.window?.title = title
  2403. }
  2404. redactController.callback = { [weak self] result, currentPageIndex, saveResult, saveUrl in
  2405. self?.listView.go(toPageIndex: self!.redactController.redactPdfView.currentPageIndex, animated: false)
  2406. if result == false { // 退出
  2407. self?.exitRedact()
  2408. return
  2409. }
  2410. let controller = self?._getPDFRedactController()
  2411. controller?.redactPdfView.newAddAnnotation.removeAll()
  2412. self?.exitRedact()
  2413. if saveResult {
  2414. let newDocument = CPDFDocument(url: saveUrl)
  2415. if let data = newDocument?.isLocked, data {
  2416. newDocument?.unlock(withPassword: self?.listView.document?.password ?? "")
  2417. }
  2418. self?.document = newDocument
  2419. self?.listView.document = newDocument
  2420. self?.listView.layoutDocumentView()
  2421. }
  2422. }
  2423. redactController.setCurrentPageIndex(self.listView.currentPageIndex)
  2424. }
  2425. func exitRedact() {
  2426. self.leftSideViewController.thumbnailTableView.isEnabled = true
  2427. self.leftSideViewController.tocOutlineView.isEnabled = true
  2428. self.leftSideViewController.noteOutlineView.isEnabled = true
  2429. self.leftSideViewController.findTableView.isEnabled = true
  2430. self.leftSideViewController.groupedFindTableView.isEnabled = true
  2431. self.leftSideViewController.snapshotTableView.isEnabled = true
  2432. let controller = self._getPDFRedactController()
  2433. if let data = controller {
  2434. if data.redactPdfView.newAddAnnotation.count > 0 {
  2435. KMAlertTool.runModel(message: "", informative: KMLocalizedString("There are unapplied redactions in this file. Exit will not save redaction."), buttons: [KMLocalizedString("Exit"), KMLocalizedString("Cancel")]) { response in
  2436. if response == .alertFirstButtonReturn {
  2437. controller?.redactPdfView.newAddAnnotation.removeAll()
  2438. self.exitRedact()
  2439. }
  2440. }
  2441. return
  2442. }
  2443. }
  2444. NSColorPanel.shared.showsAlpha = true
  2445. self.toolbarController.findItem(KMDocumentRedactToolbarItemIdentifier)?.isSelected = false
  2446. controller?.redactPdfView.resignMonitor()
  2447. controller?.view.removeFromSuperview()
  2448. controller?.removeFromParent()
  2449. self.listView.isHidden = false
  2450. self.listView.annotationType = .unkown
  2451. }
  2452. func hasEnterRedact() -> Bool {
  2453. return self._getPDFRedactController() != nil
  2454. }
  2455. //MARK: - AI
  2456. func showAITypeChooseView(aiConfigType: AIConfigType) -> Void {
  2457. if (self.document != nil) {
  2458. AIChatInfoManager.defaultManager.currentFilePath = (self.document?.documentURL.path)!
  2459. } else {
  2460. AIChatInfoManager.defaultManager.currentFilePath = ""
  2461. }
  2462. let windowVC: AINewConfigWindowController = AINewConfigWindowController.currentWC()
  2463. windowVC.chooseCurFileHandle = {[unowned self] windowVC in
  2464. if AIChatInfoManager.defaultManager.currentFilePath.isEmpty == false {
  2465. let documentArray = NSDocumentController.shared.documents
  2466. var didFileEdit: Bool = false
  2467. var curDoc: KMMainDocument!
  2468. for document in documentArray {
  2469. if document.fileURL?.path == AIChatInfoManager.defaultManager.currentFilePath {
  2470. didFileEdit = document.isDocumentEdited
  2471. curDoc = document as! KMMainDocument
  2472. break
  2473. }
  2474. }
  2475. if didFileEdit {
  2476. let tempFileURL = FileManager.default.temporaryDirectory.appendingPathComponent(AIChatInfoManager.defaultManager.currentFilePath.lastPathComponent)
  2477. if FileManager.default.fileExists(atPath: tempFileURL.path) {
  2478. do {
  2479. try FileManager.default.removeItem(at: tempFileURL)
  2480. } catch {
  2481. }
  2482. }
  2483. if curDoc != nil {
  2484. curDoc.mainViewController?.SaveTempPDFDocumentToURLPath(tempPath: tempFileURL.path)
  2485. }
  2486. }
  2487. windowVC.window?.becomeMain()
  2488. }
  2489. }
  2490. if windowVC.window?.isVisible == true && windowVC.didSetOriginFrame == true {
  2491. } else {
  2492. var windowRect = windowVC.window?.frame
  2493. windowRect!.origin.x = NSMaxX(self.view.window!.frame) - (windowRect?.size.width)!
  2494. windowRect!.origin.y = NSMaxY(self.view.window!.frame) - (windowRect?.size.height)! - 64
  2495. windowVC.window?.setFrame(windowRect!, display: true)
  2496. windowVC.didSetOriginFrame = true
  2497. }
  2498. windowVC.eventLabel = "AITools_Tbr"
  2499. windowVC.showWindow(nil)
  2500. if (aiConfigType != .none) {
  2501. windowVC.eventLabel = "AITools_Start"
  2502. if self.listView.currentSelection?.string()?.isEmpty == false {
  2503. windowVC.setCurrentPDFSelection(self.listView.currentSelection.string())
  2504. }
  2505. windowVC.chooseAIFunctionWithType(aiConfigType)
  2506. }
  2507. }
  2508. @objc func aiTipIconViewShowStateChangeNoti() {
  2509. }
  2510. //MARK: - 引导
  2511. func loadFunctionGuide() -> Void {
  2512. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
  2513. if self.view.window != nil {
  2514. self.loadOpenFileFunctionGuide(.openFileNormal)
  2515. }
  2516. }
  2517. }
  2518. func loadOpenFileFunctionGuide(_ showType: KMGuideInfoType) -> Void {
  2519. if showType == .openFileNormal && KMGuideInfoWindowController.availableShow(.openFileNormal) {
  2520. let leftPanelItem:KMToolbarItemView = self.toolbarController.findItem("KMLeftControlToolbarItemIdentifier")!
  2521. self.guideInfoWindowController = KMGuideInfoWindowController.currentWC()
  2522. guard let guideWC = self.guideInfoWindowController else { return }
  2523. guideWC.type = .openFileNormal
  2524. guideWC.openPanelRect = (self.view.window?.contentView?.convert(leftPanelItem.frame, from: leftPanelItem.superview)) ?? .zero
  2525. guideWC.window?.collectionBehavior = [.canJoinAllSpaces]
  2526. guideWC.normalGuideFinishHandle = { [weak self] windowVC in
  2527. let rightPanelItem = self?.toolbarController.findItem(KMRightControlToolbarItemIdentifier)
  2528. let digitalPanelItem = self?.toolbarController.findItem(KMDocumentSignToolbarItemIdentifier)
  2529. if let data = rightPanelItem, data.isHidden {
  2530. let view = self?.toolbarController.mainToolBarView?.toolbar?.moreButton
  2531. windowVC.rightPanelRect = (self?.view.window?.contentView?.convert(view?.frame ?? .zero, from: view?.superview)) ?? .zero
  2532. } else {
  2533. windowVC.rightPanelRect = (self?.view.window?.contentView?.convert(rightPanelItem?.frame ?? .zero, from: rightPanelItem?.superview)) ?? .zero
  2534. }
  2535. guideWC.digitalBoxRect = (self?.view.window?.contentView?.convert(digitalPanelItem?.frame ?? .zero, from: digitalPanelItem?.superview)) ?? .zero
  2536. }
  2537. guideWC.finishHandle = { [weak self] windowVC, type in
  2538. if type == .windowNewFinish ||
  2539. type == . windowDigitalFinish {
  2540. self?.checkFirstTrialController()
  2541. }
  2542. }
  2543. guideWC.openFileToggleHandle = { [weak self] windowVC, type in
  2544. self?.checkFirstTrialController()
  2545. }
  2546. var rect = self.view.window!.frame
  2547. rect.size.height -= 20
  2548. guideWC.window?.setFrame(rect, display: false)
  2549. guideWC.window?.minSize = rect.size
  2550. guideWC.window?.maxSize = rect.size
  2551. self.view.window?.addChildWindow(guideWC.window!, ordered: .above)
  2552. guideWC.show()
  2553. } else if showType == .digitalSignGuide && KMGuideInfoWindowController.availableShow(.digitalSignGuide) {
  2554. self.guideInfoWindowController = KMGuideInfoWindowController.currentWC()
  2555. guard let guideWC = self.guideInfoWindowController else { return }
  2556. guideWC.type = .digitalSignGuide
  2557. guard let digitalPanelItem = self.toolbarController.findItem(KMDocumentSignToolbarItemIdentifier) else {
  2558. return
  2559. }
  2560. guideWC.digitalBoxRect = (self.view.window?.contentView?.convert(digitalPanelItem.frame, from: digitalPanelItem.superview))!
  2561. guideWC.window?.collectionBehavior = [.canJoinAllSpaces]
  2562. guideWC.finishHandle = { [weak self] windowVC, type in
  2563. self?.checkFirstTrialController()
  2564. }
  2565. var rect = self.view.window!.frame
  2566. rect.size.height -= 20
  2567. guideWC.window?.setFrame(rect, display: false)
  2568. guideWC.window?.minSize = rect.size
  2569. guideWC.window?.maxSize = rect.size
  2570. self.view.window?.addChildWindow(guideWC.window!, ordered: .above)
  2571. guideWC.show()
  2572. } else if showType == .pdfCompareGuide && KMGuideInfoWindowController.availableShow(.pdfCompareGuide) {
  2573. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.2) {
  2574. self.guideInfoWindowController = KMGuideInfoWindowController.currentWC()
  2575. guard let guideWC = self.guideInfoWindowController else { return }
  2576. guideWC.type = .pdfCompareGuide
  2577. guard let digitalPanelItem = self.toolbarController.findItem(KMDocumentSignToolbarItemIdentifier) else {
  2578. return
  2579. }
  2580. guard let win = self.view.window else {
  2581. return
  2582. }
  2583. guideWC.digitalBoxRect = (win.contentView?.convert(digitalPanelItem.frame, from: digitalPanelItem.superview)) ?? .zero
  2584. let compareItem = self.toolbarController.findItem(KMToolbarComparisonItemIdentifier)
  2585. guideWC.compareItemRect = (win.contentView?.convert(compareItem?.frame ?? .zero, from: compareItem?.superview)) ?? .zero
  2586. guideWC.finishHandle = { [weak self] winC, type in
  2587. if type == .windowNewFinish {
  2588. DispatchQueue.main.async {
  2589. self?.loadOpenFileFunctionGuide(.measureGuide)
  2590. }
  2591. return
  2592. }
  2593. }
  2594. guideWC.window?.collectionBehavior = [.canJoinAllSpaces]
  2595. var rect = self.view.window!.frame
  2596. rect.size.height -= 20
  2597. guideWC.window?.setFrame(rect, display: false)
  2598. guideWC.window?.minSize = rect.size
  2599. guideWC.window?.maxSize = rect.size
  2600. self.view.window?.addChildWindow(guideWC.window!, ordered: .above)
  2601. guideWC.show()
  2602. }
  2603. } else if showType == .measureGuide && KMGuideInfoWindowController.availableShow(.measureGuide) {
  2604. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.2) {
  2605. self.guideInfoWindowController = KMGuideInfoWindowController.currentWC()
  2606. guard let guideWC = self.guideInfoWindowController else { return }
  2607. guard let _ = self.view.window else {
  2608. return
  2609. }
  2610. guideWC.type = .measureGuide
  2611. guard let digitalPanelItem = self.toolbarController.findItem(KMDocumentSignToolbarItemIdentifier) else {
  2612. return
  2613. }
  2614. guideWC.digitalBoxRect = (self.view.window?.contentView?.convert(digitalPanelItem.frame, from: digitalPanelItem.superview)) ?? .zero
  2615. let compareItem:KMToolbarItemView = self.toolbarController.findItem(KMToolbarMeasureItemIdentifier)!
  2616. guideWC.compareItemRect = (self.view.window?.contentView?.convert(compareItem.frame, from: compareItem.superview)) ?? .zero
  2617. guideWC.window?.collectionBehavior = [.canJoinAllSpaces]
  2618. var rect = self.view.window?.frame ?? .zero
  2619. rect.size.height -= 20
  2620. guideWC.window?.setFrame(rect, display: false)
  2621. guideWC.window?.minSize = rect.size
  2622. guideWC.window?.maxSize = rect.size
  2623. self.view.window?.addChildWindow(guideWC.window!, ordered: .above)
  2624. guideWC.show()
  2625. }
  2626. } else if showType == .convertGuide && KMGuideInfoWindowController.availableShow(.convertGuide) {
  2627. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
  2628. self.guideInfoWindowController = KMGuideInfoWindowController.currentWC()
  2629. guard let guideWC = self.guideInfoWindowController else { return }
  2630. guideWC.type = .convertGuide
  2631. guard let digitalPanelItem = self.toolbarController.findItem(KMDocumentSignToolbarItemIdentifier) else {
  2632. return
  2633. }
  2634. guard let win = self.view.window else {
  2635. return
  2636. }
  2637. guideWC.digitalBoxRect = (self.view.window?.contentView?.convert(digitalPanelItem.frame, from: digitalPanelItem.superview)) ?? .zero
  2638. guideWC.purchaseHandle = { [weak self] windowVC in
  2639. #if VERSION_DMG
  2640. if IAPProductsManager.default().isAvailableAllFunction() {
  2641. if IAPProductsManager.default().isAvailableAdvancedPDFToOffice() {
  2642. //Convert:
  2643. self?.showAllConvertWindow(convertT: .Word)
  2644. } else {
  2645. let limitWC = KMPurchaseLimitWindowController.currentLimitWC()
  2646. limitWC.continueBlock = { windowController in
  2647. }
  2648. limitWC.window?.center()
  2649. limitWC.showWindow(nil)
  2650. }
  2651. } else {
  2652. KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
  2653. }
  2654. #else
  2655. if IAPProductsManager.default().isAvailableAllFunction() {
  2656. if IAPProductsManager.default().isAvailableAdvancedPDFToOffice() {
  2657. //Convert:
  2658. } else {
  2659. var vc = KMToolCompareWindowController(toolType: .Convert, selectNum: 1)
  2660. vc.showWindow(nil)
  2661. }
  2662. } else {
  2663. KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
  2664. }
  2665. #endif
  2666. }
  2667. guideWC.window?.collectionBehavior = [.canJoinAllSpaces]
  2668. var rect = self.view.window?.frame ?? .zero
  2669. rect.size.height -= 20
  2670. guideWC.window?.setFrame(rect, display: false)
  2671. guideWC.window?.minSize = rect.size
  2672. guideWC.window?.maxSize = rect.size
  2673. self.view.window?.addChildWindow(guideWC.window!, ordered: .above)
  2674. guideWC.show()
  2675. }
  2676. } else {
  2677. }
  2678. }
  2679. func checkFirstTrialController() -> Void {
  2680. #if VERSION_DMG
  2681. //打开文档后引导相关
  2682. if VerificationManager.default().status == .none {
  2683. let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? ""
  2684. let lastVersion = UserDefaults.standard.object(forKey: "SKLastTrialVersionMainDocumentLaunchedKey") as? String ?? ""
  2685. if lastVersion.isEmpty || lastVersion != appVersion {
  2686. UserDefaults.standard.setValue(appVersion, forKey: "SKLastTrialVersionMainDocumentLaunchedKey")
  2687. UserDefaults.standard.synchronize()
  2688. KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
  2689. }
  2690. }
  2691. #endif
  2692. }
  2693. // MARK: - 页面编辑
  2694. open func enterPageEdit(_ pages: [Int] = []) {
  2695. if let doc = self.listView.document {
  2696. if doc.allowsCopying == false || doc.allowsPrinting == false {
  2697. KMBaseWindowController.checkPassword(url: doc.documentURL, type: .owner) { result, pwd in
  2698. if result && pwd.isEmpty == false {
  2699. self.listView.document?.unlock(withPassword: pwd)
  2700. Task { @MainActor in
  2701. self.enterPageEdit(pages)
  2702. }
  2703. } else {
  2704. self.exitPageEdit()
  2705. }
  2706. }
  2707. return
  2708. }
  2709. }
  2710. //选中page
  2711. var tPages = pages
  2712. if tPages.count == 0 {
  2713. if self.leftSideViewController.type.methodType == .Thumbnail {
  2714. tPages = self.leftSideViewController.thumb_fetchSelectedRows() ?? [self.listView.currentPageIndex]
  2715. }
  2716. }
  2717. if (hasEnterPageEdit()) {
  2718. exitPageEdit()
  2719. return
  2720. }
  2721. if (self.toolbarController != nil && self.toolbarController.mainToolBarView != nil) {
  2722. let toolBarView: KMToolbarViewController = self.toolbarController.mainToolBarView!
  2723. for (key, value) in toolBarView.toolbarItems {
  2724. if (key == KMRightControlToolbarItemIdentifier || key == KMLeftControlToolbarItemIdentifier) {
  2725. (value as! KMToolbarItemView).unEnabled = true
  2726. }
  2727. }
  2728. }
  2729. self.editPDFHanddler.clearData()
  2730. let controller = KMPDFEditViewController(self.listView.document)
  2731. controller.selectedPages = tPages
  2732. controller.listView = self.listView
  2733. self.addChild(controller)
  2734. self.PDFContendView.addSubview(controller.view)
  2735. controller.view.frame = self.PDFContendView.bounds
  2736. controller.view.autoresizingMask = [.width,.height]
  2737. self.listView.isHidden = true
  2738. controller.itemClick = { [weak self] index, params in
  2739. if (index == 1) { /// 双击退出
  2740. self?.enterEditMode(self!.leftSideViewController, [])
  2741. DispatchQueue.main.async {
  2742. let pageIndex: Int = params.first as! Int
  2743. self?.listView.go(toPageIndex: pageIndex, animated: true)
  2744. }
  2745. } else if (index == 2) { // 打印
  2746. self?.showPrintWindow(pageRange: KMPrintPageRange(type: .custom, selectPages: params.first as! [Int]))
  2747. }
  2748. }
  2749. controller.documentEditedCallback = { [weak self] params in
  2750. self?.recordIsPDFDocumentEdited()
  2751. }
  2752. controller.selectionDidChange = { selectedIndexs in
  2753. var indexSet = IndexSet()
  2754. for indexPath in selectedIndexs {
  2755. indexSet.insert(indexPath.item)
  2756. }
  2757. if indexSet.count != 0 {
  2758. }
  2759. }
  2760. }
  2761. open func exitPageEdit() {
  2762. if (self.toolbarController != nil && self.toolbarController.mainToolBarView != nil) {
  2763. let toolBarView: KMToolbarViewController = self.toolbarController.mainToolBarView!
  2764. for (key, value) in toolBarView.toolbarItems {
  2765. if (key == KMRightControlToolbarItemIdentifier || key == KMLeftControlToolbarItemIdentifier) {
  2766. (value as! KMToolbarItemView).unEnabled = false
  2767. }
  2768. }
  2769. }
  2770. self.toolbarController.findItem(KMDocumentPageToolbarItemIdentifier)?.isSelected = false
  2771. let editController = getPDFEditController()
  2772. if (editController == nil) {
  2773. return
  2774. }
  2775. self.listView.annotationType = .highlight
  2776. // FIXME: - sdk修复插入特定文档crash后,这行代码可以去掉
  2777. self.leftSideViewController.model.insertedDocumentSet.formUnion(editController?.model.insertedDocumentSet ?? [])
  2778. editController?.view.removeFromSuperview()
  2779. editController?.removeFromParent()
  2780. self.listView.isHidden = false
  2781. self.listView.layoutDocumentView()
  2782. self.view.window?.makeFirstResponder(self.listView)
  2783. self.listView.annotationType = .unkown
  2784. self.listView.go(toPageIndex: editController!.listViewCurrentIndex, animated: false)
  2785. if let data = editController?.isEdited, data {
  2786. self.leftSideViewController.reloadThumbnailDataIfNeed()
  2787. self.leftSideViewController.note_reloadDataIfNeed()
  2788. self.leftSideViewController.refreshUIOfOutlineIfNeed()
  2789. self.leftSideViewController.refreshUIOfSeachListIfNeed()
  2790. self.leftSideViewController.refreshUIOfBookmarkIfNeed()
  2791. }
  2792. }
  2793. open func hasEnterPageEdit() -> Bool {
  2794. return self.getPDFEditController() != nil
  2795. }
  2796. // MARK: - Edit PDF
  2797. func enterEditPDF() {
  2798. self.editPDFHanddler.enterEditPDF()
  2799. }
  2800. // MARK: - 数字签名
  2801. func hasShowDigitalSign() -> Bool {
  2802. return self.digitalSignController?.view.superview != nil
  2803. }
  2804. func canEnterDigitalSign() -> Bool {
  2805. guard let doc = self.listView.document else {
  2806. return false
  2807. }
  2808. return doc.allowsPrinting && doc.allowsCopying
  2809. }
  2810. func enterDigitalSign() {
  2811. self.listView.toolMode = .textToolMode
  2812. if self.hasShowDigitalSign() {
  2813. self.exitDigitalSign()
  2814. } else {
  2815. if self.needSaveDocument() {
  2816. self.saveDocumentWithProgressAlert { [unowned self] params in
  2817. if (self.listView.document != nil) {
  2818. self.showDigitalSignWindow(withFilePathURL: self.listView.document.documentURL)
  2819. }
  2820. }
  2821. return
  2822. }
  2823. if (self.listView.document != nil) {
  2824. self.showDigitalSignWindow(withFilePathURL: self.listView.document.documentURL)
  2825. }
  2826. }
  2827. }
  2828. func exitDigitalSign() {
  2829. self.digitalSignController?.view.removeFromSuperview()
  2830. // KMDocumentDigitalSignToolbarItemIdentifier
  2831. self.toolbarController.findItem(KMDocumentSignToolbarItemIdentifier)?.isSelected = false
  2832. }
  2833. func showDigitalSignWindow(withFilePathURL fileURL: URL) {
  2834. if !IAPProductsManager.default().isAvailableAllFunction(){
  2835. let winC = KMPurchaseCompareWindowController.sharedInstance()
  2836. winC?.kEventName = "Reading_DigitalSign_BuyNow"
  2837. winC?.showWindow(nil)
  2838. return
  2839. }
  2840. if hasShowDigitalSign() {
  2841. self.exitDigitalSign()
  2842. }
  2843. var currentPageIndex = listView.document?.index(for: listView.currentPage()) ?? 0
  2844. var password: String = ""
  2845. self.toolbarController.toolbarType = .None
  2846. password = listView.document?.password ?? ""
  2847. digitalSignController = KMPDFDigitalSignViewController()
  2848. digitalSignController?.currentPageIndex = Int(currentPageIndex)
  2849. digitalSignController?.url = listView.document?.documentURL
  2850. digitalSignController?.password = password
  2851. digitalSignController?.scaleFactor = listView.scaleFactor
  2852. digitalSignController?.titleChangeBlock = { title, index in
  2853. currentPageIndex = UInt(index)
  2854. }
  2855. digitalSignController?.buttonActionBlock = { [weak self] type, isChanged in
  2856. if type == .cancel {
  2857. if let page = self?.listView.document?.page(at: currentPageIndex) {
  2858. self?.listView.go(to: page)
  2859. }
  2860. self?.exitDigitalSign()
  2861. }
  2862. }
  2863. if let digitalSignView = digitalSignController?.view, let splitViewSuperview = mianSplitView.superview {
  2864. digitalSignView.frame = splitViewSuperview.bounds
  2865. digitalSignView.autoresizingMask = [.width, .height]
  2866. splitViewSuperview.addSubview(digitalSignView)
  2867. digitalSignController?.setCurrentPageIndex(Int(currentPageIndex))
  2868. }
  2869. }
  2870. // MARK: - Toolbar
  2871. func toolbarItemClickForExitMode(_ toolbarItem: KMToolbarItemView) {
  2872. if(toolbarItem.itemIdentifier != KMDocumentPageToolbarItemIdentifier) {
  2873. if (hasEnterPageEdit()) {
  2874. self.exitPageEdit()
  2875. }
  2876. }
  2877. if toolbarItem.itemIdentifier != KMDocumentRedactToolbarItemIdentifier {
  2878. if self.hasEnterRedact() {
  2879. self.exitRedact()
  2880. }
  2881. }
  2882. if toolbarItem.itemIdentifier != KMDocumentDigitalSignToolbarItemIdentifier {
  2883. if self.hasShowDigitalSign() {
  2884. self.exitDigitalSign()
  2885. }
  2886. }
  2887. if toolbarItem.itemIdentifier != KMDocumentEditToolbarItemIdentifier && toolbarItem.itemIdentifier != KMRightControlToolbarItemIdentifier && toolbarItem.itemIdentifier != KMLeftControlToolbarItemIdentifier {
  2888. self.commitEditingIfNeed()
  2889. }
  2890. }
  2891. // MARK: - Private Methods
  2892. private func getPDFEditController() -> KMPDFEditViewController? {
  2893. var editController: KMPDFEditViewController?
  2894. for controller in self.children {
  2895. if (controller.isKind(of: KMPDFEditViewController.self)) {
  2896. editController = (controller as! KMPDFEditViewController)
  2897. break
  2898. }
  2899. }
  2900. return editController
  2901. }
  2902. private func _getPDFRedactController() -> KMPDFRedactViewController? {
  2903. var controller: KMPDFRedactViewController?
  2904. for childC in self.children {
  2905. if (childC.isKind(of: KMPDFRedactViewController.self)) {
  2906. controller = (childC as! KMPDFRedactViewController)
  2907. break
  2908. }
  2909. }
  2910. return controller
  2911. }
  2912. private func addBackgroundMaskView() {
  2913. self.removeBackgroundMaskView()
  2914. if let superview = self.mianSplitView.superview {
  2915. let view = NSView()
  2916. superview.addSubview(view)
  2917. view.frame = superview.bounds
  2918. view.autoresizingMask = [.width, .height]
  2919. view.wantsLayer = true
  2920. view.layer?.backgroundColor = .white
  2921. self.background_mask = view
  2922. }
  2923. }
  2924. private func removeBackgroundMaskView() {
  2925. self.background_mask?.removeFromSuperview()
  2926. self.background_mask = nil
  2927. }
  2928. private func _goToFirstPageForFristAppear() {
  2929. DispatchQueue.main.asyncAfter(wallDeadline: .now()+0.1) {
  2930. self.listView.go(toPageIndex: 0, animated: false)
  2931. }
  2932. }
  2933. func isPDFPageCountExceedsLimit(filePath: String) -> Bool {
  2934. let url = URL(fileURLWithPath: filePath)
  2935. guard let document = PDFDocument(url: url) else {
  2936. return false
  2937. }
  2938. let pageCount = document.pageCount
  2939. return pageCount > 30
  2940. }
  2941. // MARK: - Redact 【标记密文】
  2942. func exeRedactConfirm(_ type: KMRedactConfirmType, callback: @escaping () -> ()?) {
  2943. let windowController = KMRedactConfirmWindowController(type)
  2944. self.currentWindowController = windowController
  2945. self.view.window?.beginSheet(windowController.window!)
  2946. windowController.itemClick = { [weak self] index in
  2947. if (index == 2) { /// 取消
  2948. self?.view.window?.endSheet((self?.currentWindowController.window)!)
  2949. self?.currentWindowController = nil
  2950. callback()
  2951. return
  2952. }
  2953. self?.view.window?.endSheet((self?.currentWindowController.window)!)
  2954. self?.currentWindowController = nil
  2955. let panel = NSSavePanel()
  2956. panel.nameFieldStringValue = "[新文件]"+((self?.listView.document?.documentURL.lastPathComponent) ?? "")
  2957. let button = NSButton.init(checkboxWithTitle: "保存后打开文档", target: nil, action: nil)
  2958. button.state = .on
  2959. panel.accessoryView = button
  2960. panel.isExtensionHidden = true
  2961. panel.beginSheetModal(for: (self?.view.window!)!) { response in
  2962. if response != .OK {
  2963. callback()
  2964. return
  2965. }
  2966. if (type == .redactOne) {
  2967. let anno = self!.listView.activeAnnotation
  2968. if (anno == nil || (anno?.isKind(of: CPDFRedactAnnotation.self)) == false) {
  2969. callback()
  2970. return
  2971. }
  2972. (anno as! CPDFRedactAnnotation).applyRedaction()
  2973. } else if (type == .redactAll) {
  2974. self?.listView.document?.applyRedactions()
  2975. } else if (type == .eraserOne) {
  2976. let anno = self!.listView.activeAnnotation
  2977. if (anno == nil || (anno?.isKind(of: CPDFRedactAnnotation.self)) == false) {
  2978. callback()
  2979. return
  2980. }
  2981. anno?.page.erasureRedact(from: anno!.bounds)
  2982. } else if (type == .eraserAll) {
  2983. KMRedactTools.eraserDocument((self?.listView.document)!) { result, errorAnno in
  2984. if (result == false) {
  2985. callback()
  2986. return
  2987. }
  2988. }
  2989. }
  2990. self!.listView.document?.write(to: panel.url)
  2991. if (button.state == .on) {
  2992. NSDocumentController.shared.openDocument(withContentsOf: panel.url!, display: true) { document, alreadyOpen, error in
  2993. }
  2994. } else {
  2995. NSWorkspace.shared.activateFileViewerSelecting([panel.url!])
  2996. }
  2997. callback()
  2998. }
  2999. }
  3000. }
  3001. // MARK: - Secure 【安全】
  3002. public func showSecureLimitTip() {
  3003. self.hiddenSecureLimitTip()
  3004. if self.secureAlertView == nil {
  3005. self.secureAlertView = KMSecureAlertView()
  3006. self.secureAlertView?.show(in: self.listView)
  3007. self.secureAlertView?.closeAction = { [unowned self] view in
  3008. self.hiddenSecureLimitTip()
  3009. self.removeFromAlertView()
  3010. self.showFormAlertView()
  3011. }
  3012. self.secureAlertView?.passwordAction = { [unowned self] view in
  3013. self.removeOwnerPassword()
  3014. self.removeFromAlertView()
  3015. self.showFormAlertView()
  3016. }
  3017. }
  3018. }
  3019. func removeOwnerPassword() {
  3020. guard let doc = self.listView.document else {
  3021. NSSound.beep()
  3022. return
  3023. }
  3024. if doc.allowsCopying && doc.allowsPrinting {
  3025. NSSound.beep()
  3026. return
  3027. }
  3028. _ = KMPasswordInputWindow.openWindow(window: self.view.window!, type: .owner, url: doc.documentURL) { [weak self] result, password in
  3029. if result == .cancel { /// 关闭
  3030. return
  3031. }
  3032. /// 解密成功
  3033. self?.hiddenSecureLimitTip()
  3034. self?.model.isSaveKeyChain = false
  3035. self?.listView.document?.unlock(withPassword: password)
  3036. }
  3037. }
  3038. public func hiddenSecureLimitTip() {
  3039. self.secureAlertView?.removeFromSuperview()
  3040. self.secureAlertView = nil
  3041. }
  3042. //MARK: - Form
  3043. func showFormAlertView() {
  3044. if (formAlertView == nil) {
  3045. formAlertView = KMFormAlertView()
  3046. formAlertView?.isCloseSecureView = self.secureAlertView != nil ? false : true
  3047. formAlertView?.showInView(self.listView)
  3048. } else {
  3049. self.removeFromAlertView()
  3050. }
  3051. }
  3052. func removeFromAlertView() {
  3053. formAlertView?.removeFromSuperview()
  3054. formAlertView = nil
  3055. }
  3056. override func mouseMoved(with event: NSEvent) {
  3057. self.view.window?.mouseMoved(with: event)
  3058. }
  3059. func savePageNumberIfNeed() {
  3060. if (KMPreferenceManager.shared.openLastUnlockedDocumentWhenAppStart) {
  3061. let scaleFactor = self.listView.scaleFactor ?? 0
  3062. if scaleFactor <= 0 {
  3063. return
  3064. }
  3065. if self.listView.document != nil {
  3066. KMPreferenceManager.shared.setPageNumber(self.listView.currentPageIndex, forKey: self.listView.document.documentURL.path)
  3067. KMPreferenceManager.shared.setPageScale(Float(self.listView.scaleFactor), forKey: self.listView.document.documentURL.path)
  3068. }
  3069. }
  3070. }
  3071. // MARK: - 显示合并窗口
  3072. public func showMergeWindow(url: URL? = nil, _ password: String?) {
  3073. DispatchQueue.main.async {
  3074. var documentURL = url
  3075. if documentURL == nil {
  3076. documentURL = self.listView.document?.documentURL
  3077. }
  3078. guard let _url = documentURL else { return }
  3079. guard let document = PDFDocument(url: _url) else { return }
  3080. self.mergeWindowController = KMMergeWindowController(document: document, password: password ?? "")
  3081. self.mergeWindowController!.oriDucumentUrl = self.listView.document?.documentURL
  3082. self.mergeWindowController!.pageIndex = self.listView.currentPageIndex
  3083. self.mergeWindowController!.cancelAction = { [unowned self] controller in
  3084. self.view.window?.endSheet(mergeWindowController!.window!)
  3085. }
  3086. self.mergeWindowController!.mergeAction = { [unowned self] controller, filePath in
  3087. self.view.window?.endSheet(mergeWindowController!.window!)
  3088. }
  3089. self.toolbarController.cancelSelected(KMToolbarToolMergeItemIdentifier)
  3090. self.view.window?.beginSheet(self.mergeWindowController!.window!)
  3091. }
  3092. }
  3093. // MARK: - 显示加密弹窗
  3094. public func showSecureWindow(_ url: URL) {
  3095. self.securityWindowController = KMSecurityWindowController(windowNibName: "KMSecurityWindowController")
  3096. guard let securityWindowController = securityWindowController else { return }
  3097. securityWindowController.documentURL = self.listView.document?.documentURL
  3098. securityWindowController.batchAction = { [unowned self] controller, files in
  3099. self.view.window?.endSheet((securityWindowController.window)!)
  3100. self.toolbarController.cancelSelected(KMToolbarToolCompressItemIdentifier)
  3101. let batchWindowController = KMBatchOperateWindowController.sharedWindowController
  3102. let batchOperateFile = KMBatchOperateFile(filePath: self.document?.documentURL.path ?? "", type: .AddPassword)
  3103. batchWindowController.switchToOperateType(.AddPassword, files: [batchOperateFile])
  3104. batchWindowController.window?.makeKeyAndOrderFront("")
  3105. }
  3106. securityWindowController.doneAction = { [unowned self] controller, options, attribute in
  3107. let openPanel = NSOpenPanel()
  3108. openPanel.canChooseFiles = false
  3109. openPanel.canChooseDirectories = true
  3110. openPanel.canCreateDirectories = true
  3111. openPanel.beginSheetModal(for: NSWindow.currentWindow()) { (result) in
  3112. if result == NSApplication.ModalResponse.OK {
  3113. for fileURL in openPanel.urls {
  3114. let document = CPDFDocument(url: self.document?.documentURL)
  3115. if document != nil {
  3116. document!.setDocumentAttributes(attribute)
  3117. let path = fileURL.path.stringByAppendingPathComponent(url.deletingPathExtension().lastPathComponent) + "_SetPassword" + "." + url.pathExtension
  3118. let success = document!.write(to: NSURL(fileURLWithPath: path) as URL, withOptions: options)
  3119. if success {
  3120. self.view.window?.endSheet((securityWindowController.window)!)
  3121. NSWorkspace.shared.activateFileViewerSelecting([URL(fileURLWithPath: path)])
  3122. }
  3123. }
  3124. }
  3125. }
  3126. }
  3127. }
  3128. securityWindowController.cancelAction = { [unowned self] controller in
  3129. self.view.window?.endSheet((securityWindowController.window)!)
  3130. }
  3131. NSWindow.currentWindow().beginSheet(securityWindowController.window!)
  3132. }
  3133. // MARK: - 保存文档
  3134. internal func needSaveDocument() -> Bool {
  3135. if (self.isPDFDocumentEdited) {
  3136. return self.isPDFDocumentEdited
  3137. }
  3138. if (self.needSave) {
  3139. return self.needSave
  3140. }
  3141. let document: KMMainDocument? = self.myDocument as? KMMainDocument
  3142. if (document?.isDocumentEdited == nil || document?.isDocumentEdited == false) {
  3143. return false
  3144. }
  3145. return true
  3146. }
  3147. internal func saveDocument(overlookDocumentIfEdited overlook: Bool = false) {
  3148. let document: KMMainDocument? = self.myDocument as? KMMainDocument
  3149. if (overlook) {
  3150. document?.save(nil)
  3151. return
  3152. }
  3153. if (self.isPDFDocumentEdited) {
  3154. self.clearIsPDFDocumentEdited()
  3155. self.needSave = false
  3156. document?.save(nil)
  3157. return
  3158. }
  3159. if (document?.isDocumentEdited == nil || document?.isDocumentEdited == false) {
  3160. return
  3161. }
  3162. document?.save(nil)
  3163. }
  3164. internal func asyncSaveDocument(overlookDocumentIfEdited overlook: Bool = false, callback:@escaping KMCommonBlock) {
  3165. let document: KMMainDocument? = self.myDocument as? KMMainDocument
  3166. if (overlook) {
  3167. DispatchQueue.main.async {
  3168. document?.save(nil)
  3169. callback()
  3170. }
  3171. return
  3172. }
  3173. if (self.isPDFDocumentEdited) {
  3174. self.clearIsPDFDocumentEdited()
  3175. self.needSave = false
  3176. DispatchQueue.main.async {
  3177. document?.save(nil)
  3178. callback()
  3179. }
  3180. return
  3181. }
  3182. if (document?.isDocumentEdited == nil || document?.isDocumentEdited == false) {
  3183. callback()
  3184. return
  3185. }
  3186. DispatchQueue.main.async {
  3187. document?.save(nil)
  3188. callback()
  3189. }
  3190. }
  3191. internal func saveDocumentWithProgressAlert(callback:@escaping KMCommonBlock) {
  3192. // 显示进度
  3193. AutoSaveManager.manager.isSaving = true
  3194. self.showProgressWindow(message: NSLocalizedString("Save", comment: "") + "PDF")
  3195. self.progressC?.maxValue = 3.0
  3196. self.progressC?.increment(by: 1.0)
  3197. // 保存文档
  3198. self.asyncSaveDocument { [weak self] params in
  3199. // 执行进度 [假进度]
  3200. self?.progressC?.increment(by: 1.0)
  3201. self?.progressC?.increment(by: 1.0)
  3202. DispatchQueue.main.asyncAfter(deadline: .now()+0.1) {
  3203. // 隐藏进度
  3204. self?.hiddenProgressWindow()
  3205. DispatchQueue.main.asyncAfter(deadline: .now()+1) {
  3206. AutoSaveManager.manager.isSaving = false
  3207. }
  3208. // 回调
  3209. callback()
  3210. }
  3211. }
  3212. }
  3213. func SaveTempPDFDocumentToURLPath(tempPath: String) {
  3214. self.document?.write(toFile: tempPath)
  3215. }
  3216. // MARK: - 定时保存
  3217. func addAutoSaveEvent() {
  3218. if (self.autoSaveTimer != nil) {
  3219. self.autoSaveTimer?.invalidate()
  3220. self.autoSaveTimer = nil
  3221. }
  3222. if self.document != nil {
  3223. self.autoSaveTimer = Timer.scheduledTimer(withTimeInterval: AutoSaveManager.manager.timeInterval * 60, repeats: true, block: { [weak self] timer in
  3224. self?.autoSaveTimerAction(timer)
  3225. })
  3226. }
  3227. self.checkAutoSaveInfo()
  3228. }
  3229. func checkAutoSaveInfo() {
  3230. guard let cnt = AutoSaveManager.manager.autoSavePaths?.count, cnt > 0 else {
  3231. return
  3232. }
  3233. if AutoSaveManager.manager.autoSaveAlertShow {
  3234. return
  3235. }
  3236. AutoSaveManager.manager.autoSaveDidEndAction = false
  3237. AutoSaveManager.manager.autoSaveAlertShow = true
  3238. let blockSaveWindow = AutoSavePopController()
  3239. blockSaveWindow.cancelHandle = { [weak self] windowController in
  3240. AutoSaveManager.manager.autoSaveDidEndAction = true
  3241. AutoSaveManager.manager.clearCache()
  3242. self?.km_quick_endSheet()
  3243. }
  3244. blockSaveWindow.confirmHandle = { [weak self] windowController in
  3245. self?.km_quick_endSheet()
  3246. self?.saveAutoSaveInfo()
  3247. }
  3248. self.km_beginSheet(windowC: blockSaveWindow)
  3249. }
  3250. func saveAutoSaveInfo() {
  3251. let openPanel = NSOpenPanel()
  3252. openPanel.canChooseDirectories = true
  3253. openPanel.canChooseFiles = false
  3254. openPanel.allowsMultipleSelection = false
  3255. let win = NSApp.keyWindow != nil ? NSApp.keyWindow : self.view.window
  3256. openPanel.beginSheetModal(for: win!) { result in
  3257. if (result == .OK) {
  3258. let folderPath = openPanel.url?.path ?? openPanel.url?.absoluteString
  3259. for path in AutoSaveManager.manager.opendPaths ?? [] {
  3260. let _path = path as? String
  3261. var newPath = "\(folderPath ?? "")/\(_path?.lastPathComponent ?? "")"
  3262. newPath = self.getValidFilePath(newPath)
  3263. do {
  3264. try FileManager.default.moveItem(atPath: _path ?? "", toPath: newPath)
  3265. } catch {
  3266. NSWorkspace.shared.activateFileViewerSelecting([URL(fileURLWithPath: newPath)])
  3267. }
  3268. }
  3269. AutoSaveManager.manager.clearCache()
  3270. }
  3271. AutoSaveManager.manager.autoSaveDidEndAction = true
  3272. }
  3273. }
  3274. func autoSaveTimerAction(_ timer: Timer) {
  3275. if (self.document == nil || self.listView.document?.documentURL.path == nil) {
  3276. return
  3277. }
  3278. if AutoSaveManager.manager.autoSaveDidEndAction == false {
  3279. //防止提示弹窗出现后,未进行任何操作又进入自动保存的机制
  3280. return
  3281. }
  3282. if let data = self.document?.isLocked, data {
  3283. return
  3284. }
  3285. if AutoSaveManager.manager.autoSaveEnabled == false {
  3286. return
  3287. }
  3288. let documentArray = NSDocumentController.shared.documents
  3289. var didFileEdit = false
  3290. for doc in documentArray {
  3291. if doc.fileURL?.path == self.document?.documentURL.path {
  3292. didFileEdit = doc.isDocumentEdited
  3293. break
  3294. }
  3295. }
  3296. if (didFileEdit == false) {
  3297. return
  3298. }
  3299. AutoSaveManager.manager.isSaving = true
  3300. let savePath = AutoSaveManager.manager.autoSaveWithPath(self.listView.document?.documentURL.path ?? "")
  3301. if (!self.document!.isLocked) {
  3302. self.document?.write(to: URL(fileURLWithPath: savePath))
  3303. }
  3304. DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {
  3305. AutoSaveManager.manager.isSaving = false
  3306. }
  3307. }
  3308. func removeAutoSaveInfo() {
  3309. if self.autoSaveTimer != nil {
  3310. self.autoSaveTimer?.invalidate()
  3311. self.autoSaveTimer = nil
  3312. }
  3313. if AutoSaveManager.manager.autoSaveDidEndAction == false {
  3314. //防止提示弹窗出现后,未进行任何操作又进入自动保存的机制
  3315. return
  3316. }
  3317. if AutoSaveManager.manager.autoSaveEnabled == false {
  3318. return
  3319. }
  3320. if self.document == nil || self.listView.document?.documentURL.path == nil {
  3321. return
  3322. }
  3323. AutoSaveManager.manager.removeAutoSavePath(self.listView.document?.documentURL.path ?? "")
  3324. }
  3325. // MARK: - 选择 PDFDisplay 模式
  3326. public func setPDFDisplay(pdfViewMode: CPDFDisplayViewMode) {
  3327. listView.setDisplay(pdfViewMode)
  3328. }
  3329. // MARK: - 选择缩放模式
  3330. @objc public func selectZoom(_ type: KMPDFZoomType) {
  3331. switch type {
  3332. case .width:
  3333. self.listView.autoScales = true
  3334. break
  3335. case .fit:
  3336. if let pageHeight = self.listView.currentPage()?.size.height, pageHeight > 0 {
  3337. let pdfviewHeight = self.listView.bounds.size.height
  3338. self.listView.scaleFactor = pdfviewHeight/pageHeight
  3339. self.listView.autoScales = false
  3340. }
  3341. break
  3342. case .actualSize:
  3343. if self.listView.scaleFactor != 1.0 {
  3344. self.listView.scaleFactor = 1.0
  3345. self.listView.autoScales = false
  3346. }
  3347. break
  3348. }
  3349. }
  3350. internal func createPdf(index:Int) {
  3351. }
  3352. // MARK - Event 监听
  3353. private func addEventMonitor() {
  3354. if (self.eventMonitor != nil) {
  3355. self.removeEventMonitor()
  3356. }
  3357. self.eventMonitor = NSEvent.addLocalMonitorForEvents(matching: [.scrollWheel, .leftMouseDown, .leftMouseUp]) { [weak self] event in
  3358. if (event.type == .scrollWheel && event.modifierFlags.contains(.option)) { // Alt + 鼠标滚轮
  3359. self?.listView.magnifyWheel(event)
  3360. return nil
  3361. } else if event.type == .leftMouseDown {
  3362. let point = event.locationInView(self?.listView ?? NSView())
  3363. let presentationDrawView = self?.listView.presentationDrawView
  3364. if let data = self?.interactionMode, data == .presentation,CGRectContainsPoint(self?.listView.frame ?? .zero, point),presentationDrawView?.isHidden == true { // 幻灯片模式下
  3365. if point.x >= (self?.listView.frame.maxX ?? 0) / 2 {
  3366. let can = self?.listView.canGoToNextPage() ?? false
  3367. if can {
  3368. self?.listView.goToNextPage(nil)
  3369. }
  3370. } else {
  3371. let can = self?.listView.canGoToPreviousPage() ?? false
  3372. if can {
  3373. self?.listView.goToPreviousPage(nil)
  3374. }
  3375. }
  3376. return nil
  3377. }
  3378. }
  3379. return event
  3380. }
  3381. }
  3382. func addKeyEventMonitor() {
  3383. if (self.keyEventMonitor != nil) {
  3384. self.removeKeyEventMonitor()
  3385. }
  3386. keyEventMonitor = NSEvent.addLocalMonitorForEvents(matching: .keyDown) { [weak self] event in
  3387. if event.keyCode == 53 {
  3388. if let data = self?.interactionMode, data == .presentation { // 幻灯片模式下
  3389. self?.exitFullScreen()
  3390. return nil
  3391. }
  3392. if self?.listView.toolMode == .editPDFToolMode {
  3393. if self != nil {
  3394. //使用editingSelectionString获取内容文字
  3395. if self!.listView.editingAreas() != nil {
  3396. if self!.listView.editingAreas().count > 0 && self!.listView.isEditable() {
  3397. self!.listView.clearEditingSelectCharItem()
  3398. } else if self!.listView.editingAreas().count > 0 {
  3399. if self?.listView.annotationType == .addImage ||
  3400. self?.listView.annotationType == .addText {
  3401. let textItem = self?.toolbarController.findItem(KMToolbarAddTextEditPDFItemIdentifier)
  3402. let imageItem = self?.toolbarController.findItem(KMToolbarAddImageEditPDFItemIdentifier)
  3403. textItem?.isSelected = false
  3404. imageItem?.isSelected = false
  3405. }
  3406. self?.rightSideViewController.isHidden = true
  3407. self?.listView.endEditIsRemoveBlock(with: self!.listView.editingAreas().first as? CPDFEditArea)
  3408. self?.listView.updateEditing([])
  3409. self?.listView.isEditImage = false
  3410. self?.listView.setNeedsDisplayPageViewFor(self!.listView.currentPage())
  3411. if self?.listView.annotationType == .addImage {
  3412. self?.listView.change([.text, .image])
  3413. }
  3414. self?.listView.annotationType = .editTextImage
  3415. self?.closeRightPane()
  3416. } else if(self?.listView.annotationType == .addImage || self!.listView.annotationType == .addText) {
  3417. if self?.listView.annotationType == .addImage ||
  3418. self?.listView.annotationType == .addText {
  3419. let textItem = self?.toolbarController.findItem(KMToolbarAddTextEditPDFItemIdentifier)
  3420. let imageItem = self?.toolbarController.findItem(KMToolbarAddImageEditPDFItemIdentifier)
  3421. textItem?.isSelected = false
  3422. imageItem?.isSelected = false
  3423. }
  3424. self?.rightSideViewController.isHidden = true
  3425. self?.listView.setShouAddEdit([])
  3426. self?.listView.change([.text, .image])
  3427. self?.listView.annotationType = .editTextImage
  3428. self?.closeRightPane()
  3429. }
  3430. } else {
  3431. if self?.listView.annotationType == .addImage ||
  3432. self?.listView.annotationType == .addText {
  3433. let textItem = self?.toolbarController.findItem(KMToolbarAddTextEditPDFItemIdentifier)
  3434. let imageItem = self?.toolbarController.findItem(KMToolbarAddImageEditPDFItemIdentifier)
  3435. textItem?.isSelected = false
  3436. imageItem?.isSelected = false
  3437. }
  3438. }
  3439. }
  3440. }
  3441. } else {
  3442. if let data = self?.interactionMode, data == .presentation { // 幻灯片模式下
  3443. self?.listView.keyDown(with: event)
  3444. return nil
  3445. } else {
  3446. let cmd = event.modifierFlags.contains(.command)
  3447. let shift = event.modifierFlags.contains(.shift)
  3448. if event.keyCode == 6 { // z
  3449. let editPDFIng = self?.editPDFHanddler.isEditing ?? false
  3450. if cmd && shift { // 恢复
  3451. let can = self?.editPDFHanddler.listView?.canEditTextRedo() ?? false
  3452. if can == false {
  3453. return event
  3454. }
  3455. if editPDFIng {
  3456. _ = CustomAlertView.alertView(message: NSLocalizedString("Redo", comment: ""), fromView: self!.view, withStyle: .black)
  3457. }
  3458. } else if cmd { // 撤回
  3459. let can = self?.editPDFHanddler.listView?.canEditTextUndo() ?? false
  3460. if can == false {
  3461. return event
  3462. }
  3463. if editPDFIng {
  3464. _ = CustomAlertView.alertView(message: NSLocalizedString("Undo", comment: ""), fromView: self!.view, withStyle: .black)
  3465. }
  3466. }
  3467. }
  3468. }
  3469. }
  3470. return event
  3471. }
  3472. }
  3473. func removeKeyEventMonitor() {
  3474. if (self.keyEventMonitor != nil) {
  3475. KMPrint("removeKeyEventMonitor 已移除事件监听")
  3476. NSEvent.removeMonitor(self.keyEventMonitor as Any)
  3477. self.keyEventMonitor = nil
  3478. }
  3479. }
  3480. private func removeEventMonitor() {
  3481. if (self.eventMonitor != nil) {
  3482. KMPrint("已移除事件监听")
  3483. NSEvent.removeMonitor(self.eventMonitor as Any)
  3484. self.eventMonitor = nil
  3485. }
  3486. }
  3487. // MARK: - Tools
  3488. func pdfViewCanHorizontalScroll() -> Bool {
  3489. let scroll = self.listView.scroll()
  3490. if (scroll == nil) {
  3491. return false
  3492. }
  3493. return scroll?.horizontalScroller?.isHidden == nil ? false : !(scroll!.horizontalScroller!.isHidden)
  3494. }
  3495. func pdfViewCanVerticalScroll() -> Bool {
  3496. let scroll = self.listView.scroll()
  3497. if (scroll == nil) {
  3498. return false
  3499. }
  3500. return scroll?.verticalScroller?.isHidden == nil ? false : !(scroll!.verticalScroller!.isHidden)
  3501. }
  3502. // MARK: - Public Methods
  3503. // 清理数据 [eg. 通知]
  3504. public func clearData() {
  3505. KMThumbnailCache.shared.clearCache()
  3506. self.removeNotifications()
  3507. if (self.listView.spellingTag() > 0) {
  3508. NSSpellChecker.shared.closeSpellDocument(withTag: self.listView.spellingTag())
  3509. }
  3510. self.removeAutoSaveInfo()
  3511. self.myDocument = nil
  3512. }
  3513. public func clearSecureOptions() {
  3514. self._secureOptions = nil
  3515. self.documentAttribute = nil
  3516. }
  3517. public func recordRemoveSecureFlag() {
  3518. self._removeSecureFlag = true
  3519. self.clearSecureOptions()
  3520. self.recordIsPDFDocumentEdited(type: .removePassword)
  3521. self._needSave = true
  3522. }
  3523. public func clearRemoveSecureFlag() {
  3524. self._removeSecureFlag = false
  3525. }
  3526. public func clearSaveWatermarkFlag() {
  3527. km_synchronized(self) {
  3528. self._saveWatermarkFlag = false
  3529. }
  3530. }
  3531. public func recordIsPDFDocumentEdited(type: KMSubscribeWaterMarkType = .none) {
  3532. km_synchronized(self) {
  3533. self.model.isPDFDocumentEdited = true
  3534. if type == .editText || type == .editImage {
  3535. self.leftSideViewController.updateThumbnail(at: self.listView.currentPageIndex)
  3536. }
  3537. if let _document = self.myDocument {
  3538. KMTools.setDocumentEditedState(document: _document)
  3539. }
  3540. }
  3541. }
  3542. public func clearIsPDFDocumentEdited() {
  3543. km_synchronized(self) {
  3544. self.model.isPDFDocumentEdited = false
  3545. }
  3546. }
  3547. func showSnapshots(setups: NSArray?) {
  3548. if self.listView.document != nil {
  3549. for setup in setups ?? [] {
  3550. let swc = KMSnapshotWindowController()
  3551. swc.delegate = self
  3552. swc.setPdfDocument(self.listView.document, setup: setup as? NSDictionary)
  3553. swc.setForceOnTop(self.interactionMode != .normal)
  3554. self.myDocument?.addWindowController(swc)
  3555. }
  3556. }
  3557. }
  3558. func dealDocumentDidLoaded() {
  3559. self.removeBackgroundMaskView()
  3560. if (!self.listView.document!.allowsCopying || !self.listView.document!.allowsPrinting) {
  3561. self.showSecureLimitTip()
  3562. }
  3563. if self.model.needConvertNotes {
  3564. self.showConvertNotesProgress()
  3565. }
  3566. if (self._documentFirstLoad) {
  3567. self.checkShouldAutoOpenLeftVC()
  3568. if (KMPreferenceManager.shared.openLastUnlockedDocumentWhenAppStart) {
  3569. let pageNumber = KMPreferenceManager.shared.getPageNumber(forKey: self.listView.document?.documentURL.path ?? "")
  3570. let pageScale = KMPreferenceManager.shared.getPageScale(forKey: self.listView.document?.documentURL.path ?? "")
  3571. if (pageScale != nil) {
  3572. self.listView.scaleFactor = CGFloat(pageScale!)
  3573. }
  3574. if (pageNumber != nil && pageNumber! >= 0 && pageNumber! < (self.listView.document?.pageCount ?? 0)) {
  3575. self.listView.go(toPageIndex: pageNumber!, animated: false)
  3576. } else {
  3577. self._goToFirstPageForFristAppear()
  3578. }
  3579. } else {
  3580. self._goToFirstPageForFristAppear()
  3581. }
  3582. self._documentFirstLoad = false
  3583. }
  3584. }
  3585. func tabViewIsDragging() -> Bool {
  3586. let level = self.view.window?.level ?? .normal
  3587. return level == .floating
  3588. }
  3589. // MARK: - Noti Actions
  3590. internal func documentDidUnlockNotification(_ sender: Notification) {
  3591. if (self.listView.document != nil && self.listView.document.isEqual(to: sender.object)) {
  3592. if (self.myDocument == nil) {
  3593. return
  3594. }
  3595. if (self.listView.document.allowsPrinting && self.listView.document.allowsCopying) {
  3596. self.hiddenSecureLimitTip()
  3597. }
  3598. let isUnlockFromKeychain = (self.myDocument as? KMMainDocument)?.isUnlockFromKeychain ?? false
  3599. if (isUnlockFromKeychain || self.model.isSaveKeyChain == false) {
  3600. return
  3601. }
  3602. let type = KMPreferenceManager.shared.savePasswordType
  3603. if (type == .never) {
  3604. return
  3605. }
  3606. if (type == .always) {
  3607. self.myDocument?.savePasswordInKeychain(self.listView.document.password, self.listView.document)
  3608. return
  3609. }
  3610. // 保存到钥匙串
  3611. let alert = NSAlert()
  3612. alert.messageText = NSLocalizedString("Remember Password?", comment: "")
  3613. alert.informativeText = NSLocalizedString("Do you want to save this password in your Keychain?", comment: "")
  3614. alert.addButton(withTitle: NSLocalizedString("Yes", comment: ""))
  3615. alert.addButton(withTitle: NSLocalizedString("No", comment: ""))
  3616. if (alert.runModal() == .alertFirstButtonReturn) { // 保存密码
  3617. self.myDocument?.savePasswordInKeychain(self.listView.document.password, self.listView.document)
  3618. return
  3619. }
  3620. }
  3621. }
  3622. func annotationsAttributeHasChange(_ sender: Notification) {
  3623. guard let dict = sender.object as? [String : Any] else {
  3624. return
  3625. }
  3626. if let anno = dict["object"] as? CPDFAnnotation {
  3627. let value = dict["keyPath"] as? String ?? ""
  3628. let didEnd = dict["didEnd"] as? Bool ?? false
  3629. if didEnd {
  3630. if value == CPDFAnnotationBoundsKey {
  3631. if anno is CPDFSquareAnnotation || anno is CPDFCircleAnnotation {
  3632. anno.contents = anno.page?.string(for: anno.bounds) ?? ""
  3633. }
  3634. }
  3635. if anno.km_isMeasure() && anno.contents == nil {
  3636. anno.contents = anno.string() ?? ""
  3637. }
  3638. self.leftSideViewController.refreshUIForAnnoAttributeDidChange(anno, attributes: ["keyPath" : value])
  3639. } else {
  3640. if value != CPDFAnnotationBoundsKey && value != CPDFAnnotationStartPointKey && value != CPDFAnnotationEndPointKey && value != CPDFAnnotationPathsKey { // 改变bounds(箭头、直线注释 开始点和结束点, 手绘注释的paths)的操作会卡顿,比如移动
  3641. self.leftSideViewController.refreshUIForAnnoAttributeDidChange(anno, attributes: ["keyPath" : value])
  3642. }
  3643. }
  3644. }
  3645. }
  3646. internal func applicationWillTerminateNotification(_ sender: Notification) {
  3647. self.savePageNumberIfNeed()
  3648. self.saveDocument()
  3649. }
  3650. func CPDFDocumentPageCountChangedNotification(_ sender: Notification) {
  3651. self.leftSideViewController.refreshUIForAnnoAttributeDidChange(nil, attributes: nil)
  3652. }
  3653. func CEditPDFToolModeChangeStateUnkownNotification(_ sender: Notification) {
  3654. var editSelectd = false
  3655. if (self.listView.annotationType == .addText || self.listView.annotationType == .addImage) && self.listView.toolMode == .editPDFToolMode {
  3656. editSelectd = true
  3657. }
  3658. if self.listView.toolMode == .editPDFToolMode {
  3659. if editSelectd {
  3660. self.toolbarController.cancelSelected(KMToolbarAddTextEditPDFItemIdentifier)
  3661. }
  3662. }
  3663. }
  3664. @objc func handlePageChangedNotification(_ sender: Notification) {
  3665. if self.mwcFlags.isSwitchingFullScreen > 0 {
  3666. return
  3667. }
  3668. let page = self.listView.currentPage()
  3669. let pageIndex = page?.pageIndex() ?? 0
  3670. self.leftSideViewController.thumb_selectRowIndexsIfNeed(IndexSet(integer: IndexSet.Element(pageIndex)))
  3671. self.leftSideViewController.thumbnailTableView.needsDisplay = true
  3672. self.leftSideViewController.tocOutlineView.needsDisplay = true
  3673. }
  3674. @objc func handleDisplayBoxChangedNotification(_ sender: Notification) {
  3675. self.leftSideViewController.reloadThumbnailDataIfNeed()
  3676. }
  3677. }