KMMainViewController.swift 192 KB

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