KMMainViewController.swift 206 KB

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