Update ListerAProductivityAppBuiltinSwift

This commit is contained in:
Liu Lantao 2014-06-06 22:27:49 +08:00
parent 4610aafc26
commit c37971efdb
10 changed files with 2 additions and 941 deletions

View File

@ -1,208 +0,0 @@
/*
<codex />
*/
import UIKit
var _sharedListCoordinator: ListCoordinator?
class ListCoordinator: NSObject {
struct Notifications {
static let storageChoiceDidChangeNotification = "storageChoiceDidChangeNotification"
}
struct Defaults {
static let storedUbiquityIdentityToken = "storedUbiquityIdentityToken"
}
struct Identifiers {
static let applicationGropuIdentifier = "A93A5CM278.com.example.apple-samplecode.ListerGroup"
static let ubiquityContainerIdentifier = "A93A5CM278.com.example.apple-samplecode.Lister"
}
class func sharedListCoordinator() -> ListCoordinator {
if _sharedListCoordinator {
return _sharedListCoordinator!
}
_sharedListCoordinator = ListCoordinator()
return _sharedListCoordinator!
}
var storedUbiquityIdentityToken: protocol<NSCoding, NSCopying, NSObjectProtocol>? {
var storedToken: protocol<NSCoding, NSCopying, NSObjectProtocol>?
// determine if the logged in iCloud account has changed since the user last launched the app
let archivedObject: AnyObject? = NSUserDefaults.standardUserDefaults().objectForKey(ListCoordinator.Defaults.storedUbiquityIdentityToken)
if let ubiquityIdentityTokenArchive = archivedObject as? NSData {
if let archivedObject = NSKeyedUnarchiver.unarchiveObjectWithData(ubiquityIdentityTokenArchive) as? protocol<NSCoding, NSCopying, NSObjectProtocol> {
storedToken = archivedObject
}
}
return storedToken
}
var documentsDirectory = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL
var groupDocumentsDirectory: NSURL {
if cloudEnabled {
return documentsDirectory
}
else {
return NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier(ListCoordinator.Identifiers.applicationGropuIdentifier)
}
}
var todayDocumentURL: NSURL {
return groupDocumentsDirectory.URLByAppendingPathComponent("Today.list")
}
var cloudEnabled: Bool = false {
didSet {
if cloudEnabled != oldValue {
updateFileStorageContainerURL()
NSNotificationCenter.defaultCenter().postNotificationName(ListCoordinator.Notifications.storageChoiceDidChangeNotification, object: self)
}
}
}
// MARK: Identity
func checkUbiquityIdentityDidChange() -> Bool {
var result = false
let currentToken = NSFileManager.defaultManager().ubiquityIdentityToken
let storedToken = storedUbiquityIdentityToken
if !currentToken || !storedToken || !currentToken.isEqual(storedToken) {
println("ubiquity identity has changed")
handleUbiquityIdentityChange()
result = true
}
return result
}
func handleUbiquityIdentityChange() {
var defaults = NSUserDefaults.standardUserDefaults()
if let token = NSFileManager.defaultManager().ubiquityIdentityToken {
// the account has changed
println("user changed iCloud accounts")
let ubiquityIdentityTokenArchive = NSKeyedArchiver.archivedDataWithRootObject(token)
defaults.setObject(ubiquityIdentityTokenArchive, forKey: ListCoordinator.Defaults.storedUbiquityIdentityToken)
}
else {
// there is no signed-in account
println("user signed out of iCloud")
defaults.removeObjectForKey(ListCoordinator.Defaults.storedUbiquityIdentityToken)
}
defaults.synchronize()
}
func ubiquityIdentityDidChangeNotification(notification: NSNotification) {
println("ubiquity identity did change")
handleUbiquityIdentityChange()
println("should post a notification to alert the app that the identity has changed")
}
// MARK: Today
func ensureTodayDocumentExistsWithError(outError: NSErrorPointer) -> Bool {
let fileManager = NSFileManager.defaultManager()
if fileManager.fileExistsAtPath(todayDocumentURL.path) {
return true
}
// <rdar://problem/16908721> NSBundle(forClass:) should remain as NSBundle.bundleForClass()
// <rdar://problem/16880689> "dynamicType" requires "self" in class scope
let defaultTodayDocumentURL = NSBundle.mainBundle().URLForResource("Today", withExtension: "list")
return fileManager.copyItemAtURL(defaultTodayDocumentURL, toURL: todayDocumentURL, error: error)
}
// MARK: Document Handling
func updateFileStorageContainerURL() {
let oldDocumentsDirectory = documentsDirectory
if !cloudEnabled {
// <rdar://problem/16953693> Array.firstElement
documentsDirectory = (NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)[0] as NSURL)
}
else {
let cloudDirectory = NSFileManager.defaultManager().URLForUbiquityContainerIdentifier(ListCoordinator.Identifiers.ubiquityContainerIdentifier)!
documentsDirectory = cloudDirectory.URLByAppendingPathComponent("Documents")
var error: NSError?
let localDocuments = NSFileManager.defaultManager().contentsOfDirectoryAtURL(oldDocumentsDirectory, includingPropertiesForKeys: nil, options: .SkipsPackageDescendants, error: &error)
for object: AnyObject in localDocuments! {
if let url = object as? NSURL {
if url.pathExtension == "list" {
moveFileToUbiquity(url)
}
}
}
}
}
func moveFileToUbiquity(sourceURL: NSURL) {
let destinationFileName = sourceURL.lastPathComponent
let destinationURL = documentsDirectory.URLByAppendingPathComponent(destinationFileName)
// dispatch ubiquity upload to background queue
var defaultQueue = dispatch_get_global_queue(CLong(DISPATCH_QUEUE_PRIORITY_DEFAULT), 0)
dispatch_async(defaultQueue) {
let fileManager = NSFileManager()
var error: NSError?
let success: Bool = fileManager.setUbiquitous(true, itemAtURL: sourceURL, destinationURL: destinationURL, error: &error)
if !success {
println("couldn't move file \(sourceURL.absoluteString) to cloud at: \(destinationURL.absoluteString). Error: \(error.description)")
}
}
}
func copyFileToDocuments(sourceURL: NSURL) {
copyFileFrom(sourceURL, to: documentsDirectory.URLByAppendingPathComponent(sourceURL.lastPathComponent))
}
func copyFileToGroupDocuments(sourceURL: NSURL) {
copyFileFrom(sourceURL, to: groupDocumentsDirectory.URLByAppendingPathComponent(sourceURL.lastPathComponent))
}
func copyFileFrom(from: NSURL, to: NSURL) {
let coordinator = NSFileCoordinator(filePresenter: nil)
coordinator.coordinateWritingItemAtURL(from, options: .ForMoving, writingItemAtURL: to, options: .ForReplacing, error: nil) { (source, destination) in
var moveError: NSError?
let success = NSFileManager().copyItemAtURL(source, toURL: destination, error: &moveError)
if success {
println("moved file: \(source.absoluteString) to: \(destination.absoluteString).")
}
else {
println("couldn't move file: \(source.absoluteString) to: \(destination.absoluteString). Error: \(moveError.description)")
}
}
}
func deleteFileAtURL(fileURL: NSURL) {
let fileCoordinator = NSFileCoordinator()
var error: NSError?
fileCoordinator.coordinateWritingItemAtURL(fileURL, options: .ForDeleting, error: &error) { writingURL in
NSFileManager().removeItemAtURL(writingURL, error: &error)
// Need the return statement here because single line closures are assumed to return values.
// Tracking radar for fix: <rdar://problem/13175298> Allow function conversion from (A) -> B to (A) -> ()
return
}
if error {
println("couldn't delete file at URL \(fileURL.absoluteString). Error: \(error.description)")
}
}
}

