KMMainViewController.swift 226 KB

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