KMMainViewController.swift 185 KB

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