KMMainViewController.swift 237 KB

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