|
@@ -8,14 +8,6 @@
|
|
|
import Cocoa
|
|
|
|
|
|
class KMSearchReplaceWindowController_Window: NSWindow {
|
|
|
-// override var isMainWindow: Bool {
|
|
|
-// return true
|
|
|
-// }
|
|
|
-//
|
|
|
-// override var isKeyWindow: Bool {
|
|
|
-// return true
|
|
|
-// }
|
|
|
-
|
|
|
override var canBecomeMain: Bool {
|
|
|
return true
|
|
|
}
|
|
@@ -25,11 +17,22 @@ class KMSearchReplaceWindowController_Window: NSWindow {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+@objc enum KMSearchReplaceType: Int {
|
|
|
+ case none = 0
|
|
|
+ case search = 1
|
|
|
+ case replace = 2
|
|
|
+}
|
|
|
+
|
|
|
class KMSearchReplaceWindowController: NSWindowController {
|
|
|
@IBOutlet weak var titleBarBox: NSBox!
|
|
|
@IBOutlet weak var closeButton: NSButton!
|
|
|
|
|
|
@IBOutlet weak var tabBox: NSBox!
|
|
|
+ @IBOutlet weak var searchTabButton: NSButton!
|
|
|
+ @IBOutlet weak var replaceTabButton: NSButton!
|
|
|
+ @IBOutlet weak var tabBottomLine: NSBox!
|
|
|
+ @IBOutlet weak var tabSelectedLine: NSBox!
|
|
|
+ @IBOutlet weak var tabSelectedLineLeftConst: NSLayoutConstraint!
|
|
|
|
|
|
@IBOutlet weak var searchBox: NSBox!
|
|
|
@IBOutlet weak var searchTitleLabel: NSTextField!
|
|
@@ -48,32 +51,56 @@ class KMSearchReplaceWindowController: NSWindowController {
|
|
|
private var _modalSession: NSApplication.ModalSession?
|
|
|
|
|
|
private var handdler: KMSearchReplaceHanddler = KMSearchReplaceHanddler()
|
|
|
+ private var type_: KMSearchReplaceType = .search
|
|
|
|
|
|
deinit {
|
|
|
KMPrint("KMSearchReplaceWindowController deinit.")
|
|
|
}
|
|
|
|
|
|
- convenience init(with pdfView: CPDFView?) {
|
|
|
+ convenience init(with pdfView: CPDFView?, type: KMSearchReplaceType) {
|
|
|
self.init(windowNibName: "KMSearchReplaceWindowController")
|
|
|
|
|
|
self.handdler.pdfView = pdfView
|
|
|
+ self.type_ = type
|
|
|
}
|
|
|
|
|
|
override func windowDidLoad() {
|
|
|
super.windowDidLoad()
|
|
|
|
|
|
self.initDefaultValue()
|
|
|
+ self.switchType(self.type_)
|
|
|
}
|
|
|
|
|
|
func initDefaultValue() {
|
|
|
self.window?.isMovableByWindowBackground = true
|
|
|
|
|
|
+ self.titleBarBox.boxType = .custom
|
|
|
+ self.titleBarBox.borderWidth = 0
|
|
|
self.closeButton.imagePosition = .imageOnly
|
|
|
self.closeButton.image = NSImage(named: "KMImageNameUXIconBtnCloseNor")
|
|
|
self.closeButton.target = self
|
|
|
self.closeButton.action = #selector(_closeAction)
|
|
|
|
|
|
+ self.searchTabButton.target = self
|
|
|
+ self.searchTabButton.action = #selector(_searchTabAction)
|
|
|
+ self.searchTabButton.title = " \(NSLocalizedString("Search", comment: ""))"
|
|
|
+ self.searchTabButton.image = NSImage(named: "KMImageNameSearchIcon")
|
|
|
+ self.searchTabButton.imagePosition = .imageLeft
|
|
|
+// self.searchTabButton.imageHugsTitle = true
|
|
|
+
|
|
|
+ self.replaceTabButton.target = self
|
|
|
+ self.replaceTabButton.action = #selector(_replaceTabAction)
|
|
|
+ self.replaceTabButton.title = " \(NSLocalizedString("Replace", comment: ""))"
|
|
|
+ self.replaceTabButton.image = NSImage(named: "KMImageNameReplaceIcon")
|
|
|
+ self.replaceTabButton.imagePosition = .imageLeft
|
|
|
+ self.tabSelectedLine.borderWidth = 0
|
|
|
+ self.tabSelectedLine.fillColor = NSColor(hex: "#4982E6")
|
|
|
+
|
|
|
+ self.searchBox.borderWidth = 0
|
|
|
self.searchTitleLabel.stringValue = NSLocalizedString("Search", comment: "")
|
|
|
+ self.searchInputBox.cornerRadius = 0
|
|
|
+ self.searchInputView.drawsBackground = false
|
|
|
+ self.searchInputView.isBordered = false
|
|
|
self.searchInputView.delegate = self
|
|
|
|
|
|
self.matchWholeCheck.title = NSLocalizedString("Whole Words Only", comment: "")
|
|
@@ -111,6 +138,71 @@ class KMSearchReplaceWindowController: NSWindowController {
|
|
|
self.handdler.showSelection(model.selection)
|
|
|
}
|
|
|
|
|
|
+ @objc private func _searchTabAction(_ sender: NSButton) {
|
|
|
+ self.switchType(.search, animate: true)
|
|
|
+ }
|
|
|
+
|
|
|
+ @objc private func _replaceTabAction(_ sender: NSButton) {
|
|
|
+ self.switchType(.replace, animate: true)
|
|
|
+ }
|
|
|
+
|
|
|
+ func switchType(_ type: KMSearchReplaceType, animate: Bool = false) {
|
|
|
+ if type == .replace {
|
|
|
+ if IAPProductsManager.default().isAvailableAllFunction() == false {
|
|
|
+ KMPurchaseCompareWindowController.sharedInstance().showWindow(nil)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ self.type_ = type
|
|
|
+
|
|
|
+ let selectedColor = NSColor(hex: "0E1114")
|
|
|
+ let unSelectedColor = NSColor(hex: "757780")
|
|
|
+ if type == .search { // 248
|
|
|
+ self.tabSelectedLineLeftConst.constant = 24
|
|
|
+
|
|
|
+ self.searchTabButton.setTitleColor(selectedColor)
|
|
|
+ self.searchTabButton.image = NSImage(named: "KMImageNameSearchIcon")
|
|
|
+ self.replaceTabButton.setTitleColor(unSelectedColor)
|
|
|
+ self.replaceTabButton.image = NSImage(named: "KMImageNameReplaceUnselectedIcon")
|
|
|
+
|
|
|
+// DispatchQueue.main.async {
|
|
|
+ self.replaceBox.isHidden = true
|
|
|
+ self.bottomBarBox.isHidden = true
|
|
|
+// }
|
|
|
+
|
|
|
+ var frame = self.window?.frame ?? .zero
|
|
|
+ let height: CGFloat = 248+20
|
|
|
+ let heightOffset = frame.size.height - height
|
|
|
+ frame.origin.y += heightOffset
|
|
|
+ frame.size.height = height
|
|
|
+ self.window?.setFrame(frame, display: true, animate: animate)
|
|
|
+ self.window?.minSize = frame.size
|
|
|
+ self.window?.maxSize = frame.size
|
|
|
+ } else if type == .replace { // 388
|
|
|
+ self.tabSelectedLineLeftConst.constant = 140
|
|
|
+
|
|
|
+ self.searchTabButton.setTitleColor(unSelectedColor)
|
|
|
+ self.searchTabButton.image = NSImage(named: "KMImageNameSearchUnselectedIcon")
|
|
|
+ self.replaceTabButton.setTitleColor(selectedColor)
|
|
|
+ self.replaceTabButton.image = NSImage(named: "KMImageNameReplaceIcon")
|
|
|
+
|
|
|
+ DispatchQueue.main.async {
|
|
|
+ self.replaceBox.isHidden = false
|
|
|
+ self.bottomBarBox.isHidden = false
|
|
|
+ }
|
|
|
+
|
|
|
+ var frame = self.window?.frame ?? .zero
|
|
|
+ let height:CGFloat = 388
|
|
|
+ let heightOffset = frame.size.height-height
|
|
|
+ frame.origin.y += heightOffset
|
|
|
+ frame.size.height = height
|
|
|
+ self.window?.setFrame(frame, display: true, animate: animate)
|
|
|
+ self.window?.minSize = frame.size
|
|
|
+ self.window?.maxSize = frame.size
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
func startModal(_ sender: AnyObject?) {
|
|
|
NSApp.stopModal()
|
|
|
|
|
@@ -147,7 +239,9 @@ extension KMSearchReplaceWindowController: NSTextFieldDelegate {
|
|
|
if let inputView = control as? NSTextField {
|
|
|
// //当当前TextField按下enter
|
|
|
if inputView == self.searchInputView {
|
|
|
- self.handdler.search(keyword: self.searchInputView.stringValue, isCase: false, isWholeWord: false, callback: { [weak self] datas in
|
|
|
+ let isCase = self.caseSensitiveCheck.state == .on
|
|
|
+ let isWholeWord = self.matchWholeCheck.state == .on
|
|
|
+ self.handdler.search(keyword: self.searchInputView.stringValue, isCase: isCase, isWholeWord: isWholeWord, callback: { [weak self] datas in
|
|
|
if let sel = datas?.first?.selection {
|
|
|
self?.handdler.showIdx = 0
|
|
|
self?.handdler.showSelection(sel)
|