View File

@ -1,420 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6154.5" systemVersion="14A238h" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6154.5"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
<connections>
<outlet property="delegate" destination="jdX-3Y-psN" id="MQd-Rk-Oib"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<customObject id="jdX-3Y-psN" customClass="ApplicationDelegate" customModule="ListerOSX"/>
<menu title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="Lister" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Lister" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="About Lister" id="5kV-Vb-QxS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="-1" id="Exp-CZ-Vem"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
<menuItem title="Preferences…" keyEquivalent="," id="BOF-NM-1cW"/>
<menuItem isSeparatorItem="YES" id="wFC-TO-SCJ"/>
<menuItem title="Services" id="NMo-om-nkz">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Services" systemMenu="services" id="hz9-B4-Xy5"/>
</menuItem>
<menuItem isSeparatorItem="YES" id="4je-JR-u6R"/>
<menuItem title="Hide Lister" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="-1" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="-1" id="VT4-aY-XCT"/>
</connections>
</menuItem>
<menuItem title="Show All" id="Kd2-mp-pUS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unhideAllApplications:" target="-1" id="Dhg-Le-xox"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
<menuItem title="Quit Lister" keyEquivalent="q" id="4sb-4s-VLi">
<connections>
<action selector="terminate:" target="-1" id="Te7-pn-YzF"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="File" id="dMs-cI-mzQ">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="File" id="bib-Uj-vzu">
<items>
<menuItem title="New" keyEquivalent="n" id="Was-JA-tGl">
<connections>
<action selector="newDocument:" target="-1" id="4Si-XN-c54"/>
</connections>
</menuItem>
<menuItem title="Open…" keyEquivalent="o" id="IAo-SY-fd9">
<connections>
<action selector="openDocument:" target="-1" id="bVn-NM-KNZ"/>
</connections>
</menuItem>
<menuItem title="Open Today List" keyEquivalent="t" id="D3I-mn-BfF">
<connections>
<action selector="openTodayDocument:" target="-1" id="HFr-Da-z7e"/>
</connections>
</menuItem>
<menuItem title="Open Recent" id="tXI-mr-wws">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Open Recent" systemMenu="recentDocuments" id="oas-Oc-fiZ">
<items>
<menuItem title="Clear Menu" id="vNY-rz-j42">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="clearRecentDocuments:" target="-1" id="Daa-9d-B3U"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem isSeparatorItem="YES" id="m54-Is-iLE"/>
<menuItem title="Close" keyEquivalent="w" id="DVo-aG-piG">
<connections>
<action selector="performClose:" target="-1" id="HmO-Ls-i7Q"/>
</connections>
</menuItem>
<menuItem title="Save…" keyEquivalent="s" id="pxx-59-PXV">
<connections>
<action selector="saveDocument:" target="-1" id="teZ-XB-qJY"/>
</connections>
</menuItem>
<menuItem title="Save As…" keyEquivalent="S" id="Bw7-FT-i3A">
<connections>
<action selector="saveDocumentAs:" target="-1" id="mDf-zr-I0C"/>
</connections>
</menuItem>
<menuItem title="Revert to Saved" id="KaW-ft-85H">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="revertDocumentToSaved:" target="-1" id="iJ3-Pv-kwq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="aJh-i4-bef"/>
<menuItem title="Page Setup…" keyEquivalent="P" id="qIS-W8-SiK">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="runPageLayout:" target="-1" id="Din-rz-gC5"/>
</connections>
</menuItem>
<menuItem title="Print…" keyEquivalent="p" id="aTl-1u-JFS">
<connections>
<action selector="printDocument:" target="-1" id="qaZ-4w-aoO"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Edit" id="5QF-Oa-p0T">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Edit" id="W48-6f-4Dl">
<items>
<menuItem title="Undo" keyEquivalent="z" id="dRJ-4n-Yzg">
<connections>
<action selector="undo:" target="-1" id="M6e-cu-g7V"/>
</connections>
</menuItem>
<menuItem title="Redo" keyEquivalent="Z" id="6dh-zS-Vam">
<connections>
<action selector="redo:" target="-1" id="oIA-Rs-6OD"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="WRV-NI-Exz"/>
<menuItem title="Complete All" keyEquivalent="C" id="iik-Dk-SwK">
<connections>
<action selector="completeAllItems:" target="-1" id="Gvu-Ar-fJb"/>
</connections>
</menuItem>
<menuItem title="Incomplete All" keyEquivalent="I" id="Izf-2i-uxX">
<connections>
<action selector="incompleteAllItems:" target="-1" id="G6k-69-DEf"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="DWF-LI-aeM"/>
<menuItem title="Cut" keyEquivalent="x" id="uRl-iY-unG">
<connections>
<action selector="cut:" target="-1" id="YJe-68-I9s"/>
</connections>
</menuItem>
<menuItem title="Copy" keyEquivalent="c" id="x3v-GG-iWU">
<connections>
<action selector="copy:" target="-1" id="G1f-GL-Joy"/>
</connections>
</menuItem>
<menuItem title="Paste" keyEquivalent="v" id="gVA-U4-sdL">
<connections>
<action selector="paste:" target="-1" id="UvS-8e-Qdg"/>
</connections>
</menuItem>
<menuItem title="Paste and Match Style" keyEquivalent="V" id="WeT-3V-zwk">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="pasteAsPlainText:" target="-1" id="cEh-KX-wJQ"/>
</connections>
</menuItem>
<menuItem title="Delete" id="pa3-QI-u2k">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="delete:" target="-1" id="0Mk-Ml-PaM"/>
</connections>
</menuItem>
<menuItem title="Select All" keyEquivalent="a" id="Ruw-6m-B2m">
<connections>
<action selector="selectAll:" target="-1" id="VNm-Mi-diN"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="uyl-h8-XO2"/>
<menuItem title="Find" id="4EN-yA-p0u">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Find" id="1b7-l0-nxx">
<items>
<menuItem title="Find…" tag="1" keyEquivalent="f" id="Xz5-n4-O0W">
<connections>
<action selector="performFindPanelAction:" target="-1" id="cD7-Qs-BN4"/>
</connections>
</menuItem>
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="YEy-JH-Tfz">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="performFindPanelAction:" target="-1" id="WD3-Gg-5AJ"/>
</connections>
</menuItem>
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="q09-fT-Sye">
<connections>
<action selector="performFindPanelAction:" target="-1" id="NDo-RZ-v9R"/>
</connections>
</menuItem>
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="OwM-mh-QMV">
<connections>
<action selector="performFindPanelAction:" target="-1" id="HOh-sY-3ay"/>
</connections>
</menuItem>
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="buJ-ug-pKt">
<connections>
<action selector="performFindPanelAction:" target="-1" id="U76-nv-p5D"/>
</connections>
</menuItem>
<menuItem title="Jump to Selection" keyEquivalent="j" id="S0p-oC-mLd">
<connections>
<action selector="centerSelectionInVisibleArea:" target="-1" id="IOG-6D-g5B"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Spelling and Grammar" id="Dv1-io-Yv7">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Spelling" id="3IN-sU-3Bg">
<items>
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="HFo-cy-zxI">
<connections>
<action selector="showGuessPanel:" target="-1" id="vFj-Ks-hy3"/>
</connections>
</menuItem>
<menuItem title="Check Document Now" keyEquivalent=";" id="hz2-CU-CR7">
<connections>
<action selector="checkSpelling:" target="-1" id="fz7-VC-reM"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="bNw-od-mp5"/>
<menuItem title="Check Spelling While Typing" id="rbD-Rh-wIN">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleContinuousSpellChecking:" target="-1" id="7w6-Qz-0kB"/>
</connections>
</menuItem>
<menuItem title="Check Grammar With Spelling" id="mK6-2p-4JG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleGrammarChecking:" target="-1" id="muD-Qn-j4w"/>
</connections>
</menuItem>
<menuItem title="Correct Spelling Automatically" id="78Y-hA-62v">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticSpellingCorrection:" target="-1" id="2lM-Qi-WAP"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Substitutions" id="9ic-FL-obx">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Substitutions" id="FeM-D8-WVr">
<items>
<menuItem title="Show Substitutions" id="z6F-FW-3nz">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontSubstitutionsPanel:" target="-1" id="oku-mr-iSq"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="gPx-C9-uUO"/>
<menuItem title="Smart Copy/Paste" id="9yt-4B-nSM">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleSmartInsertDelete:" target="-1" id="3IJ-Se-DZD"/>
</connections>
</menuItem>
<menuItem title="Smart Quotes" id="hQb-2v-fYv">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="ptq-xd-QOA"/>
</connections>
</menuItem>
<menuItem title="Smart Dashes" id="rgM-f4-ycn">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDashSubstitution:" target="-1" id="oCt-pO-9gS"/>
</connections>
</menuItem>
<menuItem title="Smart Links" id="cwL-P1-jid">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticLinkDetection:" target="-1" id="Gip-E3-Fov"/>
</connections>
</menuItem>
<menuItem title="Data Detectors" id="tRr-pd-1PS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticDataDetection:" target="-1" id="R1I-Nq-Kbl"/>
</connections>
</menuItem>
<menuItem title="Text Replacement" id="HFQ-gK-NFA">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleAutomaticTextReplacement:" target="-1" id="DvP-Fe-Py6"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Transformations" id="2oI-Rn-ZJC">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Transformations" id="c8a-y6-VQd">
<items>
<menuItem title="Make Upper Case" id="vmV-6d-7jI">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="uppercaseWord:" target="-1" id="sPh-Tk-edu"/>
</connections>
</menuItem>
<menuItem title="Make Lower Case" id="d9M-CD-aMd">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="lowercaseWord:" target="-1" id="iUZ-b5-hil"/>
</connections>
</menuItem>
<menuItem title="Capitalize" id="UEZ-Bs-lqG">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="capitalizeWord:" target="-1" id="26H-TL-nsh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Speech" id="xrE-MZ-jX0">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Speech" id="3rS-ZA-NoH">
<items>
<menuItem title="Start Speaking" id="Ynk-f8-cLZ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="startSpeaking:" target="-1" id="654-Ng-kyl"/>
</connections>
</menuItem>
<menuItem title="Stop Speaking" id="Oyz-dy-DGm">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="stopSpeaking:" target="-1" id="dX8-6p-jy9"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="View" id="H8h-7b-M4v">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="View" id="HyV-fh-RgO">
<items>
<menuItem title="Show Toolbar" keyEquivalent="t" id="snW-S8-Cw5">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="toggleToolbarShown:" target="-1" id="BXY-wc-z0C"/>
</connections>
</menuItem>
<menuItem title="Customize Toolbar…" id="1UK-8n-QPP">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="runToolbarCustomizationPalette:" target="-1" id="pQI-g3-MTW"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Window" id="aUF-d1-5bR">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Window" systemMenu="window" id="Td7-aD-5lo">
<items>
<menuItem title="Minimize" keyEquivalent="m" id="OY7-WF-poV">
<connections>
<action selector="performMiniaturize:" target="-1" id="VwT-WD-YPe"/>
</connections>
</menuItem>
<menuItem title="Zoom" id="R4o-n2-Eq4">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="performZoom:" target="-1" id="DIl-cC-cCs"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="eu3-7i-yIM"/>
<menuItem title="Bring All to Front" id="LE2-aR-0XJ">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="arrangeInFront:" target="-1" id="DRN-fu-gQh"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Help" id="wpr-3q-Mcd">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
<items>
<menuItem title="Lister Help" keyEquivalent="?" id="FKE-Sm-Kum">
<connections>
<action selector="showHelp:" target="-1" id="y7X-2Q-9no"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
</objects>
</document>

