PrefWindow // Implementing PhraseEditorCocoa.

This commit is contained in:
ShikiSuen 2022-12-07 20:22:34 +08:00
parent 2ff3f0f0d0
commit 36e9a0c1dd
14 changed files with 593 additions and 3 deletions

View File

@ -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

View File

@ -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 }
}

View File

@ -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";

View File

@ -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";

View File

@ -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" = "全候補入力で連想語彙";

View File

@ -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" = "逐字选字联想模式";

View File

@ -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" = "逐字選字聯想模式";

View File

@ -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>

View File

@ -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>

View File

@ -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";

View File

@ -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" = "ショートカット";

View File

@ -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" = "键盘热键";

View File

@ -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" = "鍵盤熱鍵";

View File

@ -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 */,