KMLeftSideViewController.swift 61 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298
  1. //
  2. // KMLeftSideViewController.swift
  3. // PDF Master
  4. //
  5. // Created by lxy on 2022/10/10.
  6. //
  7. import Cocoa
  8. enum KMLeftSidePaneState: Int {
  9. case thumbnail = 1
  10. case outline
  11. case noteList
  12. case snapshotList
  13. case find
  14. }
  15. enum KMFindPaneState: Int {
  16. case singular = 1
  17. case grouped
  18. }
  19. @objc protocol KMLeftSideViewControllerDelegate {
  20. @objc optional func controlStateChange(_ obj: KMLeftSideViewController,show:Bool)
  21. @objc optional func enterEditMode(_ obj: KMLeftSideViewController, _ pages: [Int])
  22. @objc optional func searchAction(searchString:String, isCase:Bool)
  23. @objc optional func controller(_ controller: KMLeftSideViewController, dispayDidChange dispay: KMPDFDisplayType)
  24. @objc optional func controller(controller: KMLeftSideViewController, itemClick item: Any?, itemKey: KMItemKey, params: Any?)
  25. @objc optional func controller(controller: KMLeftSideViewController, bookMarkDidChange bookMarks: [KMBookMarkItem])
  26. @objc optional func controller(controller: KMLeftSideViewController, rotateType: KMRotateType)
  27. }
  28. class KMLeftSideViewController: KMSideViewController {
  29. // var listView : CPDFListView!
  30. // @IBOutlet weak var leftTableview: NSTableView!
  31. // @IBOutlet weak var contentBox: NSBox!
  32. // @IBOutlet weak var leftBox: NSBox!
  33. lazy var thumbnailViewController : KMThumbnailViewController = {
  34. let thumbnailViewController = KMThumbnailViewController()
  35. return thumbnailViewController
  36. }()
  37. lazy var outlineViewController : KMOutlineViewController = {
  38. let outlineViewController = KMOutlineViewController()
  39. return outlineViewController
  40. }()
  41. lazy var annotationViewController : KMAnnotationViewController = {
  42. let annotationViewController = KMAnnotationViewController()
  43. return annotationViewController
  44. }()
  45. lazy var bookViewController : KMBookMarkViewController = {
  46. let bookViewController = KMBookMarkViewController()
  47. bookViewController.bookMarkDidChange = { [unowned self] (controller, bookMarks) in
  48. self.delegate?.controller?(controller: self, bookMarkDidChange: bookMarks)
  49. }
  50. return bookViewController
  51. }()
  52. lazy var fromViewController : KMFromViewController = {
  53. let fromViewController = KMFromViewController()
  54. return fromViewController
  55. }()
  56. lazy var searchViewController : KMSearchViewController = {
  57. let searchViewController = KMSearchViewController()
  58. return searchViewController
  59. }()
  60. lazy var signatureViewController : KMSignatureViewController = {
  61. let signatureViewController = KMSignatureViewController()
  62. return signatureViewController
  63. }()
  64. lazy var panelSetViewController : KMPDFViewPanelSetViewController = {
  65. let panelSetViewController = KMPDFViewPanelSetViewController()
  66. // panelSetViewController.delegate = self
  67. return panelSetViewController
  68. }()
  69. var dataSource : [KMLeftMethodMode] = [KMLeftMethodMode]()
  70. var type : KMLeftMethodMode = KMLeftMethodMode()
  71. var isShowPanel : Bool = false
  72. var norImage : [String] = []
  73. var selectImage : [String] = []
  74. var mainVC: KMMainViewController?
  75. //select page
  76. var selectPages: [Int]?
  77. open weak var delegate: KMLeftSideViewControllerDelegate?
  78. override var nibName: NSNib.Name? {
  79. return "LeftSideView"
  80. }
  81. convenience init(type : KMLeftMethodMode) {
  82. self.init()
  83. self.type = type
  84. }
  85. override func viewDidLoad() {
  86. super.viewDidLoad()
  87. // self.leftBox.backgroundColor(NSColor.km_init(hex: "#F7F8FA"))
  88. // self.leftTableview.backgroundColor(NSColor.km_init(hex: "#F7F8FA"))
  89. // self.leftTableview.border(NSColor.km_init(hex: "#EDEEF0"),1 , 0)
  90. // self.addMenuTitle()
  91. // self.refreshShowMethod()
  92. DistributedNotificationCenter.default().addObserver(self, selector: #selector(_themeChanged), name: NSApplication.interfaceThemeChangedNotification, object: nil)
  93. }
  94. func showPanelView(show: Bool) {
  95. self.isShowPanel = show
  96. if show {
  97. // self.panelSetViewController.listView = self.listView
  98. // self.panelSetViewController.view.frame = self.view.frame
  99. // self.view.addSubview(self.panelSetViewController.view)
  100. // self.panelSetViewController.reloadListViewModel()
  101. // self.panelSetViewController.view.autoresizingMask = [.height]
  102. } else {
  103. // self.contentBox.isHidden = false
  104. // self.panelSetViewController.view.removeFromSuperview()
  105. // if self.type.methodType == .None {
  106. // self.delegate?.controlStateChange?(self, show: false)
  107. // }
  108. }
  109. }
  110. func refreshMethodType(methodType: BotaType) {
  111. if (self.isShowPanel) {
  112. self.showPanelView(show: false)
  113. return
  114. }
  115. let newType = KMLeftMethodMode()
  116. var show = true
  117. if self.type.methodType != methodType {
  118. newType.methodType = methodType
  119. }
  120. if self.type.methodType == methodType {
  121. show = false
  122. }
  123. self.type = newType;
  124. // self.refreshShowMethod()
  125. self.delegate?.controlStateChange?(self,show:show)
  126. }
  127. //
  128. // private func updateViewButtonState() {
  129. // switch self.type.methodType {
  130. // case .None: do {
  131. //// self.contentBox.contentView = NSView()
  132. // self.delegate?.controlStateChange?(self,show:false)
  133. // }
  134. // break
  135. // case .Thumbnail: do {
  136. // self.thumbnailViewController.listView = self.listView
  137. // self.thumbnailViewController.delegate = self
  138. //// self.contentBox.contentView = self.thumbnailViewController.view
  139. //// self.thumbnailViewController.reloadData()
  140. // }
  141. // break
  142. // case .Outline: do {
  143. // self.outlineViewController.listView = self.listView
  144. //// self.contentBox.contentView = self.outlineViewController.view
  145. // }
  146. // break
  147. // case .BookMark: do {
  148. // self.bookViewController.listView = self.listView
  149. //// self.contentBox.contentView = self.bookViewController.view
  150. // self.bookViewController.reloadData()
  151. // }
  152. // break
  153. // case .Annotation: do {
  154. // self.annotationViewController.listView = self.listView
  155. //// self.contentBox.contentView = self.annotationViewController.view
  156. //// self.annotationViewController.reloadData()
  157. // }
  158. // break
  159. // case .From: do {
  160. // self.fromViewController.listView = self.listView
  161. //// self.contentBox.contentView = self.fromViewController.view
  162. // self.fromViewController.reloadData()
  163. // }
  164. // break
  165. // case .Search: do {
  166. // self.searchViewController.listView = self.listView
  167. // self.searchViewController.delegate = self
  168. //// self.contentBox.contentView = self.searchViewController.view
  169. //// self.searchViewController.reloadData()
  170. // }
  171. // break
  172. // case .Signature: do {
  173. // self.signatureViewController.listView = self.listView
  174. //// self.contentBox.contentView = self.signatureViewController.view
  175. // self.signatureViewController.reloadData()
  176. // }
  177. // break
  178. // }
  179. // }
  180. // func refreshShowMethod() {
  181. // self.dataSource = [KMLeftMethodMode]()
  182. // norImage = []
  183. // selectImage = []
  184. // if KMBOTAManagerClass.shard.getMethodShow(key: thumbnailMethodKey) {
  185. // let mode = KMLeftMethodMode()
  186. // mode.methodName = thumbnailMethodKey
  187. // mode.methodType = .Thumbnail
  188. // self.dataSource.insert(mode, at: self.dataSource.count)
  189. // norImage.append("KMImageNameSidebarThumbailNor")
  190. // selectImage.append("KMImageNameSidebarThumbailSelect")
  191. // }
  192. // if KMBOTAManagerClass.shard.getMethodShow(key: outlineMethodKey) {
  193. // let mode = KMLeftMethodMode()
  194. // mode.methodName = outlineMethodKey
  195. // mode.methodType = .Outline
  196. // self.dataSource.insert(mode, at: self.dataSource.count)
  197. // norImage.append("KMImageNameSidebarOutlineNor")
  198. // selectImage.append("KMImageNameSidebarOutlineSelect")
  199. // }
  200. // if KMBOTAManagerClass.shard.getMethodShow(key: bookMarkMethodKey) {
  201. // let mode = KMLeftMethodMode()
  202. // mode.methodName = bookMarkMethodKey
  203. // mode.methodType = .BookMark
  204. // self.dataSource.insert(mode, at: self.dataSource.count)
  205. // norImage.append("KMImageNameSidebarBookMarkNor")
  206. // selectImage.append("KMImageNameSidebarBookMarkSelect")
  207. // }
  208. // if KMBOTAManagerClass.shard.getMethodShow(key: anntationMethodKey) {
  209. // let mode = KMLeftMethodMode()
  210. // mode.methodName = anntationMethodKey
  211. // mode.methodType = .Annotation
  212. // self.dataSource.insert(mode, at: self.dataSource.count)
  213. // norImage.append("KMImageNameSidebarAnnotationNor")
  214. // selectImage.append("KMImageNameSidebarAnnotationSelect")
  215. // }
  216. // if KMBOTAManagerClass.shard.getMethodShow(key: searchMethodKey) {
  217. // let mode = KMLeftMethodMode()
  218. // mode.methodName = searchMethodKey
  219. // mode.methodType = .Search
  220. // self.dataSource.insert(mode, at: self.dataSource.count)
  221. // norImage.append("KMImageNameSidebarSearchNor")
  222. // selectImage.append("KMImageNameSidebarSearchSelect")
  223. // }
  224. //// if KMBOTAManagerClass.shard.getMethodShow(key: formMethodKey) {
  225. //// let mode = KMLeftMethodMode()
  226. //// mode.methodName = formMethodKey
  227. //// mode.methodType = .From
  228. //// self.dataSource.insert(mode, at: self.dataSource.count)
  229. //// }
  230. //// if KMBOTAManagerClass.shard.getMethodShow(key: signatureMethodKey) {
  231. //// let mode = KMLeftMethodMode()
  232. //// mode.methodName = signatureMethodKey
  233. //// mode.methodType = .Signature
  234. //// self.dataSource.insert(mode, at: self.dataSource.count)
  235. //// }
  236. // var isConstant = false
  237. // for source in dataSource {
  238. // if self.type.methodType == source.methodType {
  239. // isConstant = true
  240. // }
  241. // }
  242. // if(!isConstant) {
  243. // self.type = KMLeftMethodMode()
  244. // }
  245. //// self.leftTableview.reloadData()
  246. // var typeIndex = -1
  247. // for (index,value) in self.dataSource.enumerated() {
  248. // if value.methodType == self.type.methodType {
  249. // typeIndex = index
  250. // }
  251. // }
  252. //
  253. //// self.leftTableview.selectRowIndexes([typeIndex], byExtendingSelection: true)
  254. // if self.dataSource.count > 0 && typeIndex >= 0 {
  255. // self.type = self.dataSource[typeIndex]
  256. // }
  257. // self.updateViewButtonState()
  258. //
  259. // }
  260. //
  261. //MARK: menu
  262. // private func addMenuTitle() {
  263. // let menus : NSMenu = NSMenu(title: "")
  264. //
  265. // let addItem = self.menuItemWithTitle(title: NSLocalizedString("Thumbnails", comment: ""),type:thumbnailMethodKey,action: #selector(renameBookAction),tag: 1)
  266. // let outlineItem = self.menuItemWithTitle(title: NSLocalizedString("Outline", comment: ""),type:outlineMethodKey,action: #selector(renameBookAction),tag: 2)
  267. // let bookItem = self.menuItemWithTitle(title: NSLocalizedString("Bookmarks", comment: ""), type:bookMarkMethodKey,action: #selector(renameBookAction),tag: 3)
  268. // let annationItem = self.menuItemWithTitle(title: NSLocalizedString("Annotations", comment: ""), type:anntationMethodKey,action: #selector(renameBookAction),tag: 4)
  269. // let searchItem = self.menuItemWithTitle(title: NSLocalizedString("Search", comment: ""), type:searchMethodKey,action: #selector(renameBookAction),tag: 5)
  270. //// let formItem = self.menuItemWithTitle(title: NSLocalizedString("域", comment: ""), type:formMethodKey,action: #selector(renameBookAction),tag: 6)
  271. //// let signatureItem = self.menuItemWithTitle(title: NSLocalizedString("签名", comment: ""), type:signatureMethodKey,action: #selector(renameBookAction),tag: 7)
  272. //
  273. // menus.addItem(addItem)
  274. // menus.addItem(outlineItem)
  275. // menus.addItem(bookItem)
  276. // menus.addItem(annationItem)
  277. // menus.addItem(searchItem)
  278. //// menus.addItem(formItem)
  279. //// menus.addItem(signatureItem)
  280. //// self.leftTableview.menu = menus
  281. // }
  282. // func menuItemWithTitle(title:String,type:String,action:Selector?,tag:Int) -> NSMenuItem {
  283. // let menuItem = NSMenuItem.init(title: title as String, action: action, keyEquivalent: "")
  284. // menuItem.target = self
  285. // menuItem.tag = tag
  286. // if KMBOTAManagerClass.shard.getMethodShow(key: type) {
  287. // menuItem.state = NSControl.StateValue.on
  288. // } else {
  289. // menuItem.state = NSControl.StateValue.off
  290. // }
  291. // return menuItem
  292. // }
  293. // @objc func renameBookAction(menuItem:NSMenuItem) {
  294. // var show = true
  295. // if menuItem.state == NSControl.StateValue.on {
  296. // menuItem.state = NSControl.StateValue.off
  297. // show = false
  298. // } else {
  299. // menuItem.state = NSControl.StateValue.on
  300. // show = true
  301. // }
  302. // switch menuItem.tag {
  303. // case 1: do {
  304. // KMBOTAManagerClass.shard.setLeftMethod(show: show, key: thumbnailMethodKey)
  305. // }
  306. // case 2: do {
  307. // KMBOTAManagerClass.shard.setLeftMethod(show: show, key: outlineMethodKey)
  308. // }
  309. // case 3: do {
  310. // KMBOTAManagerClass.shard.setLeftMethod(show: show, key: bookMarkMethodKey)
  311. // }
  312. // case 4: do {
  313. // KMBOTAManagerClass.shard.setLeftMethod(show: show, key: anntationMethodKey)
  314. // }
  315. // case 5: do {
  316. // KMBOTAManagerClass.shard.setLeftMethod(show: show, key: searchMethodKey)
  317. // }
  318. // case 6: do {
  319. // KMBOTAManagerClass.shard.setLeftMethod(show: show, key: formMethodKey)
  320. // }
  321. // case 7: do {
  322. // KMBOTAManagerClass.shard.setLeftMethod(show: show, key: signatureMethodKey)
  323. // }
  324. // break
  325. // default:
  326. // break
  327. // }
  328. // self.refreshShowMethod()
  329. // }
  330. // MARK: - New
  331. /*
  332. typedef NS_ENUM(NSInteger, KMNoteSortType) {
  333. KMNoteSortType_None = 0,
  334. KMNoteSortType_Time,
  335. KMNoteSortType_Page,
  336. };
  337. @class SKTocOutlineView, SKThumbnailTableView, SKTableView;
  338. @interface SKLeftSideViewController : SKSideViewController {
  339. SKTocOutlineView *tocOutlineView;
  340. NSArrayController *thumbnailArrayController;
  341. SKThumbnailTableView *thumbnailTableView;
  342. NSArrayController *findArrayController;
  343. SKTableView *findTableView;
  344. NSArrayController *groupedFindArrayController;
  345. SKTableView *groupedFindTableView;
  346. }
  347. @property (nonatomic, assign) BOOL isAscendSort;
  348. @property (nonatomic, assign) KMNoteSortType noteSortType;
  349. @property (nonatomic, retain) NSView *filterButtonLayer;
  350. @property (nonatomic, retain) KMButtonLayer *moreButtonLayer;
  351. - (void)applySearchTableHeader:(NSString *)message;
  352. - (void)displayFindState;
  353. */
  354. // @property (nonatomic, retain) IBOutlet NSArrayController *thumbnailArrayController, *findArrayController, *groupedFindArrayController;
  355. // @property (nonatomic, retain) IBOutlet SKTocOutlineView *tocOutlineView;
  356. // @property (nonatomic, retain) IBOutlet SKThumbnailTableView *thumbnailTableView;
  357. // @property (nonatomic, retain) IBOutlet SKTableView *findTableView;
  358. // @property (nonatomic, retain) IBOutlet SKTableView *groupedFindTableView;
  359. // @property (nonatomic, retain) *;
  360. @IBOutlet var segmentedControl: KMSegmentedControl!
  361. @IBOutlet weak var leftListView: NSView!
  362. // @property (nonatomic, retain) IBOutlet KMSearchViewController *searchViewController;
  363. @IBOutlet weak var toolButtonBox: NSBox!
  364. @IBOutlet weak var toolButtonBoxLayoutConstraint: NSLayoutConstraint!
  365. @IBOutlet weak var snapshotNormalView: NSView!
  366. @IBOutlet weak var snapshotLabel: NSTextField!
  367. @IBOutlet weak var snapshotNormalMoreButton: NSButton!
  368. @IBOutlet weak var snapshotNormalSearchButton: NSButton!
  369. @IBOutlet weak var snapshotNormalZoomOutButton: NSButton!
  370. @IBOutlet weak var snapshotNormalZoomInButton: NSButton!
  371. @IBOutlet weak var snapshotSearchZoomOutButton: NSButton!
  372. @IBOutlet weak var snapshotSearchZoomInButton: NSButton!
  373. @IBOutlet weak var snapshotSearchField: KMLeftSideViewSearchField!
  374. @IBOutlet weak var snapshotDoneButton: NSButton!
  375. @IBOutlet weak var outlineView: NSView!
  376. @IBOutlet weak var outlineMoreButton: NSButton!
  377. @IBOutlet weak var outlineAddButton: NSButton!
  378. @IBOutlet weak var outlineSearchButton: NSButton!
  379. @IBOutlet weak var outlineLabel: NSTextField!
  380. @IBOutlet weak var outlineSearchField: KMLeftSideViewSearchField!
  381. @IBOutlet weak var outlineDoneButton: NSButton!
  382. @IBOutlet weak var noteView: NSView!
  383. @IBOutlet weak var noteMoreButton: NSButton!
  384. @IBOutlet weak var noteFilterButton: NSButton!
  385. @IBOutlet weak var noteSearchButton: NSButton!
  386. @IBOutlet weak var noteSearchField: KMLeftSideViewSearchField!
  387. @IBOutlet weak var noteTitleLabel: NSTextField!
  388. @IBOutlet weak var noteHeaderView: NSView!
  389. @IBOutlet weak var sortTypeBox: KMBox!
  390. @IBOutlet weak var sortTypeLabel: NSTextField!
  391. @IBOutlet weak var noteSortButton: NSButton!
  392. @IBOutlet weak var noteDoneButton: NSButton!
  393. @IBOutlet weak var thumbnailView: NSView!
  394. @IBOutlet weak var thumbnailZoomOutButton: NSButton!
  395. @IBOutlet weak var thumbnailZoomInButton: NSButton!
  396. @IBOutlet weak var thumbnailTitleLabel: NSTextField!
  397. @IBOutlet weak var emptySearchBox: NSBox!
  398. @IBOutlet weak var emptySearchLabel: NSTextField!
  399. override func loadView() {
  400. super.loadView()
  401. self.view.wantsLayer = true
  402. self.view.layer?.backgroundColor = KMAppearance.Layout.l0Color().cgColor
  403. self.outlineView.wantsLayer = true
  404. self.outlineView.layer?.backgroundColor = KMAppearance.Layout.l0Color().cgColor
  405. self.noteView.wantsLayer = true
  406. self.noteView.layer?.backgroundColor = KMAppearance.Layout.l0Color().cgColor
  407. self.thumbnailView.wantsLayer = true
  408. self.thumbnailView.layer?.backgroundColor = KMAppearance.Layout.l0Color().cgColor
  409. self.snapshotNormalView.wantsLayer = true
  410. self.snapshotNormalView.layer?.backgroundColor = KMAppearance.Layout.l0Color().cgColor
  411. // tocOutlineView.backgroundColor = [KMAppearance KMColor_Layout_L0];
  412. // findTableView.backgroundColor = [KMAppearance KMColor_Layout_L0];
  413. // groupedFindTableView.backgroundColor = [KMAppearance KMColor_Layout_L0];
  414. // thumbnailTableView.backgroundColor = [KMAppearance KMColor_Layout_L0];
  415. self.leftListView.wantsLayer = true
  416. self.leftListView.layer?.backgroundColor = KMAppearance.Layout.l0Color().cgColor
  417. self.emptySearchLabel.stringValue = KMLocalizedString("No Results",nil)
  418. self.emptySearchLabel.textColor = KMAppearance.Layout.h0Color()
  419. self.emptySearchBox.isHidden = true
  420. self.thumbnailTitleLabel.stringValue = KMLocalizedString("Thumbnails", nil)
  421. self.thumbnailTitleLabel.textColor = KMAppearance.KMColor_Layout_H0()
  422. // self.thumbnailZoomInButton.action = #selector(thumbnailSizeScaling)
  423. // [_thumbnailZoomInButton setTarget:mainController];
  424. // _thumbnailZoomInButton.tag = 1;
  425. // [_thumbnailZoomOutButton setAction:@selector(thumbnailSizeScaling:)];
  426. // [_thumbnailZoomOutButton setTarget:mainController];
  427. // _thumbnailZoomOutButton.tag = 0;
  428. self.snapshotLabel.stringValue = KMLocalizedString("Snapshots", nil)
  429. self.snapshotLabel.textColor = KMAppearance.KMColor_Layout_H0()
  430. // [_snapshotNormalZoomInButton setAction:@selector(thumbnailSizeScaling:)];
  431. // [_snapshotNormalZoomInButton setTarget:mainController];
  432. // _snapshotNormalZoomInButton.tag = 2;
  433. // [_snapshotNormalZoomOutButton setAction:@selector(thumbnailSizeScaling:)];
  434. // [_snapshotNormalZoomOutButton setTarget:mainController];
  435. // _snapshotNormalZoomOutButton.tag = 3;
  436. self.snapshotNormalSearchButton.toolTip = KMLocalizedString("Search", nil)
  437. // [_snapshotNormalMoreButton setAction:@selector(leftSideViewMoreButtonAction:)];
  438. // [_snapshotNormalMoreButton setTarget:mainController];
  439. // [_snapshotNormalMoreButton setTag:300];
  440. // [_snapshotSearchZoomInButton setAction:@selector(thumbnailSizeScaling:)];
  441. // [_snapshotSearchZoomInButton setTarget:mainController];
  442. // _snapshotSearchZoomInButton.tag = 2;
  443. // [_snapshotSearchZoomOutButton setAction:@selector(thumbnailSizeScaling:)];
  444. // [_snapshotSearchZoomOutButton setTarget:mainController];
  445. // _snapshotSearchZoomOutButton.tag = 3;
  446. self.snapshotDoneButton.title = KMLocalizedString("Done", nil)
  447. self.snapshotDoneButton.toolTip = KMLocalizedString("Done", nil)
  448. self.snapshotDoneButton.setTitleColor(KMAppearance.Layout.w0Color())
  449. self.snapshotDoneButton.wantsLayer = true
  450. self.snapshotDoneButton.layer?.backgroundColor = KMAppearance.Interactive.a0Color().cgColor
  451. self.snapshotDoneButton.layer?.cornerRadius = 4.0
  452. // [self.snapshotDoneButton setAction:@selector(leftSideViewDoneButtonAction:)];
  453. // [self.snapshotDoneButton setTarget:mainController];
  454. // [self.snapshotDoneButton setTag:312];
  455. // self.snapshotDoneButton.hidden = YES;
  456. self.snapshotSearchField.backgroundColor = KMAppearance.Layout.l_1Color()
  457. self.outlineSearchField.backgroundColor = KMAppearance.Layout.l_1Color()
  458. self.noteSearchField.backgroundColor = KMAppearance.Layout.l_1Color()
  459. self.snapshotSearchField.wantsLayer = true
  460. self.outlineSearchField.wantsLayer = true
  461. self.noteSearchField.wantsLayer = true
  462. self.snapshotSearchField.layer?.backgroundColor = KMAppearance.Layout.l_1Color().cgColor
  463. self.outlineSearchField.layer?.backgroundColor = KMAppearance.Layout.l_1Color().cgColor
  464. self.noteSearchField.layer?.backgroundColor = KMAppearance.Layout.l_1Color().cgColor
  465. self.snapshotSearchField.layer?.borderWidth = 1.0
  466. self.outlineSearchField.layer?.borderWidth = 1.0
  467. self.noteSearchField.layer?.borderWidth = 1.0
  468. self.snapshotSearchField.layer?.borderColor = KMAppearance.Interactive.a0Color().cgColor
  469. self.outlineSearchField.layer?.borderColor = KMAppearance.Interactive.a0Color().cgColor
  470. self.noteSearchField.layer?.borderColor = KMAppearance.Interactive.a0Color().cgColor
  471. // __block typeof(self) blockSelf = self;
  472. // _snapshotSearchField.changeCallBack = ^(NSString *changeContent) {
  473. // NSString *editContent = @"";
  474. // if (changeContent) {
  475. // editContent = changeContent;
  476. // }
  477. // [blockSelf.mainController searchFieldChangeAction:editContent];
  478. // };
  479. self.snapshotSearchField.isHidden = true
  480. self.snapshotSearchZoomOutButton.isHidden = true
  481. self.snapshotSearchZoomInButton.isHidden = true
  482. // _snapshotSearchField.endEditCallBack = ^(BOOL isEndEdit) {
  483. // if (isEndEdit/* && searchViewController.segmentedControl.segmentCount == 3*/) {
  484. // _snapshotSearchField.hidden = YES;
  485. // _snapshotSearchZoomOutButton.hidden = YES;
  486. // _snapshotSearchZoomInButton.hidden = YES;
  487. // _snapshotLabel.hidden = NO;
  488. // _snapshotNormalZoomOutButton.hidden = NO;
  489. // _snapshotNormalZoomInButton.hidden = NO;
  490. // }
  491. // };
  492. self.thumbnailZoomInButton.toolTip = KMLocalizedString("Zoom In", nil)
  493. self.snapshotNormalZoomInButton.toolTip = KMLocalizedString("Zoom In", nil)
  494. self.snapshotSearchZoomInButton.toolTip = KMLocalizedString("Zoom In", nil)
  495. self.thumbnailZoomOutButton.toolTip = KMLocalizedString("Zoom Out", nil)
  496. self.snapshotNormalZoomOutButton.toolTip = KMLocalizedString("Zoom Out", nil)
  497. self.snapshotSearchZoomOutButton.toolTip = KMLocalizedString("Zoom Out", nil)
  498. self.outlineLabel.stringValue = KMLocalizedString("Outline", nil);
  499. self.outlineLabel.textColor = KMAppearance.Layout.h0Color()
  500. // self.outlineAddButton.toolTip = NSLocalizedString(@"Add Item", nil);
  501. // [self.outlineAddButton setAction:@selector(outlineContextMenuItemClicked_AddEntry:)];
  502. // [self.outlineAddButton setTarget:mainController];
  503. // self.outlineSearchButton.toolTip = NSLocalizedString(@"Search", nil);
  504. // [self.outlineMoreButton setAction:@selector(leftSideViewMoreButtonAction:)];
  505. // [self.outlineMoreButton setTarget:mainController];
  506. // [self.outlineMoreButton setTag:302];
  507. self.outlineDoneButton.title = KMLocalizedString("Done", nil);
  508. self.outlineDoneButton.toolTip = KMLocalizedString("Done", nil);
  509. self.outlineDoneButton.setTitleColor(KMAppearance.Layout.w0Color())
  510. self.outlineDoneButton.wantsLayer = true
  511. self.outlineDoneButton.layer?.backgroundColor = KMAppearance.Interactive.a0Color().cgColor
  512. self.outlineDoneButton.layer?.cornerRadius = 4.0
  513. // [self.outlineDoneButton setAction:@selector(leftSideViewDoneButtonAction:)];
  514. // [self.outlineDoneButton setTarget:mainController];
  515. // [self.outlineDoneButton setTag:310];
  516. // self.outlineDoneButton.hidden = YES;
  517. self.outlineSearchField.isHidden = true
  518. // _outlineSearchField.endEditCallBack = ^(BOOL isEndEdit) {
  519. // if (isEndEdit) {
  520. // _outlineSearchField.hidden = YES;
  521. // _outlineLabel.hidden = NO;
  522. // _outlineSearchButton.hidden = NO;
  523. // }
  524. // };
  525. // NSMenu *menuOutline = [NSMenu menu];
  526. // [menuOutline addItemWithTitle:NSLocalizedString(@"Ignore Case", @"Menu item title") action:@selector(toggleOutlineCaseInsensitiveSearch:) target:mainController];
  527. // [[_outlineSearchField cell] setSearchMenuTemplate:menuOutline];
  528. // [[_outlineSearchField cell] setPlaceholderString:NSLocalizedString(@"Search Outline", nil)];
  529. // [_outlineSearchField setTarget:mainController];
  530. let sud = UserDefaults.standard
  531. self.noteTitleLabel.stringValue = KMLocalizedString("Notes", nil);
  532. self.noteTitleLabel.textColor = KMAppearance.KMColor_Layout_H0()
  533. // [self.noteMoreButton setAction:@selector(leftSideViewMoreButtonAction:)];
  534. // [self.noteMoreButton setTarget:mainController];
  535. // [self.noteMoreButton setTag:304];
  536. // self.noteMoreButton.wantsLayer = YES;
  537. // _moreButtonLayer = [KMButtonLayer layer];
  538. // [self.noteMoreButton.layer addSublayer:_moreButtonLayer];
  539. // _moreButtonLayer.frame = CGRectMake(0, 0, CGRectGetWidth(self.noteMoreButton.bounds), CGRectGetHeight(self.noteMoreButton.bounds));
  540. // _moreButtonLayer.layerType = KMNoteFilerButtonLayerType_None;
  541. // _moreButtonLayer.hidden = YES;
  542. // [self.noteFilterButton setAction:@selector(noteFilterAction:)];
  543. // [self.noteFilterButton setTarget:mainController];
  544. // [self.noteFilterButton setToolTip:NSLocalizedString(@"Sort", nil)];
  545. // self.noteFilterButton.wantsLayer = YES;
  546. // _filterButtonLayer = [[NSView alloc] init];
  547. // [self.noteFilterButton addSubview:_filterButtonLayer];
  548. // _filterButtonLayer.frame = CGRectMake(14, 2, 8, 8);
  549. // _filterButtonLayer.layerType = KMNoteFilerButtonLayerType_Dot;
  550. // _filterButtonLayer.hidden = YES;
  551. // _filterButtonLayer.wantsLayer = YES;
  552. // _filterButtonLayer.layer.backgroundColor = [KMAppearance KMColor_Interactive_A0].CGColor;
  553. // _filterButtonLayer.layer.cornerRadius = 4.0;
  554. self.noteDoneButton.title = KMLocalizedString("Done", nil)
  555. self.noteDoneButton.toolTip = KMLocalizedString("Done", nil)
  556. self.noteDoneButton.setTitleColor(KMAppearance.Layout.w0Color())
  557. self.noteDoneButton.wantsLayer = true
  558. self.noteDoneButton.layer?.backgroundColor = KMAppearance.KMColor_Interactive_A0().cgColor
  559. self.noteDoneButton.layer?.cornerRadius = 4.0
  560. // [self.noteDoneButton setAction:@selector(leftSideViewDoneButtonAction:)]
  561. // [self.noteDoneButton setTarget:mainController];
  562. // [self.noteDoneButton setTag:311];
  563. // self.noteDoneButton.hidden = YES;
  564. self.noteSearchButton.toolTip = KMLocalizedString("Search", nil)
  565. self.noteSearchField.isHidden = true
  566. // _noteSearchField.endEditCallBack = ^(BOOL isEndEdit) {
  567. // if (isEndEdit) {
  568. // _noteSearchField.hidden = YES;
  569. // _noteSearchButton.hidden = NO;
  570. // _noteTitleLabel.hidden = NO;
  571. // }
  572. // };
  573. self.noteHeaderView.wantsLayer = true
  574. self.noteHeaderView.layer?.backgroundColor = KMAppearance.KMColor_Else_Text_Tag().cgColor
  575. self.noteHeaderView.layer?.cornerRadius = 1.0
  576. // let sortType = sud.integer(forKey: KMLeftSideViewNoteSortTypeKey)
  577. // if (sortType) {
  578. // _noteSortType = sortType;
  579. // if (sortType == KMNoteSortType_Time) {
  580. // self.sortTypeLabel.stringValue = NSLocalizedString(@"Time", nil);
  581. // self.sortTypeBox.toolTip = NSLocalizedString(@"Time", nil);
  582. // } else if (sortType == KMNoteSortType_Page) {
  583. // self.sortTypeLabel.stringValue = NSLocalizedString(@"Page", nil);
  584. // self.sortTypeBox.toolTip = NSLocalizedString(@"Page", nil);
  585. // }
  586. // } else {
  587. // _noteSortType = KMNoteSortType_Time;
  588. // self.sortTypeLabel.stringValue = NSLocalizedString(@"Time", nil);
  589. // }
  590. self.sortTypeLabel.textColor = KMAppearance.KMColor_Layout_H1()
  591. // _isAscendSort = [sud boolForKey:KMLeftSideViewAscendSortBoolKey];
  592. // if (_isAscendSort) {
  593. // [_noteSortButton setImage:[NSImage imageNamed:KMImageNameBtnSidebarRankReverse]];
  594. // [_noteSortButton setToolTip:NSLocalizedString(@"ascending sort", nil)];
  595. // } else {
  596. // [_noteSortButton setImage:[NSImage imageNamed:KMImageNameBtnSidebarRankPositive]];
  597. // [_noteSortButton setToolTip:NSLocalizedString(@"descending sort", nil)];
  598. // }
  599. // self.sortTypeBox.mouseDownCallback = ^(BOOL downEntered, KMBox *mouseBox) {
  600. // if (downEntered) {
  601. // NSMenu *menu = [[[NSMenu alloc] init] autorelease];
  602. // NSMenuItem *timeItem = [menu addItemWithTitle:NSLocalizedString(@"Time", nil) action:@selector(sortTypeAction:) target:self];
  603. // [timeItem setRepresentedObject:self];
  604. // timeItem.tag = 0;
  605. // NSMenuItem *pageItem = [menu addItemWithTitle:NSLocalizedString(@"Page", nil) action:@selector(sortTypeAction:) target:self];
  606. // [pageItem setRepresentedObject:self];
  607. // timeItem.tag = 1;
  608. // if (self.noteSortType == KMNoteSortType_Time) {
  609. // timeItem.state = NSControlStateValueOn;
  610. // pageItem.state = NSControlStateValueOff;
  611. // } else if (self.noteSortType == KMNoteSortType_Page) {
  612. // timeItem.state = NSControlStateValueOff;
  613. // pageItem.state = NSControlStateValueOn;
  614. // }
  615. // [menu popUpMenuPositioningItem:nil atLocation:CGPointMake(-10, 0) inView:self.sortTypeBox];
  616. // }
  617. // };
  618. // [searchViewController loadView];
  619. // searchViewController.contentView = findTableView.enclosingScrollView;
  620. // self.searchField = searchViewController.searchField;
  621. // [searchViewController.segmentedControl setSegmentCount:2 withWidth:25];
  622. // [searchViewController.segmentedControl setImage:[NSImage imageNamed:KMImageNameUXIconBtnSidebarListNor] forSegment:0];
  623. // [searchViewController.segmentedControl setImage:[NSImage imageNamed:KMImageNameUXIconBtnSidebarPageNor] forSegment:1];
  624. // [searchViewController.segmentedControl setToolTip:NSLocalizedString(@"Separate search results", nil) forSegment:0];
  625. // [searchViewController.segmentedControl setToolTip:NSLocalizedString(@"Group search results by page", nil) forSegment:1];
  626. // [searchViewController.segmentedControl setIsBackgroundHighlighted:YES];
  627. // [searchViewController.segmentedControl setSelectedSegment:0];
  628. // [mainController bind:@"findPaneState" toObject:searchViewController.segmentedControl withKeyPath:@"selectedSegment" options:nil];
  629. self.segmentedControl.segmentCount = 5
  630. self.segmentedControl.setImage(NSImage(named: KMImageNameUXIconSidetabbarThumbnailNor)!, for: 0)
  631. self.segmentedControl.setImage(NSImage(named: KMImageNameUXIconSidetabbarOutlineNor)!, for: 1)
  632. self.segmentedControl.setImage(NSImage(named: KMImageNameUXIconSidetabbarAnnotationNor)!, for: 2)
  633. self.segmentedControl.setImage(NSImage(named: KMImageNameUXIconSidetabbarSnapshotNor)!, for: 3)
  634. self.segmentedControl.setImage(NSImage(named: KMImageNameUXIconSidetabbarSearchNor)!, for: 4)
  635. self.segmentedControl.setToolTip(KMLocalizedString("View Thumbnails", nil), for: 0)
  636. self.segmentedControl.setToolTip(KMLocalizedString("View Outline", nil), for: 1)
  637. self.segmentedControl.setToolTip(KMLocalizedString("View Notes", nil), for: 2)
  638. self.segmentedControl.setToolTip(KMLocalizedString("View Snapshots", nil), for: 3)
  639. self.segmentedControl.setToolTip(KMLocalizedString("Search", nil), for: 4)
  640. self.segmentedControl.selectedSegment = 0
  641. // [segmentedControl bind:@"selectedSegment" toObject:mainController withKeyPath:@"leftSidePaneState" options:nil];
  642. // [mainController bind:@"leftSidePaneState" toObject:segmentedControl withKeyPath:@"selectedSegment" options:nil];
  643. self.segmentedControl.wantsLayer = true
  644. self.segmentedControl.layer?.backgroundColor = KMAppearance.Layout.l_1Color().cgColor
  645. // self.button.setHelp(KMLocalizedString("View Thumbnails", "Tool tip message"), for: KMLeftSidePaneState.thumbnail.rawValue)
  646. // self.button.setHelp(KMLocalizedString("View Outline", "Tool tip message"), for: KMLeftSidePaneState.outline.rawValue)
  647. // self.alternateButton.setHelp(KMLocalizedString("Separate search results", "Tool tip message"), for: KMFindPaneState.singular.rawValue)
  648. // self.alternateButton.setHelp(KMLocalizedString("Group search results by page", "Tool tip message"), for: KMFindPaneState.grouped.rawValue)
  649. // NSMenu *menu = [NSMenu menu];
  650. // [menu addItemWithTitle:NSLocalizedString(@"Whole Words Only", @"Menu item title") action:@selector(toggleWholeWordSearch:) target:mainController];
  651. // [menu addItemWithTitle:NSLocalizedString(@"Ignore Case", @"Menu item title") action:@selector(toggleCaseInsensitiveSearch:) target:mainController];
  652. // [[searchField cell] setSearchMenuTemplate:menu];
  653. // [[searchField cell] setPlaceholderString:NSLocalizedString(@"Search PDF", @"placeholder")];
  654. // [searchField setAction:@selector(search:)];
  655. // [searchField setTarget:mainController];
  656. // [tocOutlineView setAutoresizesOutlineColumn: NO];
  657. // [tocOutlineView setAllowsMultipleSelection:YES];
  658. // [tocOutlineView setAllowsEmptySelection:YES];
  659. //
  660. // [tocOutlineView setDelegate:mainController];
  661. // [tocOutlineView setDataSource:mainController];
  662. // [thumbnailTableView setDelegate:mainController];
  663. // [thumbnailTableView setDataSource:mainController];
  664. // [thumbnailTableView setAllowsMultipleSelection:YES];
  665. // [findTableView setDelegate:mainController];
  666. // // [groupedFindTableView setDelegate:mainController];
  667. // [groupedFindTableView setDataSource:mainController];
  668. // [[thumbnailTableView menu] setDelegate:mainController];
  669. // [[findTableView menu] setDelegate:mainController];
  670. // [[groupedFindTableView menu] setDelegate:mainController];
  671. // [tocOutlineView setDoubleAction:@selector(goToSelectedOutlineItem:)];
  672. // [tocOutlineView setTarget:mainController];
  673. // [findTableView setDoubleAction:@selector(goToSelectedFindResults:)];
  674. // [findTableView setTarget:mainController];
  675. // [groupedFindTableView setDoubleAction:@selector(goToSelectedFindResults:)];
  676. // [groupedFindTableView setTarget:mainController];
  677. // [thumbnailTableView setTypeSelectHelper:[SKTypeSelectHelper typeSelectHelperWithMatchOption:SKFullStringMatch]];
  678. // //支持拖拽的文字类型
  679. // [thumbnailTableView registerForDraggedTypes:@[KPDFThumbnailLocalForDraggedTypes,NSFilenamesPboardType]];
  680. // [tocOutlineView setTypeSelectHelper:[SKTypeSelectHelper typeSelectHelperWithMatchOption:SKSubstringMatch]];
  681. // [tocOutlineView registerForDraggedTypes:[NSArray arrayWithObject:kKMPDFViewOutlineDragDataType]];
  682. // [[[findTableView tableColumnWithIdentifier:PAGE_COLUMNID] headerCell] setTitle:NSLocalizedString(@"Page", @"Table header title")];
  683. // [[[groupedFindTableView tableColumnWithIdentifier:PAGE_COLUMNID] headerCell] setTitle:NSLocalizedString(@"Page", @"Table header title")];
  684. // [[[groupedFindTableView tableColumnWithIdentifier:RELEVANCE_COLUMNID] dataCell] setEnabled:NO];
  685. // if (RUNNING_AFTER(10_9)) {
  686. // [thumbnailTableView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone];
  687. // [(SKSourceListTextFieldCell *)[[thumbnailTableView tableColumnWithIdentifier:PAGE_COLUMNID] dataCell] setSimulatesSourceList:YES];
  688. // }
  689. // NSSortDescriptor *countDescriptor = [[[NSSortDescriptor alloc] initWithKey:SKGroupedSearchResultCountKey ascending:NO] autorelease];
  690. // [groupedFindArrayController setSortDescriptors:[NSArray arrayWithObjects:countDescriptor, nil]];
  691. //
  692. // [thumbnailTableView setDraggingSourceOperationMask:NSDragOperationEvery forLocal:NO];
  693. // if (NO == [[NSUserDefaults standardUserDefaults] boolForKey:SKDisableTableToolTipsKey]) {
  694. // [tocOutlineView setHasImageToolTips:YES];
  695. // [findTableView setHasImageToolTips:YES];
  696. // [groupedFindTableView setHasImageToolTips:YES];
  697. // }
  698. // [self updateViewColor];
  699. }
  700. /*
  701. @implementation SKLeftSideViewController
  702. @synthesize tocOutlineView, thumbnailArrayController, thumbnailTableView, findArrayController, findTableView, groupedFindArrayController, groupedFindTableView;
  703. @synthesize segmentedControl, searchViewController;
  704. - (void)dealloc {
  705. [[NSNotificationCenter defaultCenter]removeObserver:self];
  706. [thumbnailTableView setDelegate:nil];
  707. [thumbnailTableView setDataSource:nil];
  708. [findTableView setDelegate:nil];
  709. // [groupedFindTableView setDelegate:nil];
  710. [groupedFindTableView setDataSource:nil];
  711. [tocOutlineView setDelegate:nil];
  712. [tocOutlineView setDataSource:nil];
  713. [_filterButtonLayer release];
  714. [_moreButtonLayer release];
  715. SKDESTROY(thumbnailArrayController);
  716. SKDESTROY(findArrayController);
  717. SKDESTROY(groupedFindArrayController);
  718. SKDESTROY(tocOutlineView);
  719. SKDESTROY(thumbnailTableView);
  720. SKDESTROY(findTableView);
  721. SKDESTROY(groupedFindTableView);
  722. SKDESTROY(segmentedControl);
  723. SKDESTROY(searchViewController);
  724. [super dealloc];
  725. }
  726. - (BOOL)requiresAlternateButtonForView:(NSView *)aView {
  727. return NO;
  728. return [findTableView isDescendantOf:aView] || [groupedFindTableView isDescendantOf:aView];
  729. }
  730. - (void)applySearchTableHeader:(NSString *)message {
  731. [[[findTableView tableColumnWithIdentifier:RESULTS_COLUMNID] headerCell] setStringValue:message];
  732. [[findTableView headerView] setNeedsDisplay:YES];
  733. [[[groupedFindTableView tableColumnWithIdentifier:RELEVANCE_COLUMNID] headerCell] setStringValue:message];
  734. [[groupedFindTableView headerView] setNeedsDisplay:YES];
  735. }
  736. - (void)displayFindState {
  737. if (mainController.findState == SKFindStateContent) {
  738. [self displayFind];
  739. } else if (mainController.findState == SKFindStateNote) {
  740. [self displayNoteFind];
  741. } else if (mainController.findState == SKFindStateSnapshot) {
  742. [self displaySnapshotFind];
  743. }
  744. }
  745. - (void)displayFind {
  746. self.searchField = searchViewController.searchField;
  747. NSMenu *menu = [NSMenu menu];
  748. [menu addItemWithTitle:NSLocalizedString(@"Whole Words Only", @"Menu item title") action:@selector(toggleWholeWordSearch:) target:mainController];
  749. [menu addItemWithTitle:NSLocalizedString(@"Ignore Case", @"Menu item title") action:@selector(toggleCaseInsensitiveSearch:) target:mainController];
  750. [[searchViewController.searchField cell] setSearchMenuTemplate:menu];
  751. [[searchViewController.searchField cell] setPlaceholderString:NSLocalizedString(@"Search PDF", @"placeholder")];
  752. [searchViewController.searchField setAction:@selector(search:)];
  753. [searchViewController.searchField setTarget:mainController];
  754. if (mainController.findPaneState == SKFindPaneStateSingular) {
  755. searchViewController.contentView = findTableView.enclosingScrollView;
  756. } else if (mainController.findPaneState == SKFindPaneStateGrouped) {
  757. searchViewController.contentView = groupedFindTableView.enclosingScrollView;
  758. }
  759. }
  760. - (void)displayNoteFind {
  761. mainController.rightSideController.searchField = self.noteSearchField;
  762. NSMenu *menu = [NSMenu menu];
  763. [menu addItemWithTitle:NSLocalizedString(@"Ignore Case", @"Menu item title") action:@selector(toggleCaseInsensitiveNoteSearch:) target:mainController];
  764. [[self.noteSearchField cell] setSearchMenuTemplate:menu];
  765. [[self.noteSearchField cell] setPlaceholderString:NSLocalizedString(@"Search Notes", @"placeholder")];
  766. [self.noteSearchField setAction:@selector(searchNotes:)];
  767. [self.noteSearchField setTarget:mainController];
  768. }
  769. - (void)displaySnapshotFind {
  770. mainController.rightSideController.searchField = self.snapshotSearchField;
  771. NSMenu *menu = [NSMenu menu];
  772. [menu addItemWithTitle:NSLocalizedString(@"Ignore Case", @"Menu item title") action:@selector(toggleCaseInsensitiveNoteSearch:) target:mainController];
  773. [[self.snapshotSearchField cell] setSearchMenuTemplate:menu];
  774. [[self.snapshotSearchField cell] setPlaceholderString:NSLocalizedString(@"Search Snapshots", @"placeholder")];
  775. [self.snapshotSearchField setAction:@selector(searchNotes:)];
  776. [self.snapshotSearchField setTarget:mainController];
  777. [self.snapshotSearchField setDelegate:mainController];
  778. }
  779. #pragma mark - UI Action
  780. - (IBAction)snapshotNormalSearchButtonAction:(NSButton *)sender {
  781. _snapshotSearchField.hidden = NO;
  782. // _snapshotSearchZoomOutButton.hidden = YES;
  783. _snapshotSearchZoomInButton.hidden = YES;
  784. _snapshotNormalSearchButton.hidden = YES;
  785. _snapshotDoneButton.hidden = NO;
  786. _snapshotLabel.hidden = YES;
  787. _snapshotNormalZoomOutButton.hidden = YES;
  788. _snapshotNormalZoomInButton.hidden = YES;
  789. [_snapshotSearchField becomeFirstResponder];
  790. }
  791. - (IBAction)outlineNormalSearchButtonAction:(NSButton *)sender {
  792. _outlineSearchField.hidden = NO;
  793. _outlineDoneButton.hidden = NO;
  794. _outlineLabel.hidden = YES;
  795. _outlineSearchButton.hidden = YES;
  796. _outlineMoreButton.hidden = YES;
  797. _outlineAddButton.hidden = YES;
  798. [_outlineSearchField becomeFirstResponder];
  799. }
  800. - (IBAction)noteSearchAction:(NSButton *)sender {
  801. self.noteSearchField.hidden = NO;
  802. self.noteTitleLabel.hidden = YES;
  803. self.noteSearchButton.hidden = YES;
  804. self.noteDoneButton.hidden = NO;
  805. self.noteFilterButton.hidden = YES;
  806. self.noteMoreButton.hidden = YES;
  807. [self.noteSearchField becomeFirstResponder];
  808. }
  809. - (IBAction)noteSortAction:(id)sender {
  810. if (self.isAscendSort) {
  811. self.isAscendSort = NO;
  812. [self.noteSortButton setImage:[NSImage imageNamed:KMImageNameBtnSidebarRankPositive]];
  813. [self.noteSortButton setToolTip:NSLocalizedString(@"descending sort", nil)];
  814. } else {
  815. self.isAscendSort = YES;
  816. [self.noteSortButton setImage:[NSImage imageNamed:KMImageNameBtnSidebarRankReverse]];
  817. [self.noteSortButton setToolTip:NSLocalizedString(@"ascending sort", nil)];
  818. }
  819. [[NSUserDefaults standardUserDefaults] setBool:self.isAscendSort forKey:KMLeftSideViewAscendSortBoolKey];
  820. }
  821. - (IBAction)sortTypeAction:(id)sender {
  822. NSMenuItem *item = (NSMenuItem *)sender;
  823. NSInteger tag = item.tag;
  824. if (item.state == NSControlStateValueOn) {
  825. item.state = NSControlStateValueOff;
  826. } else {
  827. item.state = NSControlStateValueOn;
  828. }
  829. if (tag == 0) {
  830. self.noteSortType = KMNoteSortType_Page;
  831. _sortTypeLabel.stringValue = NSLocalizedString(@"Page", nil);
  832. _sortTypeBox.toolTip = NSLocalizedString(@"Page", nil);
  833. } else if (tag == 1) {
  834. self.noteSortType = KMNoteSortType_Time;
  835. _sortTypeLabel.stringValue = NSLocalizedString(@"Time", nil);
  836. _sortTypeBox.toolTip = NSLocalizedString(@"Time", nil);
  837. }
  838. [[NSUserDefaults standardUserDefaults] setInteger:self.noteSortType forKey:KMLeftSideViewNoteSortTypeKey];
  839. [[NSUserDefaults standardUserDefaults] synchronize];
  840. }
  841. #pragma mark - get && set
  842. - (void)setIsAscendSort:(BOOL)isAscendSort {
  843. _isAscendSort = isAscendSort;
  844. [[NSNotificationCenter defaultCenter] postNotificationName:@"KMAnnotationSortTypeKeyNotification" object:self userInfo:nil];
  845. }
  846. - (void)setNoteSortType:(KMNoteSortType)noteSortType {
  847. _noteSortType = noteSortType;
  848. [[NSNotificationCenter defaultCenter] postNotificationName:@"KMAnnotationSortTypeKeyNotification" object:self userInfo:nil];
  849. }
  850. */
  851. }
  852. extension KMLeftSideViewController: KMThumbnailViewControllerDelegate {
  853. func gotoPageEdit(thumbnailViewController: KMThumbnailViewController, pages: [Int]) {
  854. self.delegate?.enterEditMode?(self, pages)
  855. }
  856. func pageDidSelect(controller: KMThumbnailViewController, pages: [Int]) {
  857. self.selectPages = pages
  858. }
  859. func controller(controller: KMThumbnailViewController, itemClick item: Any?, itemKey: KMItemKey, params: Any?) {
  860. self.delegate?.controller?(controller: self, itemClick: item, itemKey: itemKey, params: params)
  861. }
  862. }
  863. extension KMLeftSideViewController : KMSearchViewControllerDelegate {
  864. // func searchAction(searchString: String,isCase:Bool) {
  865. // self.delegate?.searchAction?(searchString: searchString, isCase: isCase)
  866. // }
  867. //
  868. // func searchDoneAction(viewController: KMSearchViewController) {
  869. // self.type = KMLeftMethodMode()
  870. // self.updateViewButtonState()
  871. // self.delegate?.controlStateChange?(self,show:false)
  872. //// self.leftTableview.reloadData()
  873. // }
  874. }
  875. //MARK: NSTableViewDelegate,NSTableViewDataSource
  876. //extension KMLeftSideViewController: NSTableViewDelegate,NSTableViewDataSource {
  877. // func numberOfRows(in tableView: NSTableView) -> Int {
  878. // return self.dataSource.count
  879. // }
  880. //
  881. // func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
  882. // let cell : KMLiftSideCellView = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "KMLiftSideCellView"), owner: self) as! KMLiftSideCellView
  883. // if row <= selectImage.count-1 {
  884. // if self.dataSource[row] == self.type {
  885. // cell.isSelect = true
  886. // cell.mothedImage.image = NSImage(named: selectImage[row])
  887. // cell.backgroundColor(NSColor.km_init(hex: "#DFE1E5"))
  888. // } else {
  889. // cell.isSelect = false
  890. // cell.mothedImage.image = NSImage(named: norImage[row])
  891. // cell.backgroundColor(NSColor.clear)
  892. // }
  893. // }
  894. // cell.index = row
  895. // cell.buttonClick = { [unowned self] index in
  896. // if ((index < self.dataSource.count) && (index > -1)) {
  897. //
  898. // let isSearch = self.type.methodType == .Search
  899. //
  900. // var show = true
  901. // if( self.type == self.dataSource[index]) {
  902. // self.type = KMLeftMethodMode()
  903. // show = false
  904. // } else {
  905. // self.type = self.dataSource[index]
  906. // show = true
  907. // }
  908. //
  909. // self.trackEvent(type: self.type.methodType)
  910. //
  911. // self.updateViewButtonState()
  912. // self.delegate?.controlStateChange?(self,show:show)
  913. //// self.leftTableview.selectRowIndexes([index], byExtendingSelection: true)
  914. //// self.leftTableview.reloadData()
  915. //
  916. // UserDefaults.standard.set(index, forKey: "KMBOTASelectedIndexKey")
  917. // UserDefaults.standard.synchronize()
  918. //
  919. // if (isSearch && show == false) {
  920. // self.view.window?.makeFirstResponder(self)
  921. // } else if (isSearch && self.type.methodType != .Search) { // 切换
  922. // self.view.window?.makeFirstResponder(self)
  923. // }
  924. // }
  925. // }
  926. // return cell
  927. // }
  928. //
  929. // func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {
  930. // return 48
  931. // }
  932. //
  933. // func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
  934. // let rowView = KMCustomTableRowView()
  935. // rowView.selectionColor = NSColor(calibratedRed: 223.0/255.0, green: 225.0/255.0, blue: 229.0/255.0, alpha: 1.0)
  936. // rowView.color = NSColor.km_init(hex: "#F7F8FA")
  937. // return rowView
  938. // }
  939. //
  940. // func tableViewSelectionDidChange(_ notification: Notification) {
  941. //
  942. // }
  943. //}
  944. //extension KMLeftSideViewController: KMPDFViewPanelSetViewControllerDelegate {
  945. // func controller(_ controller: KMPDFViewPanelSetViewController, dispayDidChange dispay: KMPDFDisplayType) {
  946. // self.delegate?.controller?(self, dispayDidChange: dispay)
  947. // }
  948. //
  949. // func controller(_ controller: KMPDFViewPanelSetViewController, pageBreaksClick pageBreaks: Bool) {
  950. // self.listView?.displaysPageBreaks = pageBreaks
  951. // self.listView?.layoutDocumentView()
  952. // }
  953. //
  954. // func controller(_ controller: KMPDFViewPanelSetViewController, rotateClick rotateType: KMRotateType) {
  955. //// if (rotateType == .clockwise) { /// 顺时针
  956. //// let page : CPDFPage = self.listView?.currentPage() ?? CPDFPage()
  957. //// if page.rotation == 0 {
  958. //// page.rotation = 90
  959. //// } else if page.rotation == 90 {
  960. //// page.rotation = 180
  961. //// } else if page.rotation == 180 {
  962. //// page.rotation = 270
  963. //// } else if page.rotation == 270 {
  964. //// page.rotation = 0
  965. //// }
  966. //// self.listView?.layoutDocumentView()
  967. //// } else if (rotateType == .anticlockwise) { /// 逆时针
  968. //// let page : CPDFPage = self.listView?.currentPage() ?? CPDFPage()
  969. //// if page.rotation == 0 {
  970. //// page.rotation = 270
  971. //// } else if page.rotation == 90 {
  972. //// page.rotation = 0
  973. //// } else if page.rotation == 180 {
  974. //// page.rotation = 90
  975. //// } else if page.rotation == 270 {
  976. //// page.rotation = 180
  977. //// }
  978. //// self.listView?.layoutDocumentView()
  979. //// }
  980. ////
  981. // self.delegate?.controller?(controller: self, rotateType: rotateType)
  982. // }
  983. //}
  984. // MARK: -
  985. // MARK: - 扩展
  986. extension KMLeftSideViewController {
  987. public func selectType(_ type: BotaType) {
  988. // 更新 type
  989. var show = true
  990. if (self.type.methodType == .None) {
  991. show = true
  992. } else {
  993. if (self.type.methodType == type) {
  994. show = false
  995. } else {
  996. show = true
  997. }
  998. }
  999. var index: Int = NSNotFound
  1000. switch type {
  1001. case .None:
  1002. index = NSNotFound
  1003. break
  1004. case .Thumbnail:
  1005. index = 0
  1006. break
  1007. case .Outline:
  1008. index = 1
  1009. break
  1010. case .BookMark:
  1011. index = 2
  1012. break
  1013. case .Annotation:
  1014. index = 3
  1015. break
  1016. case .Search:
  1017. index = 4
  1018. break
  1019. case .From:
  1020. index = 5
  1021. break
  1022. case .Signature:
  1023. index = 6
  1024. break
  1025. }
  1026. self.type = self.getMethodMode(show ? type : .None)
  1027. // 更新按钮状态
  1028. // self.updateViewButtonState()
  1029. // 将事件传递出去
  1030. self.delegate?.controlStateChange?(self,show:show)
  1031. if (index != NSNotFound) {
  1032. // self.leftTableview.selectRowIndexes([index], byExtendingSelection: true)
  1033. // 记录当前选中
  1034. UserDefaults.standard.set(index, forKey: "KMBOTASelectedIndexKey")
  1035. UserDefaults.standard.synchronize()
  1036. }
  1037. // self.leftTableview.reloadData()
  1038. }
  1039. private func getMethodMode(_ type: BotaType) -> KMLeftMethodMode {
  1040. let mode = KMLeftMethodMode()
  1041. mode.methodType = type
  1042. switch type {
  1043. case .None:
  1044. mode.methodName = ""
  1045. break
  1046. case .Thumbnail:
  1047. mode.methodName = thumbnailMethodKey
  1048. break
  1049. case .Outline:
  1050. mode.methodName = outlineMethodKey
  1051. break
  1052. case .BookMark:
  1053. mode.methodName = bookMarkMethodKey
  1054. break
  1055. case .Annotation:
  1056. mode.methodName = anntationMethodKey
  1057. break
  1058. case .Search:
  1059. mode.methodName = searchMethodKey
  1060. break
  1061. case .From:
  1062. mode.methodName = formMethodKey
  1063. break
  1064. case .Signature:
  1065. mode.methodName = signatureMethodKey
  1066. break
  1067. }
  1068. return mode
  1069. }
  1070. }
  1071. //MARK: Cache
  1072. extension KMLeftSideViewController {
  1073. func clearAnnotationFilterData() {
  1074. if let _key = self.listView?.document?.documentURL?.path {
  1075. let userDefaults = UserDefaults.standard
  1076. let typeData = try?NSKeyedArchiver.archivedData(withRootObject: [Any](), requiringSecureCoding: false)
  1077. userDefaults.set(typeData, forKey: "KMNoteOutlineFilterSelectArray_Type" + _key)
  1078. let colorData = try?NSKeyedArchiver.archivedData(withRootObject: [Any](), requiringSecureCoding: false)
  1079. userDefaults.set(colorData, forKey: "KMNoteOutlineFilterSelectArray_Color" + _key)
  1080. let authorData = try?NSKeyedArchiver.archivedData(withRootObject: [Any](), requiringSecureCoding: false)
  1081. userDefaults.set(authorData, forKey: "KMNoteOutlineFilterSelectArray_Author" + _key)
  1082. userDefaults.synchronize()
  1083. }
  1084. }
  1085. func clearNotification() {
  1086. self.bookViewController.removeNotification()
  1087. self.annotationViewController.removeNotification()
  1088. self.outlineViewController.removeNotification()
  1089. self.thumbnailViewController.removeNotification()
  1090. }
  1091. }
  1092. // MARK: - Analytics (埋点)
  1093. extension KMLeftSideViewController {
  1094. func trackEvent(type: BotaType) -> Void {
  1095. if (type == .Thumbnail) {
  1096. KMAnalytics.trackEvent(eventName: "Btn_LeftSideBar_Thumbnail", parameters: [
  1097. KMAnalytics.Parameter.categoryKey : KMAnalytics.Category.leftSideBar,
  1098. KMAnalytics.Parameter.labelKey : KMAnalytics.Label.leftSideBar_Btn], platform: .AppCenter, appTarget: .all)
  1099. } else if (type == .Outline) {
  1100. KMAnalytics.trackEvent(eventName: "Btn_LeftSideBar_Outline", parameters: [
  1101. KMAnalytics.Parameter.categoryKey : KMAnalytics.Category.leftSideBar,
  1102. KMAnalytics.Parameter.labelKey : KMAnalytics.Label.leftSideBar_Btn], platform: .AppCenter, appTarget: .all)
  1103. } else if (type == .BookMark) {
  1104. KMAnalytics.trackEvent(eventName: "Btn_LeftSideBar_BookMark", parameters: [
  1105. KMAnalytics.Parameter.categoryKey : KMAnalytics.Category.leftSideBar,
  1106. KMAnalytics.Parameter.labelKey : KMAnalytics.Label.leftSideBar_Btn], platform: .AppCenter, appTarget: .all)
  1107. } else if (type == .Annotation) {
  1108. KMAnalytics.trackEvent(eventName: "Btn_LeftSideBar_Annotation", parameters: [
  1109. KMAnalytics.Parameter.categoryKey : KMAnalytics.Category.leftSideBar,
  1110. KMAnalytics.Parameter.labelKey : KMAnalytics.Label.leftSideBar_Btn], platform: .AppCenter, appTarget: .all)
  1111. } else if (type == .Search) {
  1112. KMAnalytics.trackEvent(eventName: "Btn_LeftSideBar_Search", parameters: [
  1113. KMAnalytics.Parameter.categoryKey : KMAnalytics.Category.leftSideBar,
  1114. KMAnalytics.Parameter.labelKey : KMAnalytics.Label.leftSideBar_Btn], platform: .AppCenter, appTarget: .all)
  1115. }
  1116. }
  1117. }
  1118. // MARK: - Private Methods
  1119. extension KMLeftSideViewController {
  1120. @objc private func _themeChanged(_ notification: NSNotification) {
  1121. DispatchQueue.main.asyncAfter(deadline: .now()+0.3) {
  1122. self._updateViewColor()
  1123. }
  1124. }
  1125. private func _updateViewColor() {
  1126. if(KMAppearance.isDarkMode()){
  1127. self.leftListView.layer?.backgroundColor = NSColor(red: 0.149, green: 0.157, blue: 0.169, alpha: 1).cgColor
  1128. self.snapshotNormalView.layer?.backgroundColor = NSColor(red: 0.149, green: 0.157, blue: 0.169, alpha: 1).cgColor
  1129. self.thumbnailView.layer?.backgroundColor = NSColor(red: 0.149, green: 0.157, blue: 0.169, alpha: 1).cgColor
  1130. self.noteView.layer?.backgroundColor = NSColor(red: 0.149, green: 0.157, blue: 0.169, alpha: 1).cgColor
  1131. self.outlineView.layer?.backgroundColor = NSColor(red: 0.149, green: 0.157, blue: 0.169, alpha: 1).cgColor
  1132. self.view.layer?.backgroundColor = NSColor(red: 0.149, green: 0.157, blue: 0.169, alpha: 1).cgColor
  1133. // self.thumbnailTableView.backgroundColor = groupedFindTableView.backgroundColor = tocOutlineView.backgroundColor = findTableView.backgroundColor = [NSColor colorWithRed:0.149 green:0.157 blue:0.169 alpha:1];
  1134. self.snapshotSearchField.layer?.backgroundColor = NSColor(red: 0.224, green: 0.235, blue: 0.243, alpha: 1).cgColor
  1135. self.outlineSearchField.layer?.backgroundColor = NSColor(red: 0.224, green: 0.235, blue: 0.243, alpha: 1).cgColor
  1136. self.noteSearchField.layer?.backgroundColor = NSColor(red: 0.224, green: 0.235, blue: 0.243, alpha: 1).cgColor
  1137. self.segmentedControl.layer?.backgroundColor = NSColor(red: 0.224, green: 0.235, blue: 0.243, alpha: 1).cgColor
  1138. self.snapshotSearchField.backgroundColor = NSColor(red: 0.224, green: 0.235, blue: 0.243, alpha: 1)
  1139. self.outlineSearchField.backgroundColor = NSColor(red: 0.224, green: 0.235, blue: 0.243, alpha: 1)
  1140. self.noteSearchField.backgroundColor = NSColor(red: 0.224, green: 0.235, blue: 0.243, alpha: 1)
  1141. } else {
  1142. self.leftListView.layer?.backgroundColor = NSColor(red: 0.988, green: 0.992, blue: 1, alpha: 1).cgColor
  1143. self.snapshotNormalView.layer?.backgroundColor = NSColor(red: 0.988, green: 0.992, blue: 1, alpha: 1).cgColor
  1144. self.thumbnailView.layer?.backgroundColor = NSColor(red: 0.988, green: 0.992, blue: 1, alpha: 1).cgColor
  1145. self.noteView.layer?.backgroundColor = NSColor(red: 0.988, green: 0.992, blue: 1, alpha: 1).cgColor
  1146. self.outlineView.layer?.backgroundColor = NSColor(red: 0.988, green: 0.992, blue: 1, alpha: 1).cgColor
  1147. self.view.layer?.backgroundColor = NSColor(red: 0.988, green: 0.992, blue: 1, alpha: 1).cgColor
  1148. // thumbnailTableView.backgroundColor = groupedFindTableView.backgroundColor = tocOutlineView.backgroundColor = findTableView.backgroundColor = [NSColor colorWithRed:0.988 green:0.992 blue:1.000 alpha:1];
  1149. self.snapshotSearchField.layer?.backgroundColor = NSColor(red: 0.922, green: 0.925, blue: 0.941, alpha: 1).cgColor
  1150. self.outlineSearchField.layer?.backgroundColor = NSColor(red: 0.922, green: 0.925, blue: 0.941, alpha: 1).cgColor
  1151. self.noteSearchField.layer?.backgroundColor = NSColor(red: 0.922, green: 0.925, blue: 0.941, alpha: 1).cgColor
  1152. self.segmentedControl.layer?.backgroundColor = NSColor(red: 0.922, green: 0.925, blue: 0.941, alpha: 1).cgColor
  1153. self.snapshotSearchField.backgroundColor = NSColor(red: 0.922, green: 0.925, blue: 0.941, alpha: 1)
  1154. self.outlineSearchField.backgroundColor = NSColor(red: 0.922, green: 0.925, blue: 0.941, alpha: 1)
  1155. self.noteSearchField.backgroundColor = NSColor(red: 0.922, green: 0.925, blue: 0.941, alpha: 1)
  1156. }
  1157. }
  1158. /*
  1159. */
  1160. }