KMMainViewController.swift 233 KB

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