KMMainViewController.swift 220 KB

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