View File

@ -1,58 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="6106" systemVersion="14A194e" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="6106"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner"/>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application"/>
<customView id="yj6-w8-hv4" customClass="ListItemView">
<rect key="frame" x="0.0" y="0.0" width="482" height="35"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<button hidden="YES" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="fDL-6G-73e">
<rect key="frame" x="392" y="10" width="86" height="16"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<constraints>
<constraint firstAttribute="width" constant="86" id="B3s-Am-sZM"/>
<constraint firstAttribute="height" constant="16" id="khU-ir-lyE"/>
</constraints>
<buttonCell key="cell" type="inline" title="Complete" bezelStyle="inline" alignment="center" state="on" inset="2" id="Sua-Zv-iGg">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="smallSystemBold"/>
</buttonCell>
<connections>
<action selector="buttonClicked:" target="yj6-w8-hv4" id="yO1-N4-Ywx"/>
</connections>
</button>
<textField focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="rDZ-jx-lhS" customClass="ResizingTextField">
<rect key="frame" x="13" y="6" width="254" height="22"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<constraints>
<constraint firstAttribute="width" constant="254" id="1ss-rr-flr"/>
<constraint firstAttribute="height" constant="22" id="HnH-01-Iae"/>
</constraints>
<textFieldCell key="cell" lineBreakMode="truncatingHead" selectable="YES" editable="YES" sendsActionOnEndEditing="YES" state="on" focusRingType="none" drawsBackground="YES" usesSingleLineMode="YES" id="H5V-3p-rmK">
<font key="font" metaFont="system"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="1" alpha="0.0" colorSpace="deviceWhite"/>
</textFieldCell>
<connections>
<outlet property="widthConstraint" destination="1ss-rr-flr" id="ghC-pN-vhK"/>
</connections>
</textField>
</subviews>
<constraints>
<constraint firstItem="rDZ-jx-lhS" firstAttribute="centerY" secondItem="yj6-w8-hv4" secondAttribute="centerY" id="CLk-RP-Pdz"/>
<constraint firstAttribute="trailing" secondItem="fDL-6G-73e" secondAttribute="trailing" constant="4" id="CiF-Ja-OKL"/>
<constraint firstItem="fDL-6G-73e" firstAttribute="centerY" secondItem="yj6-w8-hv4" secondAttribute="centerY" priority="999" id="HyD-bU-qQH"/>
<constraint firstItem="rDZ-jx-lhS" firstAttribute="leading" secondItem="yj6-w8-hv4" secondAttribute="leading" constant="13" id="t9r-X1-dpq"/>
</constraints>
<connections>
<outlet property="statusButton" destination="fDL-6G-73e" id="ozB-d1-a6g"/>
<outlet property="textField" destination="rDZ-jx-lhS" id="Rqy-6a-zGS"/>
</connections>
</customView>
</objects>
</document>

