KMMainViewController.swift 184 KB

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