KMMainViewController.swift 184 KB

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