View File

@ -127,6 +127,7 @@ class ListCoordinator: NSObject {
else { else {
// In your app, handle this gracefully. // In your app, handle this gracefully.
NSLog("Couldn't move file: \(sourceURL.absoluteString) to: \(destinationURL.absoluteString). Error: \(moveError.description).") NSLog("Couldn't move file: \(sourceURL.absoluteString) to: \(destinationURL.absoluteString). Error: \(moveError.description).")
abort()
} }
} }
} }

View File

@ -1,45 +0,0 @@
/*
<codex />
*/
import UIKit
class ListFileRepresentation: Equatable {
var URL: NSURL! {
if let item = self.item {
return item.valueForAttribute(NSMetadataItemURLKey) as NSURL
}
else {
return _URL
}
}
var _URL: NSURL!
var item: NSMetadataItem?
var color: List.Color = .Gray
init(URL: NSURL) {
_URL = URL
}
init(metadataItem item: NSMetadataItem) {
self.item = item
_URL = item.valueForAttribute(NSMetadataItemURLKey) as NSURL
}
func prepare(completionHandler: () -> Void) {
let document = ListDocument(fileURL: URL)
document.openWithCompletionHandler() { _ in
self.color = document.list.color
document.closeWithCompletionHandler(nil)
completionHandler()
}
}
}
func ==(lhs: ListFileRepresentation, rhs: ListFileRepresentation) -> Bool {
// the metadata item does not impact equality for our purposes
return lhs.URL == rhs.URL
}

