KMMainViewController.swift 167 KB

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