Repo // Deprecating Zonble's OVNonModalAlertWindow.
This commit is contained in:
parent
4b8f4785a9
commit
34f3e48d70
|
@ -12,7 +12,7 @@ import Cocoa
|
||||||
import InputMethodKit
|
import InputMethodKit
|
||||||
|
|
||||||
@objc(AppDelegate)
|
@objc(AppDelegate)
|
||||||
class AppDelegate: NSObject, NSApplicationDelegate, ctlNonModalAlertWindowDelegate,
|
class AppDelegate: NSObject, NSApplicationDelegate,
|
||||||
FSEventStreamHelperDelegate, NSUserNotificationCenterDelegate
|
FSEventStreamHelperDelegate, NSUserNotificationCenterDelegate
|
||||||
{
|
{
|
||||||
func helper(_: FSEventStreamHelper, didReceive _: [FSEventStreamHelper.Event]) {
|
func helper(_: FSEventStreamHelper, didReceive _: [FSEventStreamHelper.Event]) {
|
||||||
|
@ -30,7 +30,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, ctlNonModalAlertWindowDelega
|
||||||
private var ctlPrefWindowInstance: ctlPrefWindow?
|
private var ctlPrefWindowInstance: ctlPrefWindow?
|
||||||
private var ctlAboutWindowInstance: ctlAboutWindow? // New About Window
|
private var ctlAboutWindowInstance: ctlAboutWindow? // New About Window
|
||||||
private var checkTask: URLSessionTask?
|
private var checkTask: URLSessionTask?
|
||||||
private var updateNextStepURL: URL?
|
|
||||||
public var fsStreamHelper = FSEventStreamHelper(
|
public var fsStreamHelper = FSEventStreamHelper(
|
||||||
path: mgrLangModel.dataFolderPath(isDefaultFolder: false),
|
path: mgrLangModel.dataFolderPath(isDefaultFolder: false),
|
||||||
queue: DispatchQueue(label: "vChewing User Phrases")
|
queue: DispatchQueue(label: "vChewing User Phrases")
|
||||||
|
@ -42,7 +41,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, ctlNonModalAlertWindowDelega
|
||||||
ctlPrefWindowInstance = nil
|
ctlPrefWindowInstance = nil
|
||||||
ctlAboutWindowInstance = nil
|
ctlAboutWindowInstance = nil
|
||||||
checkTask = nil
|
checkTask = nil
|
||||||
updateNextStepURL = nil
|
|
||||||
fsStreamHelper.stop()
|
fsStreamHelper.stop()
|
||||||
fsStreamHelper.delegate = nil
|
fsStreamHelper.delegate = nil
|
||||||
}
|
}
|
||||||
|
@ -137,7 +135,6 @@ class AppDelegate: NSObject, NSApplicationDelegate, ctlNonModalAlertWindowDelega
|
||||||
case .success(let apiResult):
|
case .success(let apiResult):
|
||||||
switch apiResult {
|
switch apiResult {
|
||||||
case .shouldUpdate(let report):
|
case .shouldUpdate(let report):
|
||||||
updateNextStepURL = report.siteUrl
|
|
||||||
let content = String(
|
let content = String(
|
||||||
format: NSLocalizedString(
|
format: NSLocalizedString(
|
||||||
"You're currently using vChewing %@ (%@), a new version %@ (%@) is now available. Do you want to visit vChewing's website to download the version?%@",
|
"You're currently using vChewing %@ (%@), a new version %@ (%@) is now available. Do you want to visit vChewing's website to download the version?%@",
|
||||||
|
@ -150,21 +147,17 @@ class AppDelegate: NSObject, NSApplicationDelegate, ctlNonModalAlertWindowDelega
|
||||||
report.versionDescription
|
report.versionDescription
|
||||||
)
|
)
|
||||||
IME.prtDebugIntel("vChewingDebug: \(content)")
|
IME.prtDebugIntel("vChewingDebug: \(content)")
|
||||||
currentAlertType = "Update"
|
let alert = NSAlert()
|
||||||
ctlNonModalAlertWindow.shared.show(
|
alert.messageText = NSLocalizedString("New Version Available", comment: "")
|
||||||
title: NSLocalizedString(
|
alert.informativeText = content
|
||||||
"New Version Available", comment: ""
|
alert.addButton(withTitle: NSLocalizedString("Visit Website", comment: ""))
|
||||||
),
|
alert.addButton(withTitle: NSLocalizedString("Not Now", comment: ""))
|
||||||
content: content,
|
let result = alert.runModal()
|
||||||
confirmButtonTitle: NSLocalizedString(
|
if result == NSApplication.ModalResponse.alertFirstButtonReturn {
|
||||||
"Visit Website", comment: ""
|
if let siteURL = report.siteUrl {
|
||||||
),
|
NSWorkspace.shared.open(siteURL)
|
||||||
cancelButtonTitle: NSLocalizedString(
|
}
|
||||||
"Not Now", comment: ""
|
}
|
||||||
),
|
|
||||||
cancelAsDefault: false,
|
|
||||||
delegate: self
|
|
||||||
)
|
|
||||||
NSApp.setActivationPolicy(.accessory)
|
NSApp.setActivationPolicy(.accessory)
|
||||||
case .noNeedToUpdate, .ignored:
|
case .noNeedToUpdate, .ignored:
|
||||||
break
|
break
|
||||||
|
@ -172,9 +165,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, ctlNonModalAlertWindowDelega
|
||||||
case .failure(let error):
|
case .failure(let error):
|
||||||
switch error {
|
switch error {
|
||||||
case VersionUpdateApiError.connectionError(let message):
|
case VersionUpdateApiError.connectionError(let message):
|
||||||
let title = NSLocalizedString(
|
let title = NSLocalizedString("Update Check Failed", comment: "")
|
||||||
"Update Check Failed", comment: ""
|
|
||||||
)
|
|
||||||
let content = String(
|
let content = String(
|
||||||
format: NSLocalizedString(
|
format: NSLocalizedString(
|
||||||
"There may be no internet connection or the server failed to respond.\n\nError message: %@",
|
"There may be no internet connection or the server failed to respond.\n\nError message: %@",
|
||||||
|
@ -183,13 +174,12 @@ class AppDelegate: NSObject, NSApplicationDelegate, ctlNonModalAlertWindowDelega
|
||||||
)
|
)
|
||||||
let buttonTitle = NSLocalizedString("Dismiss", comment: "")
|
let buttonTitle = NSLocalizedString("Dismiss", comment: "")
|
||||||
IME.prtDebugIntel("vChewingDebug: \(content)")
|
IME.prtDebugIntel("vChewingDebug: \(content)")
|
||||||
currentAlertType = "Update"
|
|
||||||
ctlNonModalAlertWindow.shared.show(
|
let alert = NSAlert()
|
||||||
title: title, content: content,
|
alert.messageText = title
|
||||||
confirmButtonTitle: buttonTitle,
|
alert.informativeText = content
|
||||||
cancelButtonTitle: nil,
|
alert.addButton(withTitle: buttonTitle)
|
||||||
cancelAsDefault: false, delegate: nil
|
alert.runModal()
|
||||||
)
|
|
||||||
NSApp.setActivationPolicy(.accessory)
|
NSApp.setActivationPolicy(.accessory)
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
|
@ -205,41 +195,21 @@ class AppDelegate: NSObject, NSApplicationDelegate, ctlNonModalAlertWindowDelega
|
||||||
"This will remove vChewing Input Method from this user account, requiring your confirmation.",
|
"This will remove vChewing Input Method from this user account, requiring your confirmation.",
|
||||||
comment: ""
|
comment: ""
|
||||||
))
|
))
|
||||||
ctlNonModalAlertWindow.shared.show(
|
let alert = NSAlert()
|
||||||
title: NSLocalizedString("Uninstallation", comment: ""), content: content,
|
alert.messageText = NSLocalizedString("Uninstallation", comment: "")
|
||||||
confirmButtonTitle: NSLocalizedString("OK", comment: ""),
|
alert.informativeText = content
|
||||||
cancelButtonTitle: NSLocalizedString("Not Now", comment: ""), cancelAsDefault: false,
|
alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
|
||||||
delegate: self
|
alert.addButton(withTitle: NSLocalizedString("Not Now", comment: ""))
|
||||||
)
|
let result = alert.runModal()
|
||||||
|
if result == NSApplication.ModalResponse.alertFirstButtonReturn {
|
||||||
|
NSWorkspace.shared.openFile(
|
||||||
|
mgrLangModel.dataFolderPath(isDefaultFolder: true), withApplication: "Finder"
|
||||||
|
)
|
||||||
|
IME.uninstall(isSudo: false, selfKill: true)
|
||||||
|
}
|
||||||
NSApp.setActivationPolicy(.accessory)
|
NSApp.setActivationPolicy(.accessory)
|
||||||
}
|
}
|
||||||
|
|
||||||
func ctlNonModalAlertWindowDidConfirm(_: ctlNonModalAlertWindow) {
|
|
||||||
switch currentAlertType {
|
|
||||||
case "Uninstall":
|
|
||||||
NSWorkspace.shared.openFile(
|
|
||||||
mgrLangModel.dataFolderPath(isDefaultFolder: true), withApplication: "Finder"
|
|
||||||
)
|
|
||||||
IME.uninstall(isSudo: false, selfKill: true)
|
|
||||||
case "Update":
|
|
||||||
if let updateNextStepURL = updateNextStepURL {
|
|
||||||
NSWorkspace.shared.open(updateNextStepURL)
|
|
||||||
}
|
|
||||||
updateNextStepURL = nil
|
|
||||||
default:
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func ctlNonModalAlertWindowDidCancel(_: ctlNonModalAlertWindow) {
|
|
||||||
switch currentAlertType {
|
|
||||||
case "Update":
|
|
||||||
updateNextStepURL = nil
|
|
||||||
default:
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// New About Window
|
// New About Window
|
||||||
@IBAction func about(_: Any) {
|
@IBAction func about(_: Any) {
|
||||||
(NSApp.delegate as? AppDelegate)?.showAbout()
|
(NSApp.delegate as? AppDelegate)?.showAbout()
|
||||||
|
|
|
@ -131,11 +131,11 @@ public enum IME {
|
||||||
),
|
),
|
||||||
mgrLangModel.dataFolderPath(isDefaultFolder: false)
|
mgrLangModel.dataFolderPath(isDefaultFolder: false)
|
||||||
)
|
)
|
||||||
ctlNonModalAlertWindow.shared.show(
|
let alert = NSAlert()
|
||||||
title: NSLocalizedString("Unable to create the user phrase file.", comment: ""),
|
alert.messageText = NSLocalizedString("Unable to create the user phrase file.", comment: "")
|
||||||
content: content, confirmButtonTitle: NSLocalizedString("OK", comment: ""),
|
alert.informativeText = content
|
||||||
cancelButtonTitle: nil, cancelAsDefault: false, delegate: nil
|
alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
|
||||||
)
|
alert.runModal()
|
||||||
NSApp.setActivationPolicy(.accessory)
|
NSApp.setActivationPolicy(.accessory)
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,114 +0,0 @@
|
||||||
// (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 Cocoa
|
|
||||||
|
|
||||||
protocol ctlNonModalAlertWindowDelegate: AnyObject {
|
|
||||||
func ctlNonModalAlertWindowDidConfirm(_ controller: ctlNonModalAlertWindow)
|
|
||||||
func ctlNonModalAlertWindowDidCancel(_ controller: ctlNonModalAlertWindow)
|
|
||||||
}
|
|
||||||
|
|
||||||
class ctlNonModalAlertWindow: NSWindowController {
|
|
||||||
static let shared = ctlNonModalAlertWindow(windowNibName: "frmNonModalAlertWindow")
|
|
||||||
|
|
||||||
@IBOutlet var titleTextField: NSTextField!
|
|
||||||
@IBOutlet var contentTextField: NSTextField!
|
|
||||||
@IBOutlet var confirmButton: NSButton!
|
|
||||||
@IBOutlet var cancelButton: NSButton!
|
|
||||||
weak var delegate: ctlNonModalAlertWindowDelegate?
|
|
||||||
|
|
||||||
func show(
|
|
||||||
title: String, content: String, confirmButtonTitle: String, cancelButtonTitle: String?,
|
|
||||||
cancelAsDefault: Bool, delegate: ctlNonModalAlertWindowDelegate?
|
|
||||||
) {
|
|
||||||
guard let window = window else { return }
|
|
||||||
if window.isVisible == true {
|
|
||||||
self.delegate?.ctlNonModalAlertWindowDidCancel(self)
|
|
||||||
}
|
|
||||||
|
|
||||||
self.delegate = delegate
|
|
||||||
|
|
||||||
var oldFrame = confirmButton.frame
|
|
||||||
confirmButton.title = confirmButtonTitle
|
|
||||||
confirmButton.sizeToFit()
|
|
||||||
|
|
||||||
var newFrame = confirmButton.frame
|
|
||||||
newFrame.size.width = max(90, newFrame.size.width + 10)
|
|
||||||
newFrame.origin.x += oldFrame.size.width - newFrame.size.width
|
|
||||||
confirmButton.frame = newFrame
|
|
||||||
|
|
||||||
if let cancelButtonTitle = cancelButtonTitle {
|
|
||||||
cancelButton.title = cancelButtonTitle
|
|
||||||
cancelButton.sizeToFit()
|
|
||||||
var adjustFrame = cancelButton.frame
|
|
||||||
adjustFrame.size.width = max(90, adjustFrame.size.width + 10)
|
|
||||||
adjustFrame.origin.x = newFrame.origin.x - adjustFrame.size.width
|
|
||||||
confirmButton.frame = adjustFrame
|
|
||||||
cancelButton.isHidden = false
|
|
||||||
} else {
|
|
||||||
cancelButton.isHidden = true
|
|
||||||
}
|
|
||||||
|
|
||||||
cancelButton.nextKeyView = confirmButton
|
|
||||||
confirmButton.nextKeyView = cancelButton
|
|
||||||
|
|
||||||
if cancelButtonTitle != nil {
|
|
||||||
if cancelAsDefault {
|
|
||||||
window.defaultButtonCell = cancelButton.cell as? NSButtonCell
|
|
||||||
} else {
|
|
||||||
cancelButton.keyEquivalent = " "
|
|
||||||
window.defaultButtonCell = confirmButton.cell as? NSButtonCell
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
window.defaultButtonCell = confirmButton.cell as? NSButtonCell
|
|
||||||
}
|
|
||||||
|
|
||||||
titleTextField.stringValue = title
|
|
||||||
|
|
||||||
oldFrame = contentTextField.frame
|
|
||||||
contentTextField.stringValue = content
|
|
||||||
|
|
||||||
var infiniteHeightFrame = oldFrame
|
|
||||||
infiniteHeightFrame.size.width -= 4.0
|
|
||||||
infiniteHeightFrame.size.height = 10240
|
|
||||||
newFrame = (content as NSString).boundingRect(
|
|
||||||
with: infiniteHeightFrame.size, options: [.usesLineFragmentOrigin],
|
|
||||||
attributes: [.font: contentTextField.font!]
|
|
||||||
)
|
|
||||||
newFrame.size.width = max(newFrame.size.width, oldFrame.size.width)
|
|
||||||
newFrame.size.height += 4.0
|
|
||||||
newFrame.origin = oldFrame.origin
|
|
||||||
newFrame.origin.y -= (newFrame.size.height - oldFrame.size.height)
|
|
||||||
contentTextField.frame = newFrame
|
|
||||||
|
|
||||||
var windowFrame = window.frame
|
|
||||||
windowFrame.size.height += (newFrame.size.height - oldFrame.size.height)
|
|
||||||
window.level = NSWindow.Level(Int(CGShieldingWindowLevel()) + 1)
|
|
||||||
window.setFrame(windowFrame, display: true)
|
|
||||||
window.center()
|
|
||||||
window.makeKeyAndOrderFront(self)
|
|
||||||
NSApp.activate(ignoringOtherApps: true)
|
|
||||||
}
|
|
||||||
|
|
||||||
@IBAction func confirmButtonAction(_: Any) {
|
|
||||||
delegate?.ctlNonModalAlertWindowDidConfirm(self)
|
|
||||||
window?.orderOut(self)
|
|
||||||
}
|
|
||||||
|
|
||||||
@IBAction func cancelButtonAction(_ sender: Any) {
|
|
||||||
cancel(sender)
|
|
||||||
}
|
|
||||||
|
|
||||||
func cancel(_: Any) {
|
|
||||||
delegate?.ctlNonModalAlertWindowDidCancel(self)
|
|
||||||
delegate = nil
|
|
||||||
window?.orderOut(self)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,108 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="19529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
|
|
||||||
<dependencies>
|
|
||||||
<deployment identifier="macosx"/>
|
|
||||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19529"/>
|
|
||||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
|
||||||
</dependencies>
|
|
||||||
<objects>
|
|
||||||
<customObject id="-2" userLabel="File's Owner" customClass="ctlNonModalAlertWindow" customModule="vChewing" customModuleProvider="target">
|
|
||||||
<connections>
|
|
||||||
<outlet property="cancelButton" destination="71" id="83"/>
|
|
||||||
<outlet property="confirmButton" destination="5" id="82"/>
|
|
||||||
<outlet property="contentTextField" destination="59" id="79"/>
|
|
||||||
<outlet property="titleTextField" destination="39" id="78"/>
|
|
||||||
<outlet property="window" destination="1" id="3"/>
|
|
||||||
</connections>
|
|
||||||
</customObject>
|
|
||||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
|
||||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
|
||||||
<window allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" restorable="NO" visibleAtLaunch="NO" animationBehavior="default" titlebarAppearsTransparent="YES" id="1">
|
|
||||||
<windowStyleMask key="styleMask" titled="YES" fullSizeContentView="YES"/>
|
|
||||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
|
||||||
<rect key="contentRect" x="196" y="240" width="420" height="130"/>
|
|
||||||
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1055"/>
|
|
||||||
<view key="contentView" id="2" customClass="NSVisualEffectView">
|
|
||||||
<rect key="frame" x="0.0" y="0.0" width="420" height="130"/>
|
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
|
||||||
<subviews>
|
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="5">
|
|
||||||
<rect key="frame" x="314" y="13" width="92" height="32"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="78" id="OIg-RG-etq"/>
|
|
||||||
</constraints>
|
|
||||||
<buttonCell key="cell" type="push" title="Button" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="6">
|
|
||||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
|
||||||
<font key="font" metaFont="system"/>
|
|
||||||
</buttonCell>
|
|
||||||
<connections>
|
|
||||||
<action selector="confirmButtonAction:" target="-2" id="85"/>
|
|
||||||
</connections>
|
|
||||||
</button>
|
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="71">
|
|
||||||
<rect key="frame" x="222" y="13" width="92" height="32"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="78" id="Ky0-Zb-Gla"/>
|
|
||||||
</constraints>
|
|
||||||
<buttonCell key="cell" type="push" title="Button" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="73">
|
|
||||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
|
||||||
<font key="font" metaFont="system"/>
|
|
||||||
</buttonCell>
|
|
||||||
<connections>
|
|
||||||
<action selector="cancelButtonAction:" target="-2" id="86"/>
|
|
||||||
</connections>
|
|
||||||
</button>
|
|
||||||
<imageView translatesAutoresizingMaskIntoConstraints="NO" id="12">
|
|
||||||
<rect key="frame" x="24" y="50" width="64" height="64"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="width" constant="64" id="A3W-eQ-z1A"/>
|
|
||||||
</constraints>
|
|
||||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="AlertIcon" id="13"/>
|
|
||||||
</imageView>
|
|
||||||
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="39">
|
|
||||||
<rect key="frame" x="103" y="92" width="300" height="17"/>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstAttribute="height" constant="17" id="P7H-ef-iqw"/>
|
|
||||||
</constraints>
|
|
||||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Lorem ipsum" id="40">
|
|
||||||
<font key="font" metaFont="systemBold"/>
|
|
||||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
|
||||||
</textFieldCell>
|
|
||||||
</textField>
|
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" preferredMaxLayoutWidth="296" translatesAutoresizingMaskIntoConstraints="NO" id="59">
|
|
||||||
<rect key="frame" x="103" y="70" width="300" height="14"/>
|
|
||||||
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Lorem ipsum" id="60">
|
|
||||||
<font key="font" metaFont="smallSystem"/>
|
|
||||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
|
||||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
|
||||||
</textFieldCell>
|
|
||||||
</textField>
|
|
||||||
</subviews>
|
|
||||||
<constraints>
|
|
||||||
<constraint firstItem="59" firstAttribute="top" secondItem="39" secondAttribute="bottom" constant="8" symbolic="YES" id="1wt-ne-dF2"/>
|
|
||||||
<constraint firstItem="71" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="2" secondAttribute="leading" constant="20" symbolic="YES" id="7bF-DG-vdn"/>
|
|
||||||
<constraint firstAttribute="bottom" secondItem="12" secondAttribute="bottom" constant="50" id="8xn-Ib-OoE"/>
|
|
||||||
<constraint firstItem="39" firstAttribute="leading" secondItem="12" secondAttribute="trailing" constant="17" id="Fby-g8-C6h"/>
|
|
||||||
<constraint firstAttribute="trailing" secondItem="39" secondAttribute="trailing" constant="19" id="MvK-Vm-t8m"/>
|
|
||||||
<constraint firstItem="39" firstAttribute="top" secondItem="2" secondAttribute="top" constant="21" id="QZ0-fh-VbK"/>
|
|
||||||
<constraint firstItem="71" firstAttribute="baseline" secondItem="5" secondAttribute="baseline" id="WzK-fU-3PM"/>
|
|
||||||
<constraint firstItem="39" firstAttribute="leading" secondItem="59" secondAttribute="leading" id="amF-fF-0aV"/>
|
|
||||||
<constraint firstAttribute="trailing" secondItem="5" secondAttribute="trailing" constant="21" id="b3T-ES-VrG"/>
|
|
||||||
<constraint firstItem="5" firstAttribute="leading" secondItem="71" secondAttribute="trailing" constant="14" id="kas-eq-M8s"/>
|
|
||||||
<constraint firstItem="39" firstAttribute="trailing" secondItem="59" secondAttribute="trailing" id="l6t-qJ-mLX"/>
|
|
||||||
<constraint firstAttribute="bottom" secondItem="71" secondAttribute="bottom" constant="20" symbolic="YES" id="mHa-mT-h87"/>
|
|
||||||
<constraint firstItem="12" firstAttribute="leading" secondItem="2" secondAttribute="leading" constant="24" id="oRs-Yb-Ysu"/>
|
|
||||||
<constraint firstItem="12" firstAttribute="top" secondItem="2" secondAttribute="top" constant="16" id="reW-NP-Ec0"/>
|
|
||||||
</constraints>
|
|
||||||
</view>
|
|
||||||
<connections>
|
|
||||||
<outlet property="delegate" destination="-2" id="4"/>
|
|
||||||
</connections>
|
|
||||||
<point key="canvasLocation" x="140" y="146"/>
|
|
||||||
</window>
|
|
||||||
</objects>
|
|
||||||
<resources>
|
|
||||||
<image name="AlertIcon" width="64" height="64"/>
|
|
||||||
</resources>
|
|
||||||
</document>
|
|
|
@ -78,7 +78,6 @@
|
||||||
5BB802DA27FABA8300CF1C19 /* ctlInputMethod_Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BB802D927FABA8300CF1C19 /* ctlInputMethod_Menu.swift */; };
|
5BB802DA27FABA8300CF1C19 /* ctlInputMethod_Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BB802D927FABA8300CF1C19 /* ctlInputMethod_Menu.swift */; };
|
||||||
5BBBB75F27AED54C0023B93A /* Beep.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 5BBBB75D27AED54C0023B93A /* Beep.m4a */; };
|
5BBBB75F27AED54C0023B93A /* Beep.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 5BBBB75D27AED54C0023B93A /* Beep.m4a */; };
|
||||||
5BBBB76027AED54C0023B93A /* Fart.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 5BBBB75E27AED54C0023B93A /* Fart.m4a */; };
|
5BBBB76027AED54C0023B93A /* Fart.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 5BBBB75E27AED54C0023B93A /* Fart.m4a */; };
|
||||||
5BBBB76B27AED5DB0023B93A /* frmNonModalAlertWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BBBB76527AED5DB0023B93A /* frmNonModalAlertWindow.xib */; };
|
|
||||||
5BBBB76D27AED5DB0023B93A /* frmAboutWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BBBB76927AED5DB0023B93A /* frmAboutWindow.xib */; };
|
5BBBB76D27AED5DB0023B93A /* frmAboutWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 5BBBB76927AED5DB0023B93A /* frmAboutWindow.xib */; };
|
||||||
5BBBB77327AED70B0023B93A /* MenuIcon-TCVIM@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5BBBB76F27AED70B0023B93A /* MenuIcon-TCVIM@2x.png */; };
|
5BBBB77327AED70B0023B93A /* MenuIcon-TCVIM@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5BBBB76F27AED70B0023B93A /* MenuIcon-TCVIM@2x.png */; };
|
||||||
5BBBB77427AED70B0023B93A /* MenuIcon-SCVIM@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5BBBB77027AED70B0023B93A /* MenuIcon-SCVIM@2x.png */; };
|
5BBBB77427AED70B0023B93A /* MenuIcon-SCVIM@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 5BBBB77027AED70B0023B93A /* MenuIcon-SCVIM@2x.png */; };
|
||||||
|
@ -137,7 +136,6 @@
|
||||||
D427F76C278CA2B0004A2160 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D427F76B278CA1BA004A2160 /* AppDelegate.swift */; };
|
D427F76C278CA2B0004A2160 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D427F76B278CA1BA004A2160 /* AppDelegate.swift */; };
|
||||||
D47B92C027972AD100458394 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = D47B92BF27972AC800458394 /* main.swift */; };
|
D47B92C027972AD100458394 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = D47B92BF27972AC800458394 /* main.swift */; };
|
||||||
D47F7DCE278BFB57002F9DD7 /* ctlPrefWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = D47F7DCD278BFB57002F9DD7 /* ctlPrefWindow.swift */; };
|
D47F7DCE278BFB57002F9DD7 /* ctlPrefWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = D47F7DCD278BFB57002F9DD7 /* ctlPrefWindow.swift */; };
|
||||||
D47F7DD0278C0897002F9DD7 /* ctlNonModalAlertWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = D47F7DCF278C0897002F9DD7 /* ctlNonModalAlertWindow.swift */; };
|
|
||||||
D4A13D5A27A59F0B003BE359 /* ctlInputMethod_Core.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4A13D5927A59D5C003BE359 /* ctlInputMethod_Core.swift */; };
|
D4A13D5A27A59F0B003BE359 /* ctlInputMethod_Core.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4A13D5927A59D5C003BE359 /* ctlInputMethod_Core.swift */; };
|
||||||
D4E33D8A27A838CF006DB1CF /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = D4E33D8827A838CF006DB1CF /* Localizable.strings */; };
|
D4E33D8A27A838CF006DB1CF /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = D4E33D8827A838CF006DB1CF /* Localizable.strings */; };
|
||||||
D4E33D8F27A838F0006DB1CF /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D4E33D8D27A838F0006DB1CF /* InfoPlist.strings */; };
|
D4E33D8F27A838F0006DB1CF /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D4E33D8D27A838F0006DB1CF /* InfoPlist.strings */; };
|
||||||
|
@ -296,7 +294,6 @@
|
||||||
5BB802D927FABA8300CF1C19 /* ctlInputMethod_Menu.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = ctlInputMethod_Menu.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
5BB802D927FABA8300CF1C19 /* ctlInputMethod_Menu.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = ctlInputMethod_Menu.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
||||||
5BBBB75D27AED54C0023B93A /* Beep.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = Beep.m4a; sourceTree = "<group>"; };
|
5BBBB75D27AED54C0023B93A /* Beep.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = Beep.m4a; sourceTree = "<group>"; };
|
||||||
5BBBB75E27AED54C0023B93A /* Fart.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = Fart.m4a; sourceTree = "<group>"; };
|
5BBBB75E27AED54C0023B93A /* Fart.m4a */ = {isa = PBXFileReference; lastKnownFileType = file; path = Fart.m4a; sourceTree = "<group>"; };
|
||||||
5BBBB76627AED5DB0023B93A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/frmNonModalAlertWindow.xib; sourceTree = "<group>"; };
|
|
||||||
5BBBB76A27AED5DB0023B93A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/frmAboutWindow.xib; sourceTree = "<group>"; };
|
5BBBB76A27AED5DB0023B93A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/frmAboutWindow.xib; sourceTree = "<group>"; };
|
||||||
5BBBB76F27AED70B0023B93A /* MenuIcon-TCVIM@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "MenuIcon-TCVIM@2x.png"; sourceTree = "<group>"; };
|
5BBBB76F27AED70B0023B93A /* MenuIcon-TCVIM@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "MenuIcon-TCVIM@2x.png"; sourceTree = "<group>"; };
|
||||||
5BBBB77027AED70B0023B93A /* MenuIcon-SCVIM@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "MenuIcon-SCVIM@2x.png"; sourceTree = "<group>"; };
|
5BBBB77027AED70B0023B93A /* MenuIcon-SCVIM@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "MenuIcon-SCVIM@2x.png"; sourceTree = "<group>"; };
|
||||||
|
@ -369,7 +366,6 @@
|
||||||
D427F76B278CA1BA004A2160 /* AppDelegate.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = AppDelegate.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
D427F76B278CA1BA004A2160 /* AppDelegate.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = AppDelegate.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
||||||
D47B92BF27972AC800458394 /* main.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = main.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
D47B92BF27972AC800458394 /* main.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = main.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
||||||
D47F7DCD278BFB57002F9DD7 /* ctlPrefWindow.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = ctlPrefWindow.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
D47F7DCD278BFB57002F9DD7 /* ctlPrefWindow.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = ctlPrefWindow.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
||||||
D47F7DCF278C0897002F9DD7 /* ctlNonModalAlertWindow.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = ctlNonModalAlertWindow.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
|
||||||
D4A13D5927A59D5C003BE359 /* ctlInputMethod_Core.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = ctlInputMethod_Core.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
D4A13D5927A59D5C003BE359 /* ctlInputMethod_Core.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; fileEncoding = 4; indentWidth = 2; lineEnding = 0; path = ctlInputMethod_Core.swift; sourceTree = "<group>"; tabWidth = 2; usesTabs = 0; };
|
||||||
D4E33D8927A838CF006DB1CF /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = "<group>"; };
|
D4E33D8927A838CF006DB1CF /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||||
D4E33D8E27A838F0006DB1CF /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
D4E33D8E27A838F0006DB1CF /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||||
|
@ -586,7 +582,6 @@
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
5B62A33C27AE7CC100A19448 /* ctlAboutWindow.swift */,
|
5B62A33C27AE7CC100A19448 /* ctlAboutWindow.swift */,
|
||||||
D47F7DCF278C0897002F9DD7 /* ctlNonModalAlertWindow.swift */,
|
|
||||||
D47F7DCD278BFB57002F9DD7 /* ctlPrefWindow.swift */,
|
D47F7DCD278BFB57002F9DD7 /* ctlPrefWindow.swift */,
|
||||||
);
|
);
|
||||||
path = WindowControllers;
|
path = WindowControllers;
|
||||||
|
@ -596,7 +591,6 @@
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
5BBBB76927AED5DB0023B93A /* frmAboutWindow.xib */,
|
5BBBB76927AED5DB0023B93A /* frmAboutWindow.xib */,
|
||||||
5BBBB76527AED5DB0023B93A /* frmNonModalAlertWindow.xib */,
|
|
||||||
5B7BC4AE27AFFBE800F66C24 /* frmPrefWindow.xib */,
|
5B7BC4AE27AFFBE800F66C24 /* frmPrefWindow.xib */,
|
||||||
6A187E2816004C5900466B2E /* MainMenu.xib */,
|
6A187E2816004C5900466B2E /* MainMenu.xib */,
|
||||||
);
|
);
|
||||||
|
@ -1070,7 +1064,6 @@
|
||||||
5BBBB76027AED54C0023B93A /* Fart.m4a in Resources */,
|
5BBBB76027AED54C0023B93A /* Fart.m4a in Resources */,
|
||||||
6A2E40F6253A69DA00D1AE1D /* Images.xcassets in Resources */,
|
6A2E40F6253A69DA00D1AE1D /* Images.xcassets in Resources */,
|
||||||
D4E33D8F27A838F0006DB1CF /* InfoPlist.strings in Resources */,
|
D4E33D8F27A838F0006DB1CF /* InfoPlist.strings in Resources */,
|
||||||
5BBBB76B27AED5DB0023B93A /* frmNonModalAlertWindow.xib in Resources */,
|
|
||||||
5BEDB723283B4C250078EB25 /* data-cht.plist in Resources */,
|
5BEDB723283B4C250078EB25 /* data-cht.plist in Resources */,
|
||||||
5BEDB721283B4C250078EB25 /* data-cns.plist in Resources */,
|
5BEDB721283B4C250078EB25 /* data-cns.plist in Resources */,
|
||||||
5BF9DA2D288427E000DBD48E /* template-associatedPhrases-cht.txt in Resources */,
|
5BF9DA2D288427E000DBD48E /* template-associatedPhrases-cht.txt in Resources */,
|
||||||
|
@ -1217,7 +1210,6 @@
|
||||||
5B84579F2871AD2200C93B01 /* HotenkaChineseConverter.swift in Sources */,
|
5B84579F2871AD2200C93B01 /* HotenkaChineseConverter.swift in Sources */,
|
||||||
5B887F302826AEA400B6651E /* lmCoreEX.swift in Sources */,
|
5B887F302826AEA400B6651E /* lmCoreEX.swift in Sources */,
|
||||||
5BA9FD4627FEF3C9002DE248 /* Container.swift in Sources */,
|
5BA9FD4627FEF3C9002DE248 /* Container.swift in Sources */,
|
||||||
D47F7DD0278C0897002F9DD7 /* ctlNonModalAlertWindow.swift in Sources */,
|
|
||||||
5B2170E5289FACAD00BE7304 /* 6_Node.swift in Sources */,
|
5B2170E5289FACAD00BE7304 /* 6_Node.swift in Sources */,
|
||||||
5B949BD92816DC5400D87B5D /* LineReader.swift in Sources */,
|
5B949BD92816DC5400D87B5D /* LineReader.swift in Sources */,
|
||||||
5BA9FD1027FEDB6B002DE248 /* suiPrefPaneKeyboard.swift in Sources */,
|
5BA9FD1027FEDB6B002DE248 /* suiPrefPaneKeyboard.swift in Sources */,
|
||||||
|
@ -1344,14 +1336,6 @@
|
||||||
name = frmPrefWindow.xib;
|
name = frmPrefWindow.xib;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
5BBBB76527AED5DB0023B93A /* frmNonModalAlertWindow.xib */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
5BBBB76627AED5DB0023B93A /* Base */,
|
|
||||||
);
|
|
||||||
name = frmNonModalAlertWindow.xib;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
5BBBB76927AED5DB0023B93A /* frmAboutWindow.xib */ = {
|
5BBBB76927AED5DB0023B93A /* frmAboutWindow.xib */ = {
|
||||||
isa = PBXVariantGroup;
|
isa = PBXVariantGroup;
|
||||||
children = (
|
children = (
|
||||||
|
|
Loading…
Reference in New Issue