View File

@ -1,42 +0,0 @@
/*
Copyright (C) 2014 Apple Inc. All Rights Reserved.
See LICENSE.txt for this samples licensing information
*/
import Cocoa
import ListerKitOSX
class ApplicationDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(NSNotification) {
AppConfiguration.sharedConfiguration.runHandlerOnFirstLaunch {
// Make sure that no other documents are visible except for the Today document.
NSDocumentController.sharedDocumentController().closeAllDocumentsWithDelegate(nil, didCloseAllSelector: nil, contextInfo: nil)
self.openTodayDocument()
}
}
// Note that there are two possibile callers for this method. The first is the application delegate if it's the first launch.
// The other possibility is if you use the keyboard shortcut (Command-T) to open your Today document.
@IBAction func openTodayDocument(_: AnyObject? = nil) {
let listManager = TodayListManager.sharedTodayListManager
let documentController = NSDocumentController.sharedDocumentController() as NSDocumentController
var error: NSError?
if !listManager.ensureTodayDocumentExistsWithError(&error) {
documentController.presentError(error)
return
}
documentController.openDocumentWithContentsOfURL(listManager.todayDocumentURL, display: true) { (document, _, _) in
documentController.addDocument(document)
}
}
}
// <rdar://problem/16880777> can't compare two NSObjectProtocol instances even though they implement -isEqual:
func ==(lhs: protocol<NSObjectProtocol, NSCoding, NSCopying>, rhs: protocol<NSObjectProtocol, NSCoding, NSCopying>) -> Bool {
return lhs.isEqual(rhs)
}

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.application-groups</key>
<array>
<string>$(TeamIdentifierPrefix)com.example.apple-samplecode.ListerGroup</string>
</array>
</dict>
</plist>

