// // KMPDFSecToolbarController.swift // PDF Reader Pro // // Created by Niehaoyu on 2024/10/8. // import Cocoa import KMComponentLibrary @objc protocol KMPDFSecToolbarControllerDelegate: AnyObject { @objc optional func kmPDFSecToolbarControllerDidItemClickedEnable(_ controller: KMPDFSecToolbarController, _ property: Any) -> Bool @objc optional func kmPDFSecToolbarControllerDidItemClicked(_ controller: KMPDFSecToolbarController, _ property: Any) @objc optional func kmPDFSecToolbarControllerDidSelectTextDidBeginEditing(_ controller: KMPDFSecToolbarController, _ view: ComponentSelect) @objc optional func kmPDFSecToolbarControllerDidSelectTextDidChange(_ controller: KMPDFSecToolbarController, _ view: ComponentSelect) @objc optional func kmPDFSecToolbarControllerDidSelectTextDidEndEditing(_ controller: KMPDFSecToolbarController, _ view: ComponentSelect) } class KMPDFSecToolbarController: KMNBaseViewController { @IBOutlet var contendBox: NSBox! @IBOutlet var sepDivider: ComponentDivider! @IBOutlet var infoContendView: NSView! @IBOutlet var rightContendView: NSView! @IBOutlet var moreToolsBGView: NSView! @IBOutlet var moreToolsView: ComponentDropdownTool! @IBOutlet var contendLeftConst: NSLayoutConstraint! @IBOutlet var contendViewWidthConst: NSLayoutConstraint! @IBOutlet var rightContendViewWidthConst: NSLayoutConstraint! private var _propertys: [NSObject] = [] var propertys: [NSObject] { get { return _propertys } } private var propertysWidthValue: CGFloat = 0 private var lastPropertyWidth: CGFloat = 0 private var hidePropertys: [Any] = [] private var rightPropertys: [Any] = [] var pdfView: CPDFListView? var viewManager: KMPDFViewManager? weak open var delegate: KMPDFSecToolbarControllerDelegate? //MARK: - func override func viewWillLayout() { super.viewWillLayout() let contendXValue = CGRectGetWidth(view.frame)/2 - propertysWidthValue/2 contendLeftConst.constant = max(0, contendXValue) if contendXValue <= 0 { contendViewWidthConst.constant = CGRectGetWidth(view.frame) } else { contendViewWidthConst.constant = propertysWidthValue } hidePropertys.removeAll() moreToolsBGView.isHidden = true let subviews = infoContendView.subviews for view in subviews { if CGRectGetMidX(view.frame) > CGRectGetWidth(self.view.frame) - lastPropertyWidth { moreToolsBGView.isHidden = false view.isHidden = true if view is ComponentButton { hidePropertys.append((view as! ComponentButton).properties) } else if view is ComponentDropdownTool { hidePropertys.append((view as! ComponentDropdownTool).properties) } } else { view.isHidden = false } } NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(setUpHidePropertys), object: nil) self.perform(#selector(setUpHidePropertys), with: nil, afterDelay: 0.35) } override func viewDidLoad() { super.viewDidLoad() // Do view setup here. setUpProperty() } override func updateUIThemeColor() { super.updateUIThemeColor() setUpUI() } override func updateUILanguage() { super.updateUILanguage() guard let _ = infoContendView else { return } let subviews = infoContendView.subviews for view in subviews { if let button = view as? ComponentButton { button.properties.buttonText = KMLocalizedString(button.properties.englishTitle ?? "") let buttonProperty = button.properties if buttonProperty.identifier == KMPDFToolbar_highlight_Identifier { button.toolTip = String(format: "%@ (⌃⌘H)", KMLocalizedString("Highlight", comment: "")) } else if buttonProperty.identifier == KMPDFToolbar_underline_Identifier { button.toolTip = String(format: "%@ (⌃⌘U)", KMLocalizedString("Underline", comment: "")) } else if buttonProperty.identifier == KMPDFToolbar_waveline_Identifier { button.toolTip = String(format: "%@ (⌃⌘V)", KMLocalizedString("Squiggly", comment: "")) } else if buttonProperty.identifier == KMPDFToolbar_strikethrough_Identifier { button.toolTip = String(format: "%@ (⌃⌘S)", KMLocalizedString("Strikethrough", comment: "")) } else if buttonProperty.identifier == KMPDFToolbar_text_Identifier { button.toolTip = String(format: "%@ (⌃⌘T)", KMLocalizedString("Text Note", comment: "")) } else if buttonProperty.identifier == KMPDFToolbar_note_Identifier { button.toolTip = String(format: "%@ (⌃⌘N)", KMLocalizedString("Anchored Note", comment: "")) } else if buttonProperty.identifier == KMPDFToolbar_pen_Identifier { button.toolTip = KMLocalizedString("Add freehand drawings by hand writing just like you do with a pen.", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_eraser_Identifier { button.toolTip = KMLocalizedString("Eraser", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_rectangle_Identifier { button.toolTip = KMLocalizedString("Draw rectangle; draw square by holding Shift key", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_circle_Identifier { button.toolTip = KMLocalizedString("Draw oval; draw circle by holding Shift key", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_arrow_Identifier { button.toolTip = KMLocalizedString("Draw arrow; draw straight arrow by holding Shift key", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_stamp_Identifier { button.toolTip = KMLocalizedString("Add New Stamp", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_line_Identifier { button.toolTip = KMLocalizedString("Draw line; draw straight line by holding Shift key", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_sign_Identifier { button.toolTip = KMLocalizedString("Sign document by typing or drawing a signature", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_eye_Identifier { button.toolTip = KMLocalizedString("Hide", comment: "") if self.pdfView?.hideNotes == true { button.toolTip = KMLocalizedString("Display", comment: "") } } else if buttonProperty.identifier == KMPDFToolbar_edit_text_Identifier { button.toolTip = KMLocalizedString("Add Text", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_edit_image_Identifier { button.toolTip = KMLocalizedString("Add Image", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_edit_link_Identifier { button.toolTip = KMLocalizedString("Select an area or text on a page for a link to be inserted.", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_form_text_Identifier { button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_form_checkbox_Identifier { button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_form_radio_Identifier { button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_form_list_Identifier { button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_form_dropdown_Identifier { button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_form_OK_Identifier { button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_form_digitalSign_Identifier { button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_fill_tick_Identifier { button.toolTip = KMLocalizedString("Add check mark", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_fill_fork_Identifier { button.toolTip = KMLocalizedString("Add X", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_fill_rectangle_Identifier { button.toolTip = KMLocalizedString("Add circle", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_fill_line_Identifier { button.toolTip = KMLocalizedString("Add line", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_fill_dot_Identifier { button.toolTip = KMLocalizedString("Add dot", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_fill_date_Identifier { button.toolTip = KMLocalizedString("Date", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_fill_sign_Identifier { button.toolTip = KMLocalizedString("Sign document by typing or drawing a signature", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_convert_word_Identifier { button.toolTip = KMLocalizedString("Convert all the great work stored in your PDF to a Word document that’s easy to update. Keep the fonts and layouts intact — including bullets and tables.", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_convert_excel_Identifier { button.toolTip = KMLocalizedString("Skip the data entry steps and tedious reformatting tasks, too. When you convert to Excel, your data is preserved along with your columns, layouts, and formatting.", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_convert_ppt_Identifier { button.toolTip = KMLocalizedString("When you use PDF Reader Pro to convert PDFs to PowerPoint, you know your formats will be saved, too. So you don’t have to bother redoing bullets, tables, objects, or master layouts.", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_convert_image_Identifier { button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_convert_imageToPDF_Identifier { button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_protect_redact_Identifier { button.toolTip = KMLocalizedString("Mark for redaction", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_protect_security_Identifier { button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_protect_removeSecurity_Identifier { button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_protect_digitalSign_Identifier { button.toolTip = KMLocalizedString("Digital signature ensures the authenticity and integrity of digital files. Click and drag the cursor to create a signature field on the page.", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_tools_OCR_Identifier { button.toolTip = KMLocalizedString("Recognize text from Image-based or Scanned PDF with OCR", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_tools_merge_Identifier { button.toolTip = KMLocalizedString("Combine multiple documents into a new PDF, or borrow individual pages", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_tools_TTS_Identifier { button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_tools_batch_Identifier { button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_tools_extractImage_Identifier { button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "") } else if buttonProperty.identifier == KMPDFToolbar_tools_AITools_Identifier { button.toolTip = KMLocalizedString(buttonProperty.englishTitle ?? "", comment: "") } } else if let dropdownTool = view as? ComponentDropdownTool { dropdownTool.properties.text = KMLocalizedString(dropdownTool.properties.englishTitle ?? "") for menuItem in dropdownTool.properties.menuItemArr ?? [] { menuItem.text = KMLocalizedString(menuItem.englishTitle) } } else if let select = view as? ComponentSelect { select.properties.placeholder = KMLocalizedString(select.properties.englishPlaceholder ?? "") for menuItem in select.menuitemPropertys { menuItem.text = KMLocalizedString(menuItem.englishTitle) } } } reloadMainview() } //MARK: - Setup func setUpProperty() { setUpUI() moreToolsBGView.wantsLayer = true moreToolsBGView.layer?.backgroundColor = contendBox.fillColor.cgColor moreToolsBGView.isHidden = true moreToolsView.properties = ComponentDropdownToolProperty(state: .normal, leftIcon: NSImage(named: "toolbar_doubleArrow_right")) moreToolsView.delegate = self } func setUpUI() { contendBox.fillColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-middle") } @objc func setUpHidePropertys() { var menuItemArr: [ComponentMenuitemProperty] = [] for item in hidePropertys { if item is ComponentButtonProperty { let menuItem = ComponentMenuitemProperty(type: .normal, text: (item as! ComponentButtonProperty).buttonText ?? "", identifier: (item as! ComponentButtonProperty).identifier) menuItemArr.append(menuItem) } else if item is ComponentDropdownToolProperty { let menuItem = ComponentMenuitemProperty(type: .normal, text: (item as! ComponentDropdownToolProperty).text ?? "", identifier: "") if let subItems = (item as! ComponentDropdownToolProperty).menuItemArr { menuItem.subPropertys = subItems } menuItemArr.append(menuItem) } } moreToolsView.properties.menuItemArr = menuItemArr } //MARK: - Getter func returnIDWithSubToolMode(_ subToolMode: KMPDFSubToolMode) -> String { if subToolMode == .Highlight { return KMPDFToolbar_highlight_Identifier } else if subToolMode == .Underline { return KMPDFToolbar_underline_Identifier } else if subToolMode == .Waveline { return KMPDFToolbar_waveline_Identifier } else if subToolMode == .Strikethrough { return KMPDFToolbar_strikethrough_Identifier } else if subToolMode == .Text { return KMPDFToolbar_text_Identifier } else if subToolMode == .Note { return KMPDFToolbar_note_Identifier } else if subToolMode == .Pen { return KMPDFToolbar_pen_Identifier } else if subToolMode == .Eraser { return KMPDFToolbar_eraser_Identifier } else if subToolMode == .Rectangle { return KMPDFToolbar_rectangle_Identifier } else if subToolMode == .Circle { return KMPDFToolbar_circle_Identifier } else if subToolMode == .Arrow { return KMPDFToolbar_arrow_Identifier } else if subToolMode == .Line { return KMPDFToolbar_line_Identifier } else if subToolMode == .Measure { return KMPDFToolbar_measure_Identifier } else if subToolMode == .Stamp { return KMPDFToolbar_stamp_Identifier } else if subToolMode == .Sign { return KMPDFToolbar_sign_Identifier } else if subToolMode == .Edit_text { return KMPDFToolbar_edit_text_Identifier } else if subToolMode == .Edit_Image { return KMPDFToolbar_edit_image_Identifier } else if subToolMode == .Edit_Link { return KMPDFToolbar_edit_link_Identifier } else if subToolMode == .Edit_Crop { return KMPDFToolbar_edit_crop_Identifier } else if subToolMode == .Fill_tick { return KMPDFToolbar_fill_tick_Identifier } else if subToolMode == .fill_fork { return KMPDFToolbar_fill_fork_Identifier } else if subToolMode == .fill_rectangle { return KMPDFToolbar_fill_rectangle_Identifier } else if subToolMode == .fill_line { return KMPDFToolbar_fill_line_Identifier } else if subToolMode == .fill_dot { return KMPDFToolbar_fill_dot_Identifier } else if subToolMode == .fill_date { return KMPDFToolbar_fill_date_Identifier } else if subToolMode == .fill_sign { return KMPDFToolbar_fill_sign_Identifier } else if subToolMode == .Form_text { return KMPDFToolbar_form_text_Identifier } else if subToolMode == .Form_checkbox { return KMPDFToolbar_form_checkbox_Identifier } else if subToolMode == .Form_radio { return KMPDFToolbar_form_radio_Identifier } else if subToolMode == .Form_list { return KMPDFToolbar_form_list_Identifier } else if subToolMode == .Form_dropdown { return KMPDFToolbar_form_dropdown_Identifier } else if subToolMode == .Form_OK { return KMPDFToolbar_form_OK_Identifier } else if subToolMode == .Form_digitalSign { return KMPDFToolbar_form_digitalSign_Identifier } else if subToolMode == .Redact { return KMPDFToolbar_protect_redact_Identifier } else if subToolMode == .Digital_Sign { return KMPDFToolbar_protect_digitalSign_Identifier } else if subToolMode == .Tool_OCR { return KMPDFToolbar_tools_OCR_Identifier } return "" } func returnSubToolModeWithID(_ identifier: String) -> KMPDFSubToolMode { if identifier == KMPDFToolbar_highlight_Identifier { return .Highlight } else if identifier == KMPDFToolbar_underline_Identifier { return .Underline } else if identifier == KMPDFToolbar_waveline_Identifier { return .Waveline } else if identifier == KMPDFToolbar_strikethrough_Identifier { return .Strikethrough } else if identifier == KMPDFToolbar_text_Identifier { return .Text } else if identifier == KMPDFToolbar_note_Identifier { return .Note } else if identifier == KMPDFToolbar_pen_Identifier { return .Pen } else if identifier == KMPDFToolbar_eraser_Identifier { return .Eraser } else if identifier == KMPDFToolbar_rectangle_Identifier { return .Rectangle } else if identifier == KMPDFToolbar_circle_Identifier { return .Circle } else if identifier == KMPDFToolbar_arrow_Identifier { return .Arrow } else if identifier == KMPDFToolbar_line_Identifier { return .Line } else if identifier == KMPDFToolbar_measure_Identifier { return .Measure } else if identifier == KMPDFToolbar_stamp_Identifier { return .Stamp } else if identifier == KMPDFToolbar_sign_Identifier { return .Sign } else if identifier == KMPDFToolbar_edit_text_Identifier { return .Edit_text } else if identifier == KMPDFToolbar_edit_image_Identifier { return .Edit_Image } else if identifier == KMPDFToolbar_edit_link_Identifier { return .Edit_Link } else if identifier == KMPDFToolbar_edit_crop_Identifier { return .Edit_Crop } else if identifier == KMPDFToolbar_fill_tick_Identifier { return .Fill_tick } else if identifier == KMPDFToolbar_fill_fork_Identifier { return .fill_fork } else if identifier == KMPDFToolbar_fill_rectangle_Identifier { return .fill_rectangle } else if identifier == KMPDFToolbar_fill_line_Identifier { return .fill_line } else if identifier == KMPDFToolbar_fill_dot_Identifier { return .fill_dot } else if identifier == KMPDFToolbar_fill_date_Identifier { return .fill_date } else if identifier == KMPDFToolbar_fill_sign_Identifier { return .fill_sign } else if identifier == KMPDFToolbar_form_text_Identifier { return .Form_text } else if identifier == KMPDFToolbar_form_checkbox_Identifier { return .Form_checkbox } else if identifier == KMPDFToolbar_form_radio_Identifier { return .Form_radio } else if identifier == KMPDFToolbar_form_list_Identifier { return .Form_list } else if identifier == KMPDFToolbar_form_dropdown_Identifier { return .Form_dropdown } else if identifier == KMPDFToolbar_form_OK_Identifier { return .Form_OK } else if identifier == KMPDFToolbar_form_digitalSign_Identifier { return .Form_digitalSign } else if identifier == KMPDFToolbar_protect_redact_Identifier { return .Redact } else if identifier == KMPDFToolbar_protect_digitalSign_Identifier { return .Digital_Sign } else if identifier == KMPDFToolbar_tools_OCR_Identifier { return .Tool_OCR } return .None } //MARK: - reload public func reloadMainPropertys(_ arr: [NSObject]) { _propertys.removeAll() for item in arr { _propertys.append(item) } setupMainView() } public func reloadRightPropertys(_ arr: [Any]) { rightPropertys.removeAll() for item in arr { rightPropertys.append(item) } setupRightView() } func setupMainView() { guard let _ = infoContendView else { return } let subviews = infoContendView.subviews for view in subviews { view.removeFromSuperview() } var itemXvalue: CGFloat = 0 for property in propertys { if property is ComponentButtonProperty { let buttonProperty = (property as! ComponentButtonProperty) buttonProperty.buttonText = KMLocalizedString(buttonProperty.englishTitle ?? "") let button = ComponentButton.init() button.properties = buttonProperty if buttonProperty.onlyIcon { button.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, 28, 28) } else { button.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, button.properties.propertyInfo.viewWidth, 28) } button.setTarget(self, action: #selector(buttonClicked(_:))) if buttonProperty.identifier == KMPDFToolbar_highlight_Identifier { button.keyEquivalent = "H" button.keyEquivalentModifierMask = [.control, .command] } else if buttonProperty.identifier == KMPDFToolbar_underline_Identifier { button.keyEquivalent = "U" button.keyEquivalentModifierMask = [.control, .command] } else if buttonProperty.identifier == KMPDFToolbar_waveline_Identifier { button.keyEquivalent = "V" button.keyEquivalentModifierMask = [.control, .command] } else if buttonProperty.identifier == KMPDFToolbar_strikethrough_Identifier { button.keyEquivalent = "S" button.keyEquivalentModifierMask = [.control, .command] } else if buttonProperty.identifier == KMPDFToolbar_text_Identifier { button.keyEquivalent = "T" button.keyEquivalentModifierMask = [.control, .command] } else if buttonProperty.identifier == KMPDFToolbar_note_Identifier { button.keyEquivalent = "N" button.keyEquivalentModifierMask = [.control, .command] } else if buttonProperty.identifier == KMPDFToolbar_pen_Identifier { button.keyEquivalent = "P" button.keyEquivalentModifierMask = [.control, .command] } else if buttonProperty.identifier == KMPDFToolbar_eraser_Identifier { button.keyEquivalent = "E" button.keyEquivalentModifierMask = [.control, .command] } else if buttonProperty.identifier == KMPDFToolbar_rectangle_Identifier { button.keyEquivalent = "R" button.keyEquivalentModifierMask = [.control, .command] } else if buttonProperty.identifier == KMPDFToolbar_circle_Identifier { button.keyEquivalent = "O" button.keyEquivalentModifierMask = [.control, .command] } else if buttonProperty.identifier == KMPDFToolbar_arrow_Identifier { button.keyEquivalent = "A" button.keyEquivalentModifierMask = [.control, .command] } else if buttonProperty.identifier == KMPDFToolbar_line_Identifier { button.keyEquivalent = "L" button.keyEquivalentModifierMask = [.control, .command] } else if buttonProperty.identifier == KMPDFToolbar_edit_text_Identifier { button.keyEquivalent = "T" button.keyEquivalentModifierMask = [.shift, .command] } else if buttonProperty.identifier == KMPDFToolbar_edit_image_Identifier { button.keyEquivalent = "I" button.keyEquivalentModifierMask = [.shift, .command] } else if buttonProperty.identifier == KMPDFToolbar_edit_link_Identifier { button.keyEquivalent = "L" button.keyEquivalentModifierMask = [.shift, .command] } infoContendView.addSubview(button) itemXvalue += CGRectGetWidth(button.frame) itemXvalue += 12 lastPropertyWidth = CGRectGetWidth(button.frame) } else if property is ComponentDividerProperty { let divider = ComponentDivider.init() divider.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-8, 1, 16) divider.properties = (property as! ComponentDividerProperty) infoContendView.addSubview(divider) itemXvalue += 1 itemXvalue += 12 lastPropertyWidth = CGRectGetWidth(divider.frame) } else if property is ComponentDropdownToolProperty { let dropdownTool = ComponentDropdownTool.init() (property as! ComponentDropdownToolProperty).text = KMLocalizedString((property as! ComponentDropdownToolProperty).englishTitle ?? "") if let items = (property as! ComponentDropdownToolProperty).menuItemArr { for menuItem in items { menuItem.text = KMLocalizedString(menuItem.englishTitle) } } dropdownTool.properties = property as! ComponentDropdownToolProperty dropdownTool.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, dropdownTool.properties.propertyInfo.viewWidth, 28) dropdownTool.delegate = self infoContendView.addSubview(dropdownTool) itemXvalue += CGRectGetWidth(dropdownTool.frame) itemXvalue += 12 lastPropertyWidth = CGRectGetWidth(dropdownTool.frame) } else if property is ComponentSelectProperties { let selectView = ComponentSelect.init() (property as! ComponentSelectProperties).placeholder = KMLocalizedString((property as! ComponentSelectProperties).englishPlaceholder ?? "") selectView.properties = property as! ComponentSelectProperties selectView.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, 144, 28) if let items = selectView.properties.menuItemArr { for menuItem in items { menuItem.text = KMLocalizedString(menuItem.englishTitle) } selectView.updateMenuItemsArr(items) } selectView.delegate = self infoContendView.addSubview(selectView) itemXvalue += CGRectGetWidth(selectView.frame) itemXvalue += 12 lastPropertyWidth = CGRectGetWidth(selectView.frame) } } itemXvalue -= 12 propertysWidthValue = itemXvalue contendViewWidthConst.constant = propertysWidthValue contendLeftConst.constant = CGRectGetWidth(view.frame)/2 - propertysWidthValue/2 updateUILanguage() } func setupRightView() { let subviews = rightContendView.subviews for view in subviews { view.removeFromSuperview() } var itemXvalue: CGFloat = 0 for property in rightPropertys { if property is ComponentButtonProperty { let buttonProperty = (property as! ComponentButtonProperty) let button = ComponentButton.init() button.properties = buttonProperty if buttonProperty.onlyIcon { button.frame = CGRectMake(itemXvalue, 0, 28, 28) } else { button.frame = CGRectMake(itemXvalue, 0, button.properties.propertyInfo.viewWidth, 28) } button.setTarget(self, action: #selector(buttonClicked(_:))) rightContendView.addSubview(button) itemXvalue += CGRectGetWidth(button.frame) itemXvalue += 12 } else if property is ComponentDividerProperty { let divider = ComponentDivider.init() divider.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-8, 1, 16) divider.properties = (property as! ComponentDividerProperty) rightContendView.addSubview(divider) itemXvalue += 1 itemXvalue += 12 } } itemXvalue -= 12 rightContendViewWidthConst.constant = itemXvalue } func reloadMainview() { guard let _ = infoContendView else { return } var itemXvalue: CGFloat = 0 let subviews = infoContendView.subviews for view in subviews { if let button = view as? ComponentButton { if button.properties.onlyIcon { button.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, 28, 28) } else { button.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, button.properties.propertyInfo.viewWidth, 28) } button.reloadData() itemXvalue += CGRectGetWidth(button.frame) itemXvalue += 12 } else if let dropdownTool = view as? ComponentDropdownTool { dropdownTool.properties = dropdownTool.properties dropdownTool.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, dropdownTool.properties.propertyInfo.viewWidth, 28) itemXvalue += CGRectGetWidth(dropdownTool.frame) itemXvalue += 12 } else if let selectView = view as? ComponentSelect { selectView.reloadData() selectView.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, 144, 28) itemXvalue += CGRectGetWidth(selectView.frame) itemXvalue += 12 } else if let divider = view as? ComponentDivider { divider.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-8, 1, 16) itemXvalue += 1 itemXvalue += 12 } } itemXvalue -= 12 propertysWidthValue = itemXvalue contendViewWidthConst.constant = propertysWidthValue contendLeftConst.constant = CGRectGetWidth(view.frame)/2 - propertysWidthValue/2 } func reloadRightview() { guard let _ = infoContendView else { return } let subviews = rightContendView.subviews for view in subviews { if view is ComponentButton { (view as! ComponentButton).reloadData() } } } func refreshToolbarModeInfo() { guard let viewManager = self.viewManager else { return } let subviews = infoContendView.subviews for view in subviews { if view is ComponentButton { let item = (view as! ComponentButton) let resultID = self.returnIDWithSubToolMode(viewManager.subToolMode) if item.properties.identifier != resultID { if item.properties.state == .pressed { item.properties.state = .normal item.reloadData() } } else { if item.properties.state != .pressed { item.properties.state = .pressed item.reloadData() } } } } } //MARK: - @objc func buttonClicked(_ sender: ComponentButton) { self.buttonClickedWithProperty(sender.properties) } func buttonClickedWithProperty(_ property: ComponentButtonProperty) { if delegate?.kmPDFSecToolbarControllerDidItemClickedEnable?(self, property) == false { refreshToolbarModeInfo() return } let subToolMode = returnSubToolModeWithID(property.identifier) if subToolMode != .None { if viewManager?.subToolMode == subToolMode { viewManager?.subToolMode = .None } else { viewManager?.subToolMode = subToolMode } } else { viewManager?.subToolMode = .None } if viewManager?.subToolMode == .Highlight || viewManager?.subToolMode == .Underline || viewManager?.subToolMode == .Waveline || viewManager?.subToolMode == .Strikethrough || viewManager?.subToolMode == .Text || viewManager?.subToolMode == .Note || viewManager?.subToolMode == .Pen || viewManager?.subToolMode == .Eraser || viewManager?.subToolMode == .Rectangle || viewManager?.subToolMode == .Circle || viewManager?.subToolMode == .Arrow || viewManager?.subToolMode == .Line || viewManager?.subToolMode == .Measure || viewManager?.subToolMode == .Stamp || viewManager?.subToolMode == .Sign { if viewManager?.toolMode != .Markup { viewManager?.toolMode = .Markup } } refreshToolbarModeInfo() delegate?.kmPDFSecToolbarControllerDidItemClicked?(self, property) } //MARK: - Mouse override func mouseDown(with event: NSEvent) { super.mouseDown(with: event) view.window?.makeFirstResponder(self) } } //MARK: - ComponentDropdownToolDelegate extension KMPDFSecToolbarController: ComponentDropdownToolDelegate { func componentDropdownToolDidClickedSelf(_ view: ComponentDropdownTool) { delegate?.kmPDFSecToolbarControllerDidItemClicked?(self, view.properties) } func componentDropdownToolDidShowPopupView(_ view: ComponentDropdownTool) { delegate?.kmPDFSecToolbarControllerDidItemClicked?(self, view.properties) } func componentDropdownToolDidClicked(_ view: ComponentDropdownTool, menuItem: ComponentMenuitemProperty?) { if let property = menuItem { property.itemSelected = false property.state = .normal if delegate?.kmPDFSecToolbarControllerDidItemClickedEnable?(self, property) == false { return } delegate?.kmPDFSecToolbarControllerDidItemClicked?(self, property) } } } //MARK: - ComponentSelectDelegate extension KMPDFSecToolbarController: ComponentSelectDelegate { func componentSelectDidSelect(view: ComponentSelect?, menuItemProperty: ComponentMenuitemProperty?) { if let property = menuItemProperty { property.itemSelected = false property.state = .normal delegate?.kmPDFSecToolbarControllerDidItemClicked?(self, property) } } func componentSelectTextDidBeginEditing(_ view: ComponentSelect) { delegate?.kmPDFSecToolbarControllerDidSelectTextDidBeginEditing?(self, view) } func componentSelectTextDidChange(_ view: ComponentSelect) { delegate?.kmPDFSecToolbarControllerDidSelectTextDidChange?(self, view) } func componentSelectTextDidEndEditing(_ view: ComponentSelect) { delegate?.kmPDFSecToolbarControllerDidSelectTextDidEndEditing?(self, view) } }