KMMainViewController.swift 226 KB

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