KMMainViewController.swift 186 KB

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