KMMainViewController.swift 206 KB

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