KMMainViewController.swift 222 KB

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