View File

@ -1,104 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="6154.16" systemVersion="14A238s" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" initialViewController="Yx6-Rv-4Rt">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6153.10"/>
<capability name="Aspect ratio constraints" minToolsVersion="5.1"/>
</dependencies>
<scenes>
<!--TtC4 7com example apple samplecode Lister Lister Today19 Today View Controller-->
<scene sceneID="ptT-1U-RxG">
<objects>
<tableViewController id="Yx6-Rv-4Rt" customClass="TodayViewController" customModule="com_example_apple_samplecode_Lister_ListerToday" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" showsSelectionImmediatelyOnTouchBegin="NO" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="qUQ-YA-DWa">
<rect key="frame" x="0.0" y="0.0" width="320" height="200"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<prototypes>
<tableViewCell contentMode="scaleToFill" ambiguous="YES" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="todayViewCell" id="yvc-Rb-Ky9" customClass="CheckboxCell" customModule="com_example_apple_samplecode_Lister_ListerToday">
<rect key="frame" x="0.0" y="86" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="yvc-Rb-Ky9" id="FVA-2r-Qck">
<rect key="frame" x="0.0" y="0.0" width="703" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="SdY-qH-iah" customClass="CheckBox" customModule="ListerKit">
<rect key="frame" x="15" y="8" width="27.5" height="28"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<color key="tintColor" white="0.33333333333333331" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="width" secondItem="SdY-qH-iah" secondAttribute="height" multiplier="1:1" id="ZEg-1d-KMS"/>
</constraints>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="boolean" keyPath="isChecked" value="NO"/>
<userDefinedRuntimeAttribute type="number" keyPath="insetFactor">
<real key="value" value="0.171875"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="number" keyPath="strokeFactor">
<real key="value" value="0.068359375"/>
</userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>
<connections>
<action selector="checkBoxTapped:" destination="Yx6-Rv-4Rt" eventType="touchUpInside" id="X65-ZG-6tK"/>
</connections>
</view>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bpF-CM-0Y8">
<rect key="frame" x="57.5" y="12" width="247.5" height="20"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<color key="textColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="bpF-CM-0Y8" firstAttribute="leading" secondItem="SdY-qH-iah" secondAttribute="trailing" constant="15" id="3bX-xw-2S0"/>
<constraint firstAttribute="bottom" secondItem="SdY-qH-iah" secondAttribute="bottom" constant="8" id="Ae1-1Y-6SB"/>
<constraint firstAttribute="centerY" secondItem="bpF-CM-0Y8" secondAttribute="centerY" id="Jld-hP-mol"/>
<constraint firstItem="SdY-qH-iah" firstAttribute="leading" secondItem="FVA-2r-Qck" secondAttribute="leading" constant="15" id="OBm-Jx-Jkl"/>
<constraint firstItem="SdY-qH-iah" firstAttribute="top" secondItem="FVA-2r-Qck" secondAttribute="top" constant="8" id="Xl6-eD-p6n"/>
<constraint firstAttribute="trailing" secondItem="bpF-CM-0Y8" secondAttribute="trailing" constant="15" id="jNW-fZ-UrU"/>
</constraints>
</tableViewCellContentView>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<connections>
<outlet property="checkBox" destination="SdY-qH-iah" id="piX-je-ZlD"/>
<outlet property="label" destination="bpF-CM-0Y8" id="tvC-hs-6vU"/>
</connections>
</tableViewCell>
<tableViewCell appearanceType="aqua" contentMode="scaleToFill" ambiguous="YES" selectionStyle="none" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="messageCell" textLabel="A1L-bz-N4F" style="IBUITableViewCellStyleDefault" id="iIK-77-nn0">
<rect key="frame" x="0.0" y="86" width="320" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="iIK-77-nn0" id="YtQ-tO-l90">
<rect key="frame" x="0.0" y="0.0" width="703" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="left" text="Title" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="A1L-bz-N4F">
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleBody"/>
<color key="textColor" cocoaTouchSystemColor="lightTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</tableViewCellContentView>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</tableViewCell>
</prototypes>
<connections>
<outlet property="dataSource" destination="Yx6-Rv-4Rt" id="7fu-R9-uFa"/>
<outlet property="delegate" destination="Yx6-Rv-4Rt" id="uFG-i3-vV9"/>
</connections>
</tableView>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<size key="freeformSize" width="320" height="200"/>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="KX6-mw-unc" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="516" y="533"/>
</scene>
</scenes>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar"/>
<simulatedOrientationMetrics key="orientation"/>
<simulatedScreenMetrics key="destination" type="retina4"/>
</simulatedMetricsContainer>
</document>

