PrefWindow // Implementing PhraseEditorCocoa.
This commit is contained in:
parent
2ff3f0f0d0
commit
36e9a0c1dd
|
@ -18,6 +18,7 @@ extension NSToolbarItem.Identifier {
|
|||
fileprivate static let ofGeneral = NSToolbarItem.Identifier(rawValue: "tabGeneral")
|
||||
fileprivate static let ofExperience = NSToolbarItem.Identifier(rawValue: "tabExperience")
|
||||
fileprivate static let ofDictionary = NSToolbarItem.Identifier(rawValue: "tabDictionary")
|
||||
fileprivate static let ofPhrases = NSToolbarItem.Identifier(rawValue: "tabPhrases")
|
||||
fileprivate static let ofCassette = NSToolbarItem.Identifier(rawValue: "tabCassette")
|
||||
fileprivate static let ofKeyboard = NSToolbarItem.Identifier(rawValue: "tabKeyboard")
|
||||
fileprivate static let ofDevZone = NSToolbarItem.Identifier(rawValue: "tabDevZone")
|
||||
|
@ -38,9 +39,30 @@ class CtlPrefWindow: NSWindowController {
|
|||
@IBOutlet var tglControlDevZoneIMKCandidate: NSButton!
|
||||
@IBOutlet var cmbCandidateFontSize: NSPopUpButton!
|
||||
|
||||
@IBOutlet var cmbPEInputModeMenu: NSPopUpButton!
|
||||
@IBOutlet var cmbPEDataTypeMenu: NSPopUpButton!
|
||||
@IBOutlet var btnPEReload: NSButton!
|
||||
@IBOutlet var btnPEConsolidate: NSButton!
|
||||
@IBOutlet var btnPESave: NSButton!
|
||||
@IBOutlet var btnPEAdd: NSButton!
|
||||
@IBOutlet var btnPEOpenExternally: NSButton!
|
||||
@IBOutlet var tfdPETextEditor: NSTextView!
|
||||
@IBOutlet var txtPECommentField: NSTextField!
|
||||
@IBOutlet var txtPEField1: NSTextField!
|
||||
@IBOutlet var txtPEField2: NSTextField!
|
||||
@IBOutlet var txtPEField3: NSTextField!
|
||||
var isLoading = false {
|
||||
didSet { setPEUIControlAvailability() }
|
||||
}
|
||||
|
||||
var isSaved = false {
|
||||
didSet { setPEUIControlAvailability() }
|
||||
}
|
||||
|
||||
@IBOutlet var vwrGeneral: NSView!
|
||||
@IBOutlet var vwrExperience: NSView!
|
||||
@IBOutlet var vwrDictionary: NSView!
|
||||
@IBOutlet var vwrPhrases: NSView!
|
||||
@IBOutlet var vwrCassette: NSView!
|
||||
@IBOutlet var vwrKeyboard: NSView!
|
||||
@IBOutlet var vwrDevZone: NSView!
|
||||
|
@ -152,6 +174,8 @@ class CtlPrefWindow: NSWindowController {
|
|||
if PrefMgr.shared.useIMKCandidateWindow {
|
||||
selectionKeyComboBox.isEnabled = false // 無法與 IMKCandidates 協作,故禁用。
|
||||
}
|
||||
|
||||
initPhraseEditor()
|
||||
}
|
||||
|
||||
// 這裡有必要加上這段處理,用來確保藉由偏好設定介面動過的 CNS 開關能夠立刻生效。
|
||||
|
@ -343,6 +367,8 @@ class CtlPrefWindow: NSWindowController {
|
|||
}
|
||||
}
|
||||
|
||||
// MARK: - NSToolbarDelegate Methods
|
||||
|
||||
extension CtlPrefWindow: NSToolbarDelegate {
|
||||
func use(view: NSView) {
|
||||
guard let window = window else {
|
||||
|
@ -360,7 +386,7 @@ extension CtlPrefWindow: NSToolbarDelegate {
|
|||
}
|
||||
|
||||
var toolbarIdentifiers: [NSToolbarItem.Identifier] {
|
||||
[.ofGeneral, .ofExperience, .ofDictionary, .ofCassette, .ofKeyboard]
|
||||
[.ofGeneral, .ofExperience, .ofDictionary, .ofPhrases, .ofCassette, .ofKeyboard]
|
||||
}
|
||||
|
||||
func toolbarDefaultItemIdentifiers(_: NSToolbar) -> [NSToolbarItem.Identifier] {
|
||||
|
@ -390,6 +416,11 @@ extension CtlPrefWindow: NSToolbarDelegate {
|
|||
window?.toolbar?.selectedItemIdentifier = .ofDictionary
|
||||
}
|
||||
|
||||
@objc func showPhrasesView(_: Any?) {
|
||||
use(view: vwrPhrases)
|
||||
window?.toolbar?.selectedItemIdentifier = .ofPhrases
|
||||
}
|
||||
|
||||
@objc func showCassetteView(_: Any?) {
|
||||
use(view: vwrCassette)
|
||||
window?.toolbar?.selectedItemIdentifier = .ofCassette
|
||||
|
@ -430,6 +461,11 @@ extension CtlPrefWindow: NSToolbarDelegate {
|
|||
item.image = .tabImageDictionary
|
||||
item.action = #selector(showDictionaryView(_:))
|
||||
|
||||
case .ofPhrases:
|
||||
item.label = CtlPrefWindow.locPhrasesTabTitle
|
||||
item.image = .tabImagePhrases
|
||||
item.action = #selector(showPhrasesView(_:))
|
||||
|
||||
case .ofCassette:
|
||||
let title = NSLocalizedString("Cassette", comment: "")
|
||||
item.label = title
|
||||
|
|
|
@ -0,0 +1,255 @@
|
|||
// (c) 2011 and onwards The OpenVanilla Project (MIT License).
|
||||
// All possible vChewing-specific modifications are of:
|
||||
// (c) 2021 and onwards The vChewing Project (MIT-NTL License).
|
||||
// ====================
|
||||
// This code is released under the MIT license (SPDX-License-Identifier: MIT)
|
||||
// ... with NTL restriction stating that:
|
||||
// No trademark license is granted to use the trade names, trademarks, service
|
||||
// marks, or product names of Contributor, except as required to fulfill notice
|
||||
// requirements defined in MIT License.
|
||||
|
||||
import Foundation
|
||||
import LangModelAssembly
|
||||
import PhraseEditorUI
|
||||
import Shared
|
||||
|
||||
extension CtlPrefWindow: NSTextViewDelegate, NSTextFieldDelegate {
|
||||
var selInputMode: Shared.InputMode {
|
||||
switch cmbPEInputModeMenu.selectedTag() {
|
||||
case 0: return .imeModeCHS
|
||||
case 1: return .imeModeCHT
|
||||
default: return .imeModeNULL
|
||||
}
|
||||
}
|
||||
|
||||
var selUserDataType: vChewingLM.ReplacableUserDataType {
|
||||
switch cmbPEDataTypeMenu.selectedTag() {
|
||||
case 0: return .thePhrases
|
||||
case 1: return .theFilter
|
||||
case 2: return .theReplacements
|
||||
case 3: return .theAssociates
|
||||
case 4: return .theSymbols
|
||||
default: return .thePhrases
|
||||
}
|
||||
}
|
||||
|
||||
func updatePhraseEditor() {
|
||||
updateLabels()
|
||||
clearAllFields()
|
||||
isLoading = true
|
||||
tfdPETextEditor.string = NSLocalizedString("Loading…", comment: "")
|
||||
DispatchQueue.main.async { [self] in
|
||||
tfdPETextEditor.string = LMMgr.retrieveData(mode: selInputMode, type: selUserDataType)
|
||||
isSaved = true
|
||||
isLoading = false
|
||||
}
|
||||
}
|
||||
|
||||
func setPEUIControlAvailability() {
|
||||
btnPEReload.isEnabled = selInputMode != .imeModeNULL && !isLoading
|
||||
btnPEConsolidate.isEnabled = selInputMode != .imeModeNULL && !isLoading
|
||||
btnPESave.isEnabled = true // 暫時沒辦法捕捉到 TextView 的內容變更事件,故作罷。
|
||||
btnPEAdd.isEnabled =
|
||||
!txtPEField1.isEmpty && !txtPEField2.isEmpty && selInputMode != .imeModeNULL && !isLoading
|
||||
tfdPETextEditor.isEditable = selInputMode != .imeModeNULL && !isLoading
|
||||
txtPEField1.isEnabled = selInputMode != .imeModeNULL && !isLoading
|
||||
txtPEField2.isEnabled = selInputMode != .imeModeNULL && !isLoading
|
||||
txtPEField3.isEnabled = selInputMode != .imeModeNULL && !isLoading
|
||||
txtPEField3.isHidden = selUserDataType != .thePhrases || isLoading
|
||||
txtPECommentField.isEnabled = selUserDataType != .theAssociates && !isLoading
|
||||
}
|
||||
|
||||
func updateLabels() {
|
||||
clearAllFields()
|
||||
switch selUserDataType {
|
||||
case .thePhrases:
|
||||
txtPEField1.placeholderString = UITerms.AddPhrases.locPhrase.localized.0
|
||||
txtPEField2.placeholderString = UITerms.AddPhrases.locReadingOrStroke.localized.0
|
||||
txtPEField3.placeholderString = UITerms.AddPhrases.locWeight.localized.0
|
||||
txtPECommentField.placeholderString = UITerms.AddPhrases.locComment.localized.0
|
||||
case .theFilter:
|
||||
txtPEField1.placeholderString = UITerms.AddPhrases.locPhrase.localized.0
|
||||
txtPEField2.placeholderString = UITerms.AddPhrases.locReadingOrStroke.localized.0
|
||||
txtPEField3.placeholderString = ""
|
||||
txtPECommentField.placeholderString = UITerms.AddPhrases.locComment.localized.0
|
||||
case .theReplacements:
|
||||
txtPEField1.placeholderString = UITerms.AddPhrases.locReplaceTo.localized.0
|
||||
txtPEField2.placeholderString = UITerms.AddPhrases.locReplaceTo.localized.1
|
||||
txtPEField3.placeholderString = ""
|
||||
txtPECommentField.placeholderString = UITerms.AddPhrases.locComment.localized.0
|
||||
case .theAssociates:
|
||||
txtPEField1.placeholderString = UITerms.AddPhrases.locInitial.localized.0
|
||||
txtPEField2.placeholderString = {
|
||||
let result = UITerms.AddPhrases.locPhrase.localized.0
|
||||
return (result == "Phrase") ? "Phrases" : result
|
||||
}()
|
||||
txtPEField3.placeholderString = ""
|
||||
txtPECommentField.placeholderString = NSLocalizedString(
|
||||
"Inline comments are not supported in associated phrases.", comment: ""
|
||||
)
|
||||
case .theSymbols:
|
||||
txtPEField1.placeholderString = UITerms.AddPhrases.locPhrase.localized.0
|
||||
txtPEField2.placeholderString = UITerms.AddPhrases.locReadingOrStroke.localized.0
|
||||
txtPEField3.placeholderString = ""
|
||||
txtPECommentField.placeholderString = UITerms.AddPhrases.locComment.localized.0
|
||||
}
|
||||
}
|
||||
|
||||
func clearAllFields() {
|
||||
txtPEField1.stringValue = ""
|
||||
txtPEField2.stringValue = ""
|
||||
txtPEField3.stringValue = ""
|
||||
txtPECommentField.stringValue = ""
|
||||
}
|
||||
|
||||
func initPhraseEditor() {
|
||||
// InputMode combobox.
|
||||
cmbPEInputModeMenu.menu?.removeAllItems()
|
||||
let menuItemCHS = NSMenuItem()
|
||||
menuItemCHS.title = NSLocalizedString("Simplified Chinese", comment: "")
|
||||
menuItemCHS.tag = 0
|
||||
let menuItemCHT = NSMenuItem()
|
||||
menuItemCHT.title = NSLocalizedString("Traditional Chinese", comment: "")
|
||||
menuItemCHT.tag = 1
|
||||
cmbPEInputModeMenu.menu?.addItem(menuItemCHS)
|
||||
cmbPEInputModeMenu.menu?.addItem(menuItemCHT)
|
||||
switch IMEApp.currentInputMode {
|
||||
case .imeModeCHS: cmbPEInputModeMenu.select(menuItemCHS)
|
||||
case .imeModeCHT: cmbPEInputModeMenu.select(menuItemCHT)
|
||||
case .imeModeNULL: cmbPEInputModeMenu.select(menuItemCHT)
|
||||
}
|
||||
|
||||
// DataType combobox.
|
||||
cmbPEDataTypeMenu.menu?.removeAllItems()
|
||||
var defaultDataTypeMenuItem: NSMenuItem?
|
||||
for (i, neta) in vChewingLM.ReplacableUserDataType.allCases.enumerated() {
|
||||
let newMenuItem = NSMenuItem()
|
||||
newMenuItem.title = neta.localizedDescription
|
||||
newMenuItem.tag = i
|
||||
cmbPEDataTypeMenu.menu?.addItem(newMenuItem)
|
||||
if i == 0 { defaultDataTypeMenuItem = newMenuItem }
|
||||
}
|
||||
guard let defaultDataTypeMenuItem = defaultDataTypeMenuItem else { return }
|
||||
cmbPEDataTypeMenu.select(defaultDataTypeMenuItem)
|
||||
|
||||
// Buttons.
|
||||
btnPEReload.title = NSLocalizedString("Reload", comment: "")
|
||||
btnPEConsolidate.title = NSLocalizedString("Consolidate", comment: "")
|
||||
btnPESave.title = NSLocalizedString("Save", comment: "")
|
||||
btnPEAdd.title = UITerms.AddPhrases.locAdd.localized.0
|
||||
btnPEOpenExternally.title = NSLocalizedString("...", comment: "")
|
||||
|
||||
// Text Editor View
|
||||
tfdPETextEditor.font = NSFont.systemFont(ofSize: 13, weight: .regular)
|
||||
|
||||
// Tab key targets.
|
||||
tfdPETextEditor.delegate = self
|
||||
txtPECommentField.nextKeyView = txtPEField1
|
||||
txtPEField1.nextKeyView = txtPEField2
|
||||
txtPEField2.nextKeyView = txtPEField3
|
||||
txtPEField3.nextKeyView = btnPEAdd
|
||||
|
||||
// Delegates.
|
||||
tfdPETextEditor.delegate = self
|
||||
txtPECommentField.delegate = self
|
||||
txtPEField1.delegate = self
|
||||
txtPEField2.delegate = self
|
||||
txtPEField3.delegate = self
|
||||
|
||||
// Finally, update the entire editor UI.
|
||||
updatePhraseEditor()
|
||||
}
|
||||
|
||||
func controlTextDidChange(_: Notification) { setPEUIControlAvailability() }
|
||||
|
||||
@IBAction func inputModePEMenuDidChange(_: NSPopUpButton) { updatePhraseEditor() }
|
||||
|
||||
@IBAction func dataTypePEMenuDidChange(_: NSPopUpButton) { updatePhraseEditor() }
|
||||
|
||||
@IBAction func reloadPEButtonClicked(_: NSButton) { updatePhraseEditor() }
|
||||
|
||||
@IBAction func consolidatePEButtonClicked(_: NSButton) {
|
||||
DispatchQueue.main.async { [self] in
|
||||
isLoading = true
|
||||
vChewingLM.LMConsolidator.consolidate(text: &tfdPETextEditor.string, pragma: false)
|
||||
isLoading = false
|
||||
isSaved = false
|
||||
}
|
||||
}
|
||||
|
||||
@IBAction func savePEButtonClicked(_: NSButton) {
|
||||
// guard !isSaved else { return }
|
||||
let toSave = tfdPETextEditor.string
|
||||
isLoading = true
|
||||
tfdPETextEditor.string = NSLocalizedString("Loading…", comment: "")
|
||||
let newResult = LMMgr.saveData(mode: selInputMode, type: selUserDataType, data: toSave)
|
||||
tfdPETextEditor.string = newResult
|
||||
isLoading = false
|
||||
isSaved = true
|
||||
}
|
||||
|
||||
@IBAction func openExternallyPEButtonClicked(_: NSButton) {
|
||||
DispatchQueue.main.async { [self] in
|
||||
LMMgr.shared.openPhraseFile(mode: selInputMode, type: selUserDataType, app: "Finder")
|
||||
}
|
||||
}
|
||||
|
||||
@IBAction func addPEButtonClicked(_: NSButton) {
|
||||
DispatchQueue.main.async { [self] in
|
||||
txtPEField1.stringValue.removeAll { " \t\n\r".contains($0) }
|
||||
if selUserDataType != .theAssociates {
|
||||
txtPEField2.stringValue.regReplace(pattern: #"( +| +| +|\t+)+"#, replaceWith: "-")
|
||||
}
|
||||
txtPEField2.stringValue.removeAll {
|
||||
selUserDataType == .theAssociates ? "\n\r".contains($0) : " \t\n\r".contains($0)
|
||||
}
|
||||
txtPEField3.stringValue.removeAll { !"0123456789.-".contains($0) }
|
||||
txtPECommentField.stringValue.removeAll { "\n\r".contains($0) }
|
||||
guard !txtPEField1.stringValue.isEmpty, !txtPEField2.stringValue.isEmpty else { return }
|
||||
var arrResult: [String] = [txtPEField1.stringValue, txtPEField2.stringValue]
|
||||
if let weightVal = Double(txtPEField3.stringValue), weightVal < 0 {
|
||||
arrResult.append(weightVal.description)
|
||||
}
|
||||
if !txtPECommentField.stringValue.isEmpty { arrResult.append("#" + txtPECommentField.stringValue) }
|
||||
if LMMgr.checkIfUserPhraseExist(
|
||||
userPhrase: txtPEField1.stringValue, mode: selInputMode, key: txtPEField2.stringValue
|
||||
) {
|
||||
arrResult.append("\t#𝙾𝚟𝚎𝚛𝚛𝚒𝚍𝚎")
|
||||
}
|
||||
if let lastChar = tfdPETextEditor.string.last, !"\n".contains(lastChar) {
|
||||
arrResult.insert("\n", at: 0)
|
||||
}
|
||||
tfdPETextEditor.string.append(arrResult.joined(separator: " ") + "\n")
|
||||
isSaved = false
|
||||
clearAllFields()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private enum UITerms {
|
||||
fileprivate enum AddPhrases: String {
|
||||
case locPhrase = "Phrase"
|
||||
case locReadingOrStroke = "Reading/Stroke"
|
||||
case locWeight = "Weight"
|
||||
case locComment = "Comment"
|
||||
case locReplaceTo = "Replace to"
|
||||
case locAdd = "Add"
|
||||
case locInitial = "Initial"
|
||||
|
||||
var localized: (String, String) {
|
||||
if self == .locAdd {
|
||||
let loc = PrefMgr.shared.appleLanguages[0]
|
||||
return loc.contains("zh") ? ("添入", "") : loc.contains("ja") ? ("記入", "") : ("Add", "")
|
||||
}
|
||||
let rawArray = NSLocalizedString(self.rawValue, comment: "").components(separatedBy: " ")
|
||||
if rawArray.isEmpty { return ("N/A", "N/A") }
|
||||
let val1: String = rawArray[0]
|
||||
let val2: String = (rawArray.count >= 2) ? rawArray[1] : ""
|
||||
return (val1, val2)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension NSTextField {
|
||||
fileprivate var isEmpty: Bool { stringValue.isEmpty }
|
||||
}
|
|
@ -92,6 +92,7 @@
|
|||
"⚠︎ Phrase replacement mode enabled, interfering user phrase entry." = "⚠︎ Phrase replacement mode enabled, interfering user phrase entry.";
|
||||
"⚠︎ Unhandlable: Chars and Readings in buffer doesn't match." = "⚠︎ Unhandlable: Chars and Readings in buffer doesn't match.";
|
||||
"Per-Char Select Mode" = "Per-Char Select Mode";
|
||||
"Inline comments are not supported in associated phrases." = "Inline comments are not supported in associated phrases.";
|
||||
"CNS11643 Mode" = "CNS11643 Mode";
|
||||
"JIS Shinjitai Output" = "JIS Shinjitai Output";
|
||||
"Per-Char Associated Phrases" = "Per-Char Associated Phrases";
|
||||
|
|
|
@ -92,6 +92,7 @@
|
|||
"⚠︎ Phrase replacement mode enabled, interfering user phrase entry." = "⚠︎ Phrase replacement mode enabled, interfering user phrase entry.";
|
||||
"⚠︎ Unhandlable: Chars and Readings in buffer doesn't match." = "⚠︎ Unhandlable: Chars and Readings in buffer doesn't match.";
|
||||
"Per-Char Select Mode" = "Per-Char Select Mode";
|
||||
"Inline comments are not supported in associated phrases." = "Inline comments are not supported in associated phrases.";
|
||||
"CNS11643 Mode" = "CNS11643 Mode";
|
||||
"JIS Shinjitai Output" = "JIS Shinjitai Output";
|
||||
"Per-Char Associated Phrases" = "Per-Char Associated Phrases";
|
||||
|
|
|
@ -92,6 +92,7 @@
|
|||
"⚠︎ Phrase replacement mode enabled, interfering user phrase entry." = "⚠︎ 言葉置換機能稼働中、新添付言葉にも影響。";
|
||||
"⚠︎ Unhandlable: Chars and Readings in buffer doesn't match." = "⚠︎ 対処不可:緩衝列の字数は読みの数と不同等。";
|
||||
"Per-Char Select Mode" = "全候補入力モード";
|
||||
"Inline comments are not supported in associated phrases." = "インラインメモは連想語彙辞書で使えません。";
|
||||
"CNS11643 Mode" = "全字庫モード";
|
||||
"JIS Shinjitai Output" = "JIS 新字体モード";
|
||||
"Per-Char Associated Phrases" = "全候補入力で連想語彙";
|
||||
|
|
|
@ -92,6 +92,7 @@
|
|||
"⚠︎ Phrase replacement mode enabled, interfering user phrase entry." = "⚠︎ 语汇置换功能已启用,会波及语汇自订。";
|
||||
"⚠︎ Unhandlable: Chars and Readings in buffer doesn't match." = "⚠︎ 无法处理:组字区字数与读音数不对应。";
|
||||
"Per-Char Select Mode" = "模拟逐字选字输入";
|
||||
"Inline comments are not supported in associated phrases." = "联想词不支援行内注解。";
|
||||
"CNS11643 Mode" = "全字库模式";
|
||||
"JIS Shinjitai Output" = "JIS 新字体模式";
|
||||
"Per-Char Associated Phrases" = "逐字选字联想模式";
|
||||
|
|
|
@ -92,6 +92,7 @@
|
|||
"⚠︎ Phrase replacement mode enabled, interfering user phrase entry." = "⚠︎ 語彙置換功能已啟用,會波及語彙自訂。";
|
||||
"⚠︎ Unhandlable: Chars and Readings in buffer doesn't match." = "⚠︎ 無法處理:組字區字數與讀音數不對應。";
|
||||
"Per-Char Select Mode" = "模擬逐字選字輸入";
|
||||
"Inline comments are not supported in associated phrases." = "聯想詞不支援行內註解。";
|
||||
"CNS11643 Mode" = "全字庫模式";
|
||||
"JIS Shinjitai Output" = "JIS 新字體模式";
|
||||
"Per-Char Associated Phrases" = "逐字選字聯想模式";
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21225" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21507" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
|
||||
<dependencies>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21225"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21507"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21507" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
||||
<dependencies>
|
||||
<deployment identifier="macosx"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21507"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
|
@ -8,12 +9,24 @@
|
|||
<customObject id="-2" userLabel="File's Owner" customClass="CtlPrefWindow">
|
||||
<connections>
|
||||
<outlet property="basicKeyboardLayoutButton" destination="124" id="135"/>
|
||||
<outlet property="btnPEAdd" destination="gTs-SB-5lC" id="BMg-w3-GuB"/>
|
||||
<outlet property="btnPEConsolidate" destination="Xcg-bf-PrB" id="Sa5-hl-sWg"/>
|
||||
<outlet property="btnPEOpenExternally" destination="xXK-s1-vSe" id="vKF-Im-fLU"/>
|
||||
<outlet property="btnPEReload" destination="PCy-3G-HoZ" id="Ssb-15-kUj"/>
|
||||
<outlet property="btnPESave" destination="Ss7-cl-3E0" id="yK4-7N-pf2"/>
|
||||
<outlet property="chkTrad2JISShinjitai" destination="h4r-Sp-LBI" id="pk8-xi-IJi"/>
|
||||
<outlet property="chkTrad2KangXi" destination="5IL-zZ-CL9" id="PGS-Dy-BBY"/>
|
||||
<outlet property="cmbCandidateFontSize" destination="90" id="K27-YZ-Iki"/>
|
||||
<outlet property="cmbPEDataTypeMenu" destination="Hdr-Qr-1qw" id="6Dv-pj-1EE"/>
|
||||
<outlet property="cmbPEInputModeMenu" destination="y5f-AO-wKG" id="hW9-zZ-t8S"/>
|
||||
<outlet property="fontSizePopUpButton" destination="90" id="108"/>
|
||||
<outlet property="lblCurrentlySpecifiedUserDataFolder" destination="REC-r4-T7m" id="eEq-XN-mMq"/>
|
||||
<outlet property="selectionKeyComboBox" destination="uHU-aL-du7" id="cEx-Ui-Phc"/>
|
||||
<outlet property="tfdPETextEditor" destination="kSG-dz-P2N" id="aiA-EA-Isg"/>
|
||||
<outlet property="txtPECommentField" destination="cRd-HU-x7y" id="eJf-IX-goL"/>
|
||||
<outlet property="txtPEField1" destination="eGd-pc-aEI" id="QQp-wQ-8sj"/>
|
||||
<outlet property="txtPEField2" destination="4hL-rO-jca" id="g2Z-iV-KoH"/>
|
||||
<outlet property="txtPEField3" destination="MtM-ya-r2H" id="NdN-Ty-TW9"/>
|
||||
<outlet property="uiLanguageButton" destination="oS6-u5-7dP" id="V3u-XK-z7G"/>
|
||||
<outlet property="vwrCassette" destination="ZEr-3U-K9a" id="GrP-4e-JbJ"/>
|
||||
<outlet property="vwrDevZone" destination="Qd7-ln-nNO" id="8mw-wO-gXS"/>
|
||||
|
@ -21,6 +34,7 @@
|
|||
<outlet property="vwrExperience" destination="XWo-36-xGi" id="pXF-Uv-Zs0"/>
|
||||
<outlet property="vwrGeneral" destination="BUt-lg-GPp" id="PC2-Sj-V4Q"/>
|
||||
<outlet property="vwrKeyboard" destination="U4q-xw-mc0" id="wVe-Yp-M1G"/>
|
||||
<outlet property="vwrPhrases" destination="nMV-YT-ex7" id="PM1-n8-jdw"/>
|
||||
<outlet property="window" destination="1" id="30"/>
|
||||
</connections>
|
||||
</customObject>
|
||||
|
@ -1673,5 +1687,277 @@ Features listed here may not work as expected.</string>
|
|||
</constraints>
|
||||
<point key="canvasLocation" x="-400" y="-47"/>
|
||||
</visualEffectView>
|
||||
<view wantsLayer="YES" id="nMV-YT-ex7" userLabel="vwrPhrases">
|
||||
<rect key="frame" x="0.0" y="0.0" width="577" height="502"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<gridView xPlacement="leading" yPlacement="bottom" rowAlignment="none" translatesAutoresizingMaskIntoConstraints="NO" id="9U6-0Y-bkY">
|
||||
<rect key="frame" x="20" y="42" width="537" height="440"/>
|
||||
<constraints>
|
||||
<constraint firstItem="VNM-HM-1uE" firstAttribute="leading" secondItem="cRd-HU-x7y" secondAttribute="leading" id="2Gx-8u-8N3"/>
|
||||
<constraint firstItem="MtM-ya-r2H" firstAttribute="centerY" secondItem="gTs-SB-5lC" secondAttribute="centerY" id="3B5-my-ebI"/>
|
||||
<constraint firstItem="4hL-rO-jca" firstAttribute="leading" secondItem="eGd-pc-aEI" secondAttribute="trailing" constant="6" id="LZH-8I-EDW"/>
|
||||
<constraint firstItem="gTs-SB-5lC" firstAttribute="trailing" secondItem="VNM-HM-1uE" secondAttribute="trailing" id="UmT-Mp-RfG"/>
|
||||
<constraint firstAttribute="trailing" secondItem="MtM-ya-r2H" secondAttribute="trailing" constant="51" id="dSy-HY-ibT"/>
|
||||
<constraint firstItem="VNM-HM-1uE" firstAttribute="leading" secondItem="eGd-pc-aEI" secondAttribute="leading" id="gEo-Tp-G61"/>
|
||||
<constraint firstItem="gTs-SB-5lC" firstAttribute="leading" secondItem="MtM-ya-r2H" secondAttribute="trailing" constant="6" id="iAJ-36-Wor"/>
|
||||
</constraints>
|
||||
<rows>
|
||||
<gridRow id="BgR-9R-Eq3"/>
|
||||
<gridRow id="vFJ-gt-zuw"/>
|
||||
<gridRow id="xaa-DP-GCB"/>
|
||||
<gridRow id="4xJ-aw-8Ai"/>
|
||||
</rows>
|
||||
<columns>
|
||||
<gridColumn width="139" id="Crs-Ra-kaf"/>
|
||||
<gridColumn id="rKE-Vd-iIc"/>
|
||||
<gridColumn id="6bl-iI-mOn"/>
|
||||
<gridColumn id="QsY-Xm-Nsd"/>
|
||||
</columns>
|
||||
<gridCells>
|
||||
<gridCell row="BgR-9R-Eq3" column="Crs-Ra-kaf" headOfMergedCell="1ah-jc-sED" id="1ah-jc-sED">
|
||||
<stackView key="contentView" distribution="fill" orientation="horizontal" alignment="top" spacing="7" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="VNM-HM-1uE">
|
||||
<rect key="frame" x="0.0" y="420" width="537" height="20"/>
|
||||
<subviews>
|
||||
<popUpButton horizontalHuggingPriority="249" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="y5f-AO-wKG" userLabel="InputMode">
|
||||
<rect key="frame" x="-3" y="-4" width="155" height="25"/>
|
||||
<popUpButtonCell key="cell" type="push" title="Simplified Chinese" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="ABX-tp-OFe" id="Mud-bW-J5r">
|
||||
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="menu"/>
|
||||
<menu key="menu" id="qeC-eh-Wdd">
|
||||
<items>
|
||||
<menuItem title="Simplified Chinese" state="on" id="ABX-tp-OFe"/>
|
||||
<menuItem title="Traditional Chinese" tag="1" id="kYN-6d-82O"/>
|
||||
</items>
|
||||
</menu>
|
||||
</popUpButtonCell>
|
||||
<connections>
|
||||
<action selector="inputModePEMenuDidChange:" target="-2" id="qgo-0W-BHn"/>
|
||||
</connections>
|
||||
</popUpButton>
|
||||
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Hdr-Qr-1qw" userLabel="DataType">
|
||||
<rect key="frame" x="152" y="-4" width="125" height="25"/>
|
||||
<popUpButtonCell key="cell" type="push" title="Phrases" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" state="on" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" selectedItem="EoV-J3-Ail" id="sjh-Oq-cRa">
|
||||
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="menu"/>
|
||||
<menu key="menu" id="8MI-ey-2Y2">
|
||||
<items>
|
||||
<menuItem title="Phrases" state="on" id="EoV-J3-Ail"/>
|
||||
<menuItem title="Filter" tag="1" id="wEJ-D6-ekj">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
</menuItem>
|
||||
<menuItem title="Replacements" tag="2" id="bzA-jQ-XG7"/>
|
||||
<menuItem title="Associates" tag="3" id="tuh-yZ-dPd"/>
|
||||
<menuItem title="Symbols" tag="4" id="Eve-dC-LX9"/>
|
||||
</items>
|
||||
</menu>
|
||||
</popUpButtonCell>
|
||||
<connections>
|
||||
<action selector="dataTypePEMenuDidChange:" target="-2" id="xYy-IM-orl"/>
|
||||
</connections>
|
||||
</popUpButton>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="PCy-3G-HoZ" userLabel="Reload">
|
||||
<rect key="frame" x="273" y="-7" width="76" height="32"/>
|
||||
<buttonCell key="cell" type="push" title="Reload" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="xIt-dN-NIo">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
<string key="keyEquivalent">r</string>
|
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="reloadPEButtonClicked:" target="-2" id="SL2-kG-V32"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Xcg-bf-PrB" userLabel="Consolidate">
|
||||
<rect key="frame" x="342" y="-7" width="106" height="32"/>
|
||||
<buttonCell key="cell" type="push" title="Consolidate" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="kaZ-Vd-VUD">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
<string key="keyEquivalent">O</string>
|
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="consolidatePEButtonClicked:" target="-2" id="Q6f-M5-coI"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Ss7-cl-3E0" userLabel="Save">
|
||||
<rect key="frame" x="441" y="-7" width="64" height="32"/>
|
||||
<buttonCell key="cell" type="push" title="Save" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="dia-Xd-rOv">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
<string key="keyEquivalent">s</string>
|
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="savePEButtonClicked:" target="-2" id="cIo-bn-7CG"/>
|
||||
</connections>
|
||||
</button>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="xXK-s1-vSe" userLabel="OpenExternally">
|
||||
<rect key="frame" x="498" y="-7" width="46" height="32"/>
|
||||
<buttonCell key="cell" type="push" title="..." bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="apQ-Kg-H8m">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="openExternallyPEButtonClicked:" target="-2" id="Whx-wW-F15"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="480" id="e8A-Em-vpG"/>
|
||||
</constraints>
|
||||
<visibilityPriorities>
|
||||
<integer value="1000"/>
|
||||
<integer value="1000"/>
|
||||
<integer value="1000"/>
|
||||
<integer value="1000"/>
|
||||
<integer value="1000"/>
|
||||
<integer value="1000"/>
|
||||
</visibilityPriorities>
|
||||
<customSpacing>
|
||||
<real value="3.4028234663852886e+38"/>
|
||||
<real value="3.4028234663852886e+38"/>
|
||||
<real value="3.4028234663852886e+38"/>
|
||||
<real value="3.4028234663852886e+38"/>
|
||||
<real value="3.4028234663852886e+38"/>
|
||||
<real value="3.4028234663852886e+38"/>
|
||||
</customSpacing>
|
||||
</stackView>
|
||||
</gridCell>
|
||||
<gridCell row="BgR-9R-Eq3" column="rKE-Vd-iIc" headOfMergedCell="1ah-jc-sED" id="XFS-hl-txj"/>
|
||||
<gridCell row="BgR-9R-Eq3" column="6bl-iI-mOn" headOfMergedCell="1ah-jc-sED" id="elD-7G-e17"/>
|
||||
<gridCell row="BgR-9R-Eq3" column="QsY-Xm-Nsd" headOfMergedCell="1ah-jc-sED" id="uty-b1-2vu"/>
|
||||
<gridCell row="vFJ-gt-zuw" column="Crs-Ra-kaf" headOfMergedCell="0Ab-Pf-ALo" id="0Ab-Pf-ALo">
|
||||
<scrollView key="contentView" borderType="none" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZiP-iJ-C99">
|
||||
<rect key="frame" x="0.0" y="54" width="535" height="360"/>
|
||||
<clipView key="contentView" drawsBackground="NO" id="x8s-wo-bxi">
|
||||
<rect key="frame" x="0.0" y="0.0" width="535" height="360"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textView wantsLayer="YES" importsGraphics="NO" richText="NO" verticallyResizable="YES" allowsUndo="YES" smartInsertDelete="YES" id="kSG-dz-P2N">
|
||||
<rect key="frame" x="0.0" y="0.0" width="535" height="360"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<size key="minSize" width="535" height="360"/>
|
||||
<size key="maxSize" width="535" height="10000000"/>
|
||||
<color key="insertionPointColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
</textView>
|
||||
</subviews>
|
||||
</clipView>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="535" id="Nk8-nt-INm"/>
|
||||
<constraint firstAttribute="height" constant="360" id="zmS-GW-SZp"/>
|
||||
</constraints>
|
||||
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="pe8-aD-UeN">
|
||||
<rect key="frame" x="-100" y="-100" width="240" height="16"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
<scroller key="verticalScroller" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="XaH-Hh-3mG">
|
||||
<rect key="frame" x="519" y="0.0" width="16" height="360"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
</scroller>
|
||||
</scrollView>
|
||||
</gridCell>
|
||||
<gridCell row="vFJ-gt-zuw" column="rKE-Vd-iIc" headOfMergedCell="0Ab-Pf-ALo" id="ZAk-0p-wLL"/>
|
||||
<gridCell row="vFJ-gt-zuw" column="6bl-iI-mOn" headOfMergedCell="0Ab-Pf-ALo" id="Ec5-NJ-xNy"/>
|
||||
<gridCell row="vFJ-gt-zuw" column="QsY-Xm-Nsd" headOfMergedCell="0Ab-Pf-ALo" id="HLD-i2-QMo"/>
|
||||
<gridCell row="xaa-DP-GCB" column="Crs-Ra-kaf" headOfMergedCell="oBI-Nf-rXU" id="oBI-Nf-rXU">
|
||||
<textField key="contentView" verticalHuggingPriority="750" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cRd-HU-x7y" userLabel="CommentField">
|
||||
<rect key="frame" x="0.0" y="27" width="535" height="21"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="535" id="nMf-0V-Lew"/>
|
||||
</constraints>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="Comment" drawsBackground="YES" usesSingleLineMode="YES" id="8ao-bw-PSo">
|
||||
<font key="font" usesAppearanceFont="YES"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
</gridCell>
|
||||
<gridCell row="xaa-DP-GCB" column="rKE-Vd-iIc" headOfMergedCell="oBI-Nf-rXU" id="HYn-Ah-WbD"/>
|
||||
<gridCell row="xaa-DP-GCB" column="6bl-iI-mOn" headOfMergedCell="oBI-Nf-rXU" id="vrC-p6-Itp"/>
|
||||
<gridCell row="xaa-DP-GCB" column="QsY-Xm-Nsd" headOfMergedCell="oBI-Nf-rXU" id="UTa-75-Pgp"/>
|
||||
<gridCell row="4xJ-aw-8Ai" column="Crs-Ra-kaf" id="2ru-au-cff">
|
||||
<textField key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="eGd-pc-aEI" userLabel="Field1">
|
||||
<rect key="frame" x="0.0" y="0.0" width="139" height="21"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="100" id="Wbe-5i-Ueg"/>
|
||||
</constraints>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="Phrase" drawsBackground="YES" usesSingleLineMode="YES" id="9wU-iM-V1a">
|
||||
<font key="font" usesAppearanceFont="YES"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
</gridCell>
|
||||
<gridCell row="4xJ-aw-8Ai" column="rKE-Vd-iIc" id="KU8-yk-eeK">
|
||||
<textField key="contentView" verticalHuggingPriority="750" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="4hL-rO-jca" userLabel="Field2">
|
||||
<rect key="frame" x="145" y="0.0" width="100" height="21"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="100" id="ndy-8Y-EiG"/>
|
||||
</constraints>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="Reading/Stroke" drawsBackground="YES" usesSingleLineMode="YES" id="pXI-YI-KSm">
|
||||
<font key="font" usesAppearanceFont="YES"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
</gridCell>
|
||||
<gridCell row="4xJ-aw-8Ai" column="6bl-iI-mOn" id="CBy-Jf-tbx">
|
||||
<textField key="contentView" verticalHuggingPriority="750" ambiguous="YES" translatesAutoresizingMaskIntoConstraints="NO" id="MtM-ya-r2H" userLabel="Field3">
|
||||
<rect key="frame" x="386" y="0.0" width="100" height="21"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="100" id="yAI-OV-HgV"/>
|
||||
</constraints>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" placeholderString="Weight" drawsBackground="YES" usesSingleLineMode="YES" id="XtB-Tc-T1L">
|
||||
<font key="font" usesAppearanceFont="YES"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
</gridCell>
|
||||
<gridCell row="4xJ-aw-8Ai" column="QsY-Xm-Nsd" id="4VS-6q-vlp">
|
||||
<button key="contentView" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gTs-SB-5lC" userLabel="Add">
|
||||
<rect key="frame" x="485" y="-7" width="59" height="33"/>
|
||||
<buttonCell key="cell" type="push" title="Add" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="ddf-uN-Ek9">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="system"/>
|
||||
<string key="keyEquivalent" base64-UTF8="YES">
|
||||
DQ
|
||||
</string>
|
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<action selector="addPEButtonClicked:" target="-2" id="hhk-Nx-ifF"/>
|
||||
</connections>
|
||||
</button>
|
||||
</gridCell>
|
||||
</gridCells>
|
||||
</gridView>
|
||||
<stackView distribution="fillProportionally" orientation="horizontal" alignment="bottom" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" fixedFrame="YES" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="9jV-CA-WFm">
|
||||
<rect key="frame" x="136" y="-275" width="45" height="20"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
</stackView>
|
||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ITb-81-S6N" userLabel="PhraseEditorAutoReloadExternalModifications">
|
||||
<rect key="frame" x="18" y="19" width="413" height="16"/>
|
||||
<buttonCell key="cell" type="check" title="This editor only: Auto-reload modifications happened outside of this editor" bezelStyle="regularSquare" imagePosition="left" controlSize="small" state="on" inset="2" id="WX6-BW-JPM">
|
||||
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
</buttonCell>
|
||||
<connections>
|
||||
<binding destination="32" name="value" keyPath="values.PhraseEditorAutoReloadExternalModifications" id="OOk-4f-hTA"/>
|
||||
</connections>
|
||||
</button>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="ITb-81-S6N" firstAttribute="leading" secondItem="nMV-YT-ex7" secondAttribute="leading" constant="19" id="BVt-tj-csX"/>
|
||||
<constraint firstItem="9U6-0Y-bkY" firstAttribute="top" secondItem="nMV-YT-ex7" secondAttribute="top" constant="20" symbolic="YES" id="JNL-xJ-u6H"/>
|
||||
<constraint firstItem="9U6-0Y-bkY" firstAttribute="leading" secondItem="nMV-YT-ex7" secondAttribute="leading" constant="20" symbolic="YES" id="ZLl-iY-ZYl"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="ITb-81-S6N" secondAttribute="trailing" constant="20" symbolic="YES" id="aaO-uf-vo3"/>
|
||||
<constraint firstItem="ITb-81-S6N" firstAttribute="top" secondItem="9U6-0Y-bkY" secondAttribute="bottom" constant="8" symbolic="YES" id="lY6-Pe-ibV"/>
|
||||
</constraints>
|
||||
<point key="canvasLocation" x="-1408.5" y="-573"/>
|
||||
</view>
|
||||
</objects>
|
||||
</document>
|
||||
|
|
|
@ -115,6 +115,7 @@
|
|||
"wN3-k3-b2a.title" = "Choose your desired user data folder path. Will be omitted if invalid.";
|
||||
"wQ9-px-b07.title" = "Basic keyboard layout option will only affect the appearance of the on-screen-keyboard if the current Mandarin parser is not (any) pinyin.";
|
||||
"Wvt-HE-LOv.title" = "Keyboard Layout";
|
||||
"WX6-BW-JPM.title" = "This editor only: Auto-reload modifications happened outside of this editor";
|
||||
"xC5-yV-1W1.title" = "Choose your preferred layout of the candidate window.";
|
||||
"xibGeneralSettings.title" = "General Settings";
|
||||
"xibKeyboardShortcuts.title" = "Keyboard Shortcuts";
|
||||
|
|
|
@ -115,6 +115,7 @@
|
|||
"wN3-k3-b2a.title" = "欲しがるユーザー辞書保存先をご指定ください。無効の保存先設定は効かぬ。";
|
||||
"wQ9-px-b07.title" = "弁音配列を起用していない限り、キーボード配置の設定はキーボードビューアの有りようだけに影響を及ぼす。";
|
||||
"Wvt-HE-LOv.title" = "キーボード";
|
||||
"WX6-BW-JPM.title" = "このエディターの外部からの編集結果をこのエディターに自動的に読み込む";
|
||||
"xC5-yV-1W1.title" = "入力候補陳列の仕様をご指定ください。";
|
||||
"xibGeneralSettings.title" = "全般設定";
|
||||
"xibKeyboardShortcuts.title" = "ショートカット";
|
||||
|
|
|
@ -115,6 +115,7 @@
|
|||
"wN3-k3-b2a.title" = "请在此指定您想指定的使用者语汇档案目录。无效值会被忽略。";
|
||||
"wQ9-px-b07.title" = "如果当前的普通话/国音分析器并未设为拼音的话,则键盘布局选项仅会影响到荧幕键盘。";
|
||||
"Wvt-HE-LOv.title" = "键盘布局";
|
||||
"WX6-BW-JPM.title" = "仅限该编辑器:自动读入来自该编辑器外部的档案内容修改";
|
||||
"xC5-yV-1W1.title" = "选择您所偏好的候选字窗布局。";
|
||||
"xibGeneralSettings.title" = "一般设定";
|
||||
"xibKeyboardShortcuts.title" = "键盘热键";
|
||||
|
|
|
@ -115,6 +115,7 @@
|
|||
"wN3-k3-b2a.title" = "請在此指定您想指定的使用者語彙檔案目錄。無效值會被忽略。";
|
||||
"wQ9-px-b07.title" = "如果當前的普通話/國音分析器並未設為拼音的話,則鍵盤佈局選項僅會影響到螢幕鍵盤。";
|
||||
"Wvt-HE-LOv.title" = "鍵盤佈局";
|
||||
"WX6-BW-JPM.title" = "僅限該編輯器:自動讀入來自該編輯器外部的檔案內容修改";
|
||||
"xC5-yV-1W1.title" = "選擇您所偏好的候選字窗佈局。";
|
||||
"xibGeneralSettings.title" = "一般設定";
|
||||
"xibKeyboardShortcuts.title" = "鍵盤熱鍵";
|
||||
|
|
|
@ -74,6 +74,7 @@
|
|||
5BC5E01E28DDE4770094E427 /* NotifierUI in Frameworks */ = {isa = PBXBuildFile; productRef = 5BC5E01D28DDE4770094E427 /* NotifierUI */; };
|
||||
5BC5E02128DDEFE00094E427 /* TooltipUI in Frameworks */ = {isa = PBXBuildFile; productRef = 5BC5E02028DDEFE00094E427 /* TooltipUI */; };
|
||||
5BC5E02428DE07860094E427 /* PopupCompositionBuffer in Frameworks */ = {isa = PBXBuildFile; productRef = 5BC5E02328DE07860094E427 /* PopupCompositionBuffer */; };
|
||||
5BCC631629407BBB00A2D84F /* CtlPrefWindow_PhraseEditor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BCC631529407BBB00A2D84F /* CtlPrefWindow_PhraseEditor.swift */; };
|
||||
5BCCAFF828DB19A300AB1B27 /* PrefMgr_Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BCCAFF728DB19A300AB1B27 /* PrefMgr_Extension.swift */; };
|
||||
5BD0113D2818543900609769 /* InputHandler_Core.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BD0113C2818543900609769 /* InputHandler_Core.swift */; };
|
||||
5BD05BCA27B2A43D004C4F1D /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6A2E40F5253A69DA00D1AE1D /* Images.xcassets */; };
|
||||
|
@ -280,6 +281,7 @@
|
|||
5BC5E01C28DDE4270094E427 /* vChewing_NotifierUI */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = vChewing_NotifierUI; path = Packages/vChewing_NotifierUI; sourceTree = "<group>"; };
|
||||
5BC5E01F28DDEFD80094E427 /* vChewing_TooltipUI */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = vChewing_TooltipUI; path = Packages/vChewing_TooltipUI; sourceTree = "<group>"; };
|
||||
5BC5E02228DE07250094E427 /* vChewing_PopupCompositionBuffer */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = vChewing_PopupCompositionBuffer; path = Packages/vChewing_PopupCompositionBuffer; sourceTree = "<group>"; };
|
||||
5BCC631529407BBB00A2D84F /* CtlPrefWindow_PhraseEditor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CtlPrefWindow_PhraseEditor.swift; sourceTree = "<group>"; };
|
||||
5BCCAFF728DB19A300AB1B27 /* PrefMgr_Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrefMgr_Extension.swift; sourceTree = "<group>"; };
|
||||
5BD0113C2818543900609769 /* InputHandler_Core.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; lineEnding = 0; path = InputHandler_Core.swift; sourceTree = "<group>"; usesTabs = 0; };
|
||||
5BD05BB827B2A429004C4F1D /* vChewingPhraseEditor.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = vChewingPhraseEditor.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
|
@ -502,6 +504,7 @@
|
|||
5B62A33C27AE7CC100A19448 /* CtlAboutWindow.swift */,
|
||||
5B0EF55E28CDBF8E00F8F7CE /* CtlClientListMgr.swift */,
|
||||
D47F7DCD278BFB57002F9DD7 /* CtlPrefWindow.swift */,
|
||||
5BCC631529407BBB00A2D84F /* CtlPrefWindow_PhraseEditor.swift */,
|
||||
);
|
||||
path = WindowControllers;
|
||||
sourceTree = "<group>";
|
||||
|
@ -1186,6 +1189,7 @@
|
|||
5BE1F8A928F86AB5006C7FF5 /* InputHandler_HandleEvent.swift in Sources */,
|
||||
5B69938C293B811F0057CB8E /* VwrPrefPanePhrases.swift in Sources */,
|
||||
5BAEFAD028012565001F42C9 /* LMMgr.swift in Sources */,
|
||||
5BCC631629407BBB00A2D84F /* CtlPrefWindow_PhraseEditor.swift in Sources */,
|
||||
5B782EC4280C243C007276DE /* InputHandler_HandleCandidate.swift in Sources */,
|
||||
5BA9FD0F27FEDB6B002DE248 /* VwrPrefPaneGeneral.swift in Sources */,
|
||||
5BCCAFF828DB19A300AB1B27 /* PrefMgr_Extension.swift in Sources */,
|
||||
|
|
Loading…
Reference in New Issue