KMMainViewController.swift 215 KB

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