View File

@ -1,53 +0,0 @@
/*
Copyright (C) 2014 Apple Inc. All Rights Reserved.
See LICENSE.txt for this samples licensing information
*/
import Cocoa
import ListerKitOSX
@objc protocol ListerTodayDocumentDelegate {
func listerTodayDocumentDidUpdateContents(document: ListerTodayDocument)
}
class ListerTodayDocument: NSDocument {
var list: List!
weak var delegate: ListerTodayDocumentDelegate?
override class func autosavesInPlace() -> Bool {
return true
}
override func readFromData(data: NSData, ofType typeName: String, error outError: NSErrorPointer) -> Bool {
if let deserializedList = NSKeyedUnarchiver.unarchiveObjectWithData(data) as List {
list = deserializedList
return true
}
let error = NSError(domain: NSCocoaErrorDomain, code: NSFileReadCorruptFileError, userInfo: [
NSLocalizedDescriptionKey: NSLocalizedString("Could not read file", comment: "Read error description"),
NSLocalizedFailureReasonErrorKey: NSLocalizedString("File was in an invalid format", comment: "Read failure reason")
])
outError.memory = error
return false
}
override func dataOfType(typeName: String, error outError: NSErrorPointer) -> NSData? {
if let data = NSKeyedArchiver.archivedDataWithRootObject(list) {
return data
}
let error = NSError(domain: NSCocoaErrorDomain, code: NSFileWriteUnknownError, userInfo: [
NSLocalizedDescriptionKey: NSLocalizedString("Could not save file", comment: "Write error description"),
NSLocalizedFailureReasonErrorKey: NSLocalizedString("An unexpected error occured", comment: "Write failure reason")
])
outError.memory = error
return nil
}
}