KMMainViewController.swift 174 KB

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