KMMainViewController.swift 188 KB

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