From 335559d3dcc3c7672391123fe1f9376dde4b472a Mon Sep 17 00:00:00 2001 From: Bill Heaton Date: Sun, 19 Apr 2015 13:45:53 -0700 Subject: [PATCH 1/6] Initial Comment of SwiftSidebar --- Cocoa Plug-ins/SwiftSidebar/.gitignore | 21 +++ Cocoa Plug-ins/SwiftSidebar/README.md | 155 ++++++++++++++++++ .../SwiftSidebar/SwiftSidebar/Info.plist | 38 +++++ .../SwiftSidebar/SwiftSidebar/SwiftLogo.pdf | Bin 0 -> 56906 bytes .../SwiftSidebar-Bridging-Header.h | 9 + .../SwiftSidebar/SwiftSidebarView.swift | 55 +++++++ .../SwiftSidebar/SwiftSidebarView.xib | 42 +++++ .../SwiftSidebar/SwitftSidebar.swift | 68 ++++++++ 8 files changed, 388 insertions(+) create mode 100644 Cocoa Plug-ins/SwiftSidebar/.gitignore create mode 100644 Cocoa Plug-ins/SwiftSidebar/README.md create mode 100644 Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/Info.plist create mode 100644 Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftLogo.pdf create mode 100644 Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebar-Bridging-Header.h create mode 100644 Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebarView.swift create mode 100644 Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebarView.xib create mode 100644 Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwitftSidebar.swift diff --git a/Cocoa Plug-ins/SwiftSidebar/.gitignore b/Cocoa Plug-ins/SwiftSidebar/.gitignore new file mode 100644 index 0000000..779b359 --- /dev/null +++ b/Cocoa Plug-ins/SwiftSidebar/.gitignore @@ -0,0 +1,21 @@ +# Apple's Swift libs +SwiftLibs/* + +# Xcode +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate + diff --git a/Cocoa Plug-ins/SwiftSidebar/README.md b/Cocoa Plug-ins/SwiftSidebar/README.md new file mode 100644 index 0000000..a291ba2 --- /dev/null +++ b/Cocoa Plug-ins/SwiftSidebar/README.md @@ -0,0 +1,155 @@ +#Swift Sidebar Coda Plugin + +##Introduction +SwiftSidebar is an Coda2 Sidebar to demonstrate using Apple's Swift language to +create a sidebar. + +*Note: This project should be considered as **Experimental** as at this point +Swift is still having problems dealing with the realities of a Plug-in Bundle. Look +for Notes on the areas where I worked around the problems* + +##Contact Information +> Bill Heaton + [http://winkwinknodnod.net/about](http://winkwinknodnod.net/about) + +##Development Environment + +* The Coda Plugin was generated using Xcode Version 6.2 available from the + Apple App Store: [https://itunes.apple.com/us/app/xcode/id49779983](https://itunes.apple.com/us/app/xcode/id49779983) +* The plugin uses the Coda Plugin Source code Version 7 available from + [https://github.com/panicinc/CodaPluginKit](https://github.com/panicinc/CodaPluginKit) + +## Creating A Sidebar Plugin Project + +This is how I created the project in Xcode6: + +* File/New/Project... +* Select OS X "Framework & Library", "Bundle" Then "Next" +* Bundle Extension = codasidebar +* Edit your Info.plist +* Add the Coda2 Information and "Principal Class" information + +> +| Name | Type | Description | +| ------------------------------- | -------- | ----------------------- | +| CodaAuthorString | [String] | The Authors name | +| CodaDescriptionString | [String] | Sidebar Description | +| CodaIconHighlightHexColor | [String] | #9100FF | +| CodaIconMaskFile | [String] | Your Sidebar Icon File | +| CodaPlugInSupportedAPIVersion | [Number] | 7 | +| Principal Class | [String] | YourStartingClass | + +* Create a pdf of your icon for the home view. 200px x 200px black and white image + for best results with the name you have in the "CodaIconMaskFile" entry. +* Create your principal class where the class name is what your set in your info.plist: + "File" / "File.." / "OS X" / "Source" / "Swift File" / Save as YourStartingClass + + ``` + import Foundation + import Cocoa + + class YourStartingClass { + } + ``` + +## Swift Dynalib Workaround + +Currently xcode doesn't know to copy the libswift* files to the bundle. The workaround is +to copy the dylibs from the xcode.app directory to the our source tree and then add a copy +files phase. + +*The means that anytime you update xcode you'll need to snag a copy until +Apple fixes the problem.* + +If you missing one of the librarys you'll get a: "Library not loaded: @rpath/libswiftXXXXX.dylib" +in your debug output. + +Here's a list of the ones that I added for this project: + + * @rpath/libswiftAppKit.dylib + * @rpath/libswiftCore.dylib + * @rpath/libswiftCoreGraphics.dylib + * @rpath/libswiftDarwin.dylib + * @rpath/libswiftDispatch.dylib + * @rpath/libswiftFoundation.dylib + * @rpath/libswiftObjectiveC.dylib + * @rpath/libswiftQuartzCore.dylib + * @rpath/libswiftSecurity.dylib + +### Create The Swift Dynalibs directory + * mkdir SwiftLibs + * cd Swiftlibs + * Copy/Paste: + + ``` + cp /applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswift* . + ``` + +### Add the Dynalibs to your project + * Select your plugin target + * Select "Build Phases" tab + * Click "+" and select "New Copy Files Phase" + * Click the "Copy Files" line + * Set "Destinaton" to "Frameworks" + * For each file missing; Click "+" and browse for the dylib needed in the SwiftLibs directory. + +## Swift PrincipalClass Workaround +Swift will override the PrincipalClass item in info.plist using the class name found in +the first file compiled. You'll need to make sure that the class is always the first file +compiled. Here's how: + + * Select your plugin target + * Select "Build Phases" tab + * Click "Compile Sources" line to open it up + * If your PrincipalClass isn't the first file compiled drag it to the top line. + +## Debugging the Project +To Setup Debugging — [Thank-you to http://ngs.io](http://ngs.io/2012/05/25/debugging-coda-plug-in-with-lldb/) + + * Project -> Scheme -> Edit Scheme... + * Select Run Debug from sidebar. + * Select "Other" from the "Executable" drop down + * Browse to your Coda2 application + * Click "Choose" button then "Close" button + * Select your your plug-in target. + * Select Build Settings tab, click Add Build Setting, select Add User-Defined Setting and + set name as INSTALL_BUNDLE, and value as 1 for Debug configuration. + * Switch to Build Phase tab, click Add Build Phase button and select Add Run Script, Copy + and paste the script below: + + ``` + if [ $INSTALL_BUNDLE == 1 ]; then + DEST="$USER_LIBRARY_DIR/Application Support/Coda 2/Plug-ins/$FULL_PRODUCT_NAME" + ORG="$TARGET_BUILD_DIR/$FULL_PRODUCT_NAME" + rm -rf "$DEST" + cp -R "$ORG" "$DEST" + fi + ``` +*Note: Original script used "mv" which caused xcode not to create/copy the nib File +"cp" works around the problem.* + +## License Terms +©2015 by William J. Heaton, LLC — All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + diff --git a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/Info.plist b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/Info.plist new file mode 100644 index 0000000..e5aac6c --- /dev/null +++ b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/Info.plist @@ -0,0 +1,38 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + Com.WinkWinkNodNod.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSHumanReadableCopyright + Copyright © 2015 WinkWinkNodNod, LLC. All rights reserved. See README.md for license terms + NSPrincipalClass + SwiftSidebar + CodaPlugInSupportedAPIVersion + 7 + CodaAuthorString + WinkWinkNodNod + CodaDescriptionString + Swift Example Sidebar + CodaIconHighlightHexColor + #9100FF + CodaIconMaskFile + SwiftLogo + + diff --git a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftLogo.pdf b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftLogo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8b784fed3bd4d7dc91bb8b05b971968985658d2c GIT binary patch literal 56906 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 L_SwfB@r?UFE`;d# literal 0 HcmV?d00001 diff --git a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebar-Bridging-Header.h b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebar-Bridging-Header.h new file mode 100644 index 0000000..4ba3e24 --- /dev/null +++ b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebar-Bridging-Header.h @@ -0,0 +1,9 @@ +/** + * SwithSidebar-Bridging-Header.h - Import Objective-c Classes + * + * (c) 2015 by William J. Heaton, LLC - All Rights Reserved. + * See license terms in README.md + */ +#import "CodaPluginsController.h" + + diff --git a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebarView.swift b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebarView.swift new file mode 100644 index 0000000..561da9a --- /dev/null +++ b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebarView.swift @@ -0,0 +1,55 @@ +/** +* SwiftViewController.swift - Interface to the sidebar view +* +* (c) 2015 by William J. Heaton, LLC - All Rights Reserved. +* See license terms in README.md +*/ + +import Foundation +import Cocoa + +/** + * Swift Sidebar View + * + * This is the view controller for out sidebar. We load our nib from the bundle that passed to use. + * + */ + +class SwiftSidebarView: NSViewController, CodaSidebarViewController { + + /// The plugin controller pointer we received so that we can talk to Coda. + var plugInController:AnyObject! = nil + + /// Label for Coda Version + @IBOutlet weak var labelVersion: NSTextField! + + /** + * This is the equvalence of: "- (id)initWithNibName:(NSString*)nibName + * plugInBundle:(id )plugInBundle + * plugInController:(CodaPlugInsController*)aController + * + * :param: plugInController A pointer to the plugin controller + * :param: plugInBundle A pointer the bundle we were loaded from + */ + required init?( nibName: String, plugInController:AnyObject!, plugInBundle:AnyObject! ) + { + self.plugInController = plugInController + super.init( nibName: nibName, bundle: plugInBundle as? NSBundle) + } + + /// Workaround for Swift wanting this init + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + /** + * Action Routine for the Button. Proves that we can hear button pushes and that we + * can effect view elements. A side effect is that we prove that we can call the Coda API + * + * :param: sender The ID of the sending button + */ + @IBAction func actioniButton(sender: AnyObject) { + labelVersion.stringValue = "Coda Version " + self.plugInController.codaVersion() + } + +} \ No newline at end of file diff --git a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebarView.xib b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebarView.xib new file mode 100644 index 0000000..a0720d9 --- /dev/null +++ b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebarView.xib @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwitftSidebar.swift b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwitftSidebar.swift new file mode 100644 index 0000000..7938393 --- /dev/null +++ b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwitftSidebar.swift @@ -0,0 +1,68 @@ +/** + * SwithSidebar.swift - Principal Class for Swift Sidebar + * + * (c) 2015 by William J. Heaton, LLC - All Rights Reserved. + * See license terms in README.md + */ + +import Foundation +import Cocoa + +/** + * Swift Sidebar + * + * This class provides the principal interface that Coda 2 uses to communicate with the our + * plugin. The name of the class should match the NSPrincipalClass item in info.plist or + * you'll get an obnoxious error message that diffcult to trace down. + */ +@objc class SwiftSidebar : NSObject, CodaSidebarPlugIn, CodaPlugIn { + + /// The plugin controller pointer we received so that we can talk to Coda. + var plugInController:AnyObject! = nil + + /// The Plugin Bundle pointer we received so that we can access our bundle. + var plugInBundle:CodaPlugInBundle! = nil + + /** + * The equivalent of "- (NSString*)name;" A Required function to return + * the name of the plugin. + * + * :returns: String with our name + */ + func name() -> String { + return "Swift Sidebar" + } + + /** + * The equivalent of "-(id)initWithPlugInController:(CodaPlugInsController*)aController" + * plugInBundle:(id )plugInBundle;The default initalization method for + * your plug-in's principal class. + * + * :param: plugInController A pointer to the plugin controller + * :param: plugInBundle A pointer the bundle we were loaded from + */ + required init(plugInController:CodaPlugInsController!, plugInBundle:CodaPlugInBundle!) + { + self.plugInController = plugInController; + self.plugInBundle = plugInBundle; + super.init() + } + + /// Workaround Swift wanting this init + required init(plugInController: CodaPlugInsController!, bundle: NSBundle!) + { + fatalError("Sorry, The Swift Plugin requires Coda 2.0.1 or later.") + } + + /** + * Return a new sidebar view controller for our sidebar. Return a new autoreleased view + * controller to be inserted into the sidebar, will be called once per window. + * + * :returns: A view controller which conforms to the CodaSidebarViewController protocol. + */ + func viewController() -> NSViewController! { + return SwiftSidebarView(nibName:"SwiftSidebarView", + plugInController:self.plugInController, + plugInBundle:self.plugInBundle ) + } +} \ No newline at end of file From d1bafcfdf02c6b5915a1567ea214761b02d1a87a Mon Sep 17 00:00:00 2001 From: Bill Heaton Date: Sun, 19 Apr 2015 14:01:12 -0700 Subject: [PATCH 2/6] Project didn't make it completely in. --- .../SwiftSidebar.xcodeproj/project.pbxproj | 376 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + 2 files changed, 383 insertions(+) create mode 100644 Cocoa Plug-ins/SwiftSidebar/SwiftSidebar.xcodeproj/project.pbxproj create mode 100644 Cocoa Plug-ins/SwiftSidebar/SwiftSidebar.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar.xcodeproj/project.pbxproj b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar.xcodeproj/project.pbxproj new file mode 100644 index 0000000..86cf979 --- /dev/null +++ b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar.xcodeproj/project.pbxproj @@ -0,0 +1,376 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 2BCC56A91ACD9A20002C3E80 /* SwitftSidebar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BCC56A81ACD9A20002C3E80 /* SwitftSidebar.swift */; }; + 2BDD21E91ADB0CFA00480F72 /* SwiftSidebarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BDD21E71ADB0CFA00480F72 /* SwiftSidebarView.swift */; }; + 2BDD21EA1ADB0CFA00480F72 /* SwiftSidebarView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2BDD21E81ADB0CFA00480F72 /* SwiftSidebarView.xib */; }; + 2BDFB9A51ACFBC5500DB3D71 /* SwiftLogo.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 2BDFB9A31ACFBC5500DB3D71 /* SwiftLogo.pdf */; }; + 2BDFB9B11ACFE9E600DB3D71 /* libswiftCore.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2BDFB9B01ACFE9E600DB3D71 /* libswiftCore.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 2BDFB9B31ACFEA6C00DB3D71 /* libswiftCoreGraphics.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2BDFB9B21ACFEA6C00DB3D71 /* libswiftCoreGraphics.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 2BDFB9B51ACFEA8100DB3D71 /* libswiftDarwin.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2BDFB9B41ACFEA8100DB3D71 /* libswiftDarwin.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 2BDFB9B71ACFEAA800DB3D71 /* libswiftDispatch.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2BDFB9B61ACFEAA800DB3D71 /* libswiftDispatch.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 2BDFB9B91ACFEAC200DB3D71 /* libswiftFoundation.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2BDFB9B81ACFEAC200DB3D71 /* libswiftFoundation.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 2BDFB9BB1ACFEAD900DB3D71 /* libswiftObjectiveC.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2BDFB9BA1ACFEAD900DB3D71 /* libswiftObjectiveC.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 2BDFB9BD1ACFEAED00DB3D71 /* libswiftQuartzCore.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2BDFB9BC1ACFEAED00DB3D71 /* libswiftQuartzCore.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 2BDFB9BF1ACFEAFD00DB3D71 /* libswiftSecurity.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2BDFB9BE1ACFEAFD00DB3D71 /* libswiftSecurity.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 2BDFB9C21ACFEE5000DB3D71 /* libswiftAppKit.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = 2BDFB9C11ACFEE5000DB3D71 /* libswiftAppKit.dylib */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 2BDFB9AD1ACFE82300DB3D71 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 2BDFB9C21ACFEE5000DB3D71 /* libswiftAppKit.dylib in CopyFiles */, + 2BDFB9BF1ACFEAFD00DB3D71 /* libswiftSecurity.dylib in CopyFiles */, + 2BDFB9BD1ACFEAED00DB3D71 /* libswiftQuartzCore.dylib in CopyFiles */, + 2BDFB9BB1ACFEAD900DB3D71 /* libswiftObjectiveC.dylib in CopyFiles */, + 2BDFB9B91ACFEAC200DB3D71 /* libswiftFoundation.dylib in CopyFiles */, + 2BDFB9B71ACFEAA800DB3D71 /* libswiftDispatch.dylib in CopyFiles */, + 2BDFB9B51ACFEA8100DB3D71 /* libswiftDarwin.dylib in CopyFiles */, + 2BDFB9B31ACFEA6C00DB3D71 /* libswiftCoreGraphics.dylib in CopyFiles */, + 2BDFB9B11ACFE9E600DB3D71 /* libswiftCore.dylib in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 2BCC569C1ACD99BE002C3E80 /* SwiftSidebar.codasidebar */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SwiftSidebar.codasidebar; sourceTree = BUILT_PRODUCTS_DIR; }; + 2BCC56A01ACD99BE002C3E80 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2BCC56A71ACD9A1F002C3E80 /* SwiftSidebar-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SwiftSidebar-Bridging-Header.h"; sourceTree = ""; }; + 2BCC56A81ACD9A20002C3E80 /* SwitftSidebar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwitftSidebar.swift; sourceTree = ""; }; + 2BCC56AA1ACD9B35002C3E80 /* CodaPlugInsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CodaPlugInsController.h; path = ../../CodaPlugInsController.h; sourceTree = ""; }; + 2BDD21E71ADB0CFA00480F72 /* SwiftSidebarView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftSidebarView.swift; sourceTree = ""; }; + 2BDD21E81ADB0CFA00480F72 /* SwiftSidebarView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SwiftSidebarView.xib; sourceTree = ""; }; + 2BDFB9A31ACFBC5500DB3D71 /* SwiftLogo.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = SwiftLogo.pdf; sourceTree = ""; }; + 2BDFB9AE1ACFE93600DB3D71 /* libswiftAppKit.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libswiftAppKit.dylib; path = SwiftLibs/libswiftAppKit.dylib; sourceTree = ""; }; + 2BDFB9B01ACFE9E600DB3D71 /* libswiftCore.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libswiftCore.dylib; path = SwiftLibs/libswiftCore.dylib; sourceTree = SOURCE_ROOT; }; + 2BDFB9B21ACFEA6C00DB3D71 /* libswiftCoreGraphics.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libswiftCoreGraphics.dylib; path = SwiftLibs/libswiftCoreGraphics.dylib; sourceTree = ""; }; + 2BDFB9B41ACFEA8100DB3D71 /* libswiftDarwin.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libswiftDarwin.dylib; path = SwiftLibs/libswiftDarwin.dylib; sourceTree = ""; }; + 2BDFB9B61ACFEAA800DB3D71 /* libswiftDispatch.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libswiftDispatch.dylib; path = SwiftLibs/libswiftDispatch.dylib; sourceTree = ""; }; + 2BDFB9B81ACFEAC200DB3D71 /* libswiftFoundation.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libswiftFoundation.dylib; path = SwiftLibs/libswiftFoundation.dylib; sourceTree = ""; }; + 2BDFB9BA1ACFEAD900DB3D71 /* libswiftObjectiveC.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libswiftObjectiveC.dylib; path = SwiftLibs/libswiftObjectiveC.dylib; sourceTree = ""; }; + 2BDFB9BC1ACFEAED00DB3D71 /* libswiftQuartzCore.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libswiftQuartzCore.dylib; path = SwiftLibs/libswiftQuartzCore.dylib; sourceTree = ""; }; + 2BDFB9BE1ACFEAFD00DB3D71 /* libswiftSecurity.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libswiftSecurity.dylib; path = SwiftLibs/libswiftSecurity.dylib; sourceTree = ""; }; + 2BDFB9C11ACFEE5000DB3D71 /* libswiftAppKit.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libswiftAppKit.dylib; path = SwiftLibs/libswiftAppKit.dylib; sourceTree = ""; }; + 2BE85AB11AE40FB800E5A287 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 2BCC56991ACD99BE002C3E80 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 2BCC56931ACD99BE002C3E80 = { + isa = PBXGroup; + children = ( + 2BCC569E1ACD99BE002C3E80 /* SwiftSidebar */, + 2BCC569D1ACD99BE002C3E80 /* Products */, + ); + sourceTree = ""; + }; + 2BCC569D1ACD99BE002C3E80 /* Products */ = { + isa = PBXGroup; + children = ( + 2BCC569C1ACD99BE002C3E80 /* SwiftSidebar.codasidebar */, + ); + name = Products; + sourceTree = ""; + }; + 2BCC569E1ACD99BE002C3E80 /* SwiftSidebar */ = { + isa = PBXGroup; + children = ( + 2BCC56A61ACD99D2002C3E80 /* Source */, + 2BDFB9C01ACFEBA000DB3D71 /* SwiftLibS */, + 2BCC569F1ACD99BE002C3E80 /* Supporting Files */, + ); + path = SwiftSidebar; + sourceTree = ""; + }; + 2BCC569F1ACD99BE002C3E80 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 2BE85AB11AE40FB800E5A287 /* README.md */, + 2BDFB9A31ACFBC5500DB3D71 /* SwiftLogo.pdf */, + 2BCC56AA1ACD9B35002C3E80 /* CodaPlugInsController.h */, + 2BCC56A01ACD99BE002C3E80 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 2BCC56A61ACD99D2002C3E80 /* Source */ = { + isa = PBXGroup; + children = ( + 2BCC56A81ACD9A20002C3E80 /* SwitftSidebar.swift */, + 2BDD21E71ADB0CFA00480F72 /* SwiftSidebarView.swift */, + 2BDD21E81ADB0CFA00480F72 /* SwiftSidebarView.xib */, + 2BCC56A71ACD9A1F002C3E80 /* SwiftSidebar-Bridging-Header.h */, + ); + name = Source; + sourceTree = ""; + }; + 2BDFB9C01ACFEBA000DB3D71 /* SwiftLibS */ = { + isa = PBXGroup; + children = ( + 2BDFB9C11ACFEE5000DB3D71 /* libswiftAppKit.dylib */, + 2BDFB9BE1ACFEAFD00DB3D71 /* libswiftSecurity.dylib */, + 2BDFB9BC1ACFEAED00DB3D71 /* libswiftQuartzCore.dylib */, + 2BDFB9BA1ACFEAD900DB3D71 /* libswiftObjectiveC.dylib */, + 2BDFB9B81ACFEAC200DB3D71 /* libswiftFoundation.dylib */, + 2BDFB9B61ACFEAA800DB3D71 /* libswiftDispatch.dylib */, + 2BDFB9B41ACFEA8100DB3D71 /* libswiftDarwin.dylib */, + 2BDFB9B21ACFEA6C00DB3D71 /* libswiftCoreGraphics.dylib */, + 2BDFB9B01ACFE9E600DB3D71 /* libswiftCore.dylib */, + 2BDFB9AE1ACFE93600DB3D71 /* libswiftAppKit.dylib */, + ); + name = SwiftLibS; + path = ..; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 2BCC569B1ACD99BE002C3E80 /* SwiftSidebar */ = { + isa = PBXNativeTarget; + buildConfigurationList = 2BCC56A31ACD99BE002C3E80 /* Build configuration list for PBXNativeTarget "SwiftSidebar" */; + buildPhases = ( + 2BCC56981ACD99BE002C3E80 /* Sources */, + 2BCC56991ACD99BE002C3E80 /* Frameworks */, + 2BCC569A1ACD99BE002C3E80 /* Resources */, + 2BDFB9AD1ACFE82300DB3D71 /* CopyFiles */, + 2BDFB9A71ACFBEF300DB3D71 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SwiftSidebar; + productName = SwiftSidebar; + productReference = 2BCC569C1ACD99BE002C3E80 /* SwiftSidebar.codasidebar */; + productType = "com.apple.product-type.bundle"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 2BCC56941ACD99BE002C3E80 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0620; + ORGANIZATIONNAME = "WinkWinkNodNod, LLC"; + TargetAttributes = { + 2BCC569B1ACD99BE002C3E80 = { + CreatedOnToolsVersion = 6.2; + }; + }; + }; + buildConfigurationList = 2BCC56971ACD99BE002C3E80 /* Build configuration list for PBXProject "SwiftSidebar" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 2BCC56931ACD99BE002C3E80; + productRefGroup = 2BCC569D1ACD99BE002C3E80 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 2BCC569B1ACD99BE002C3E80 /* SwiftSidebar */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 2BCC569A1ACD99BE002C3E80 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2BDFB9A51ACFBC5500DB3D71 /* SwiftLogo.pdf in Resources */, + 2BDD21EA1ADB0CFA00480F72 /* SwiftSidebarView.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 2BDFB9A71ACFBEF300DB3D71 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if [ $INSTALL_BUNDLE == 1 ]; then\n DEST=\"$USER_LIBRARY_DIR/Application Support/Coda 2/Plug-ins/$FULL_PRODUCT_NAME\"\n ORG=\"$TARGET_BUILD_DIR/$FULL_PRODUCT_NAME\"\n rm -rf \"$DEST\"\n cp -R \"$ORG\" \"$DEST\"\nfi"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 2BCC56981ACD99BE002C3E80 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 2BCC56A91ACD9A20002C3E80 /* SwitftSidebar.swift in Sources */, + 2BDD21E91ADB0CFA00480F72 /* SwiftSidebarView.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 2BCC56A11ACD99BE002C3E80 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.9; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 2BCC56A21ACD99BE002C3E80 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.9; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + }; + name = Release; + }; + 2BCC56A41ACD99BE002C3E80 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + COMBINE_HIDPI_IMAGES = YES; + CREATE_INFOPLIST_SECTION_IN_BINARY = NO; + INFOPLIST_FILE = SwiftSidebar/Info.plist; + INSTALL_BUNDLE = 1; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_OBJC_BRIDGING_HEADER = "SwiftSidebar/SwiftSidebar-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + WRAPPER_EXTENSION = codasidebar; + }; + name = Debug; + }; + 2BCC56A51ACD99BE002C3E80 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + COMBINE_HIDPI_IMAGES = YES; + CREATE_INFOPLIST_SECTION_IN_BINARY = NO; + INFOPLIST_FILE = SwiftSidebar/Info.plist; + INSTALL_BUNDLE = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Bundles"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_OBJC_BRIDGING_HEADER = "SwiftSidebar/SwiftSidebar-Bridging-Header.h"; + WRAPPER_EXTENSION = codasidebar; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2BCC56971ACD99BE002C3E80 /* Build configuration list for PBXProject "SwiftSidebar" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2BCC56A11ACD99BE002C3E80 /* Debug */, + 2BCC56A21ACD99BE002C3E80 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2BCC56A31ACD99BE002C3E80 /* Build configuration list for PBXNativeTarget "SwiftSidebar" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2BCC56A41ACD99BE002C3E80 /* Debug */, + 2BCC56A51ACD99BE002C3E80 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 2BCC56941ACD99BE002C3E80 /* Project object */; +} diff --git a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..fecd65b --- /dev/null +++ b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + From f3bd965e972f9350b5c111f6e90c672c6a0ded49 Mon Sep 17 00:00:00 2001 From: Bill Heaton Date: Mon, 20 Apr 2015 22:45:03 -0700 Subject: [PATCH 3/6] Correct Copyright lines --- Cocoa Plug-ins/SwiftSidebar/README.md | 2 +- Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/Info.plist | 4 +++- .../SwiftSidebar/SwiftSidebar/SwiftSidebar-Bridging-Header.h | 2 +- .../SwiftSidebar/SwiftSidebar/SwiftSidebarView.swift | 2 +- Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwitftSidebar.swift | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Cocoa Plug-ins/SwiftSidebar/README.md b/Cocoa Plug-ins/SwiftSidebar/README.md index a291ba2..67c1aed 100644 --- a/Cocoa Plug-ins/SwiftSidebar/README.md +++ b/Cocoa Plug-ins/SwiftSidebar/README.md @@ -129,7 +129,7 @@ To Setup Debugging — [Thank-you to http://ngs.io](http://ngs.io/2012/05/25 "cp" works around the problem.* ## License Terms -©2015 by William J. Heaton, LLC — All Rights Reserved. +©2015 by William J. Heaton — All Rights Reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/Info.plist b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/Info.plist index e5aac6c..db87b28 100644 --- a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/Info.plist +++ b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/Info.plist @@ -21,7 +21,7 @@ CFBundleVersion 1 NSHumanReadableCopyright - Copyright © 2015 WinkWinkNodNod, LLC. All rights reserved. See README.md for license terms + Copyright © 2015 William J Heaton. All rights reserved. See README.md for license terms NSPrincipalClass SwiftSidebar CodaPlugInSupportedAPIVersion @@ -34,5 +34,7 @@ #9100FF CodaIconMaskFile SwiftLogo + LSApplicationCategoryType + mysqldump -uroot --all-databases --master-data > yin_mysql_20150421.sql diff --git a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebar-Bridging-Header.h b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebar-Bridging-Header.h index 4ba3e24..ac6c061 100644 --- a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebar-Bridging-Header.h +++ b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebar-Bridging-Header.h @@ -1,7 +1,7 @@ /** * SwithSidebar-Bridging-Header.h - Import Objective-c Classes * - * (c) 2015 by William J. Heaton, LLC - All Rights Reserved. + * (c) 2015 by William J. Heaton - All Rights Reserved. * See license terms in README.md */ #import "CodaPluginsController.h" diff --git a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebarView.swift b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebarView.swift index 561da9a..8b860de 100644 --- a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebarView.swift +++ b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwiftSidebarView.swift @@ -1,7 +1,7 @@ /** * SwiftViewController.swift - Interface to the sidebar view * -* (c) 2015 by William J. Heaton, LLC - All Rights Reserved. +* (c) 2015 by William J. Heaton - All Rights Reserved. * See license terms in README.md */ diff --git a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwitftSidebar.swift b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwitftSidebar.swift index 7938393..6d446b8 100644 --- a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwitftSidebar.swift +++ b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/SwitftSidebar.swift @@ -1,7 +1,7 @@ /** * SwithSidebar.swift - Principal Class for Swift Sidebar * - * (c) 2015 by William J. Heaton, LLC - All Rights Reserved. + * (c) 2015 by William J. Heaton - All Rights Reserved. * See license terms in README.md */ From 7493ac7c4362b45bbe83938762529c112d3229eb Mon Sep 17 00:00:00 2001 From: Bill Heaton Date: Mon, 20 Apr 2015 22:54:02 -0700 Subject: [PATCH 4/6] How'd that get in there? --- Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/Info.plist | 2 -- 1 file changed, 2 deletions(-) diff --git a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/Info.plist b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/Info.plist index db87b28..3687ee9 100644 --- a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/Info.plist +++ b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/Info.plist @@ -34,7 +34,5 @@ #9100FF CodaIconMaskFile SwiftLogo - LSApplicationCategoryType - mysqldump -uroot --all-databases --master-data > yin_mysql_20150421.sql From cb80a18854d25b0492cdb5c6cf06e83e19da6ef2 Mon Sep 17 00:00:00 2001 From: Bill Heaton Date: Fri, 15 May 2015 15:23:15 -0700 Subject: [PATCH 5/6] Document what goes into the bridging header --- Cocoa Plug-ins/SwiftSidebar/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Cocoa Plug-ins/SwiftSidebar/README.md b/Cocoa Plug-ins/SwiftSidebar/README.md index 67c1aed..4d0d156 100644 --- a/Cocoa Plug-ins/SwiftSidebar/README.md +++ b/Cocoa Plug-ins/SwiftSidebar/README.md @@ -43,6 +43,8 @@ This is how I created the project in Xcode6: for best results with the name you have in the "CodaIconMaskFile" entry. * Create your principal class where the class name is what your set in your info.plist: "File" / "File.." / "OS X" / "Source" / "Swift File" / Save as YourStartingClass +* When it asks you to create a bridging Header, Agree. +* Here's a starter for your Starting Class: ``` import Foundation @@ -51,6 +53,11 @@ This is how I created the project in Xcode6: class YourStartingClass { } ``` +* Here a Starter for your bridging Header: + + ``` + #import "CodaPluginsController.h" + ``` ## Swift Dynalib Workaround From 04f3f9fc2aa7556c6d3ea50a28fd79088118ac28 Mon Sep 17 00:00:00 2001 From: Bill Heaton Date: Wed, 20 May 2015 16:37:56 -0700 Subject: [PATCH 6/6] Update PrincipalClass to fully namespaced value and document --- Cocoa Plug-ins/SwiftSidebar/README.md | 36 +++++++++---------- .../SwiftSidebar.xcodeproj/project.pbxproj | 2 +- .../SwiftSidebar/SwiftSidebar/Info.plist | 2 +- 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/Cocoa Plug-ins/SwiftSidebar/README.md b/Cocoa Plug-ins/SwiftSidebar/README.md index 4d0d156..cb30a65 100644 --- a/Cocoa Plug-ins/SwiftSidebar/README.md +++ b/Cocoa Plug-ins/SwiftSidebar/README.md @@ -30,19 +30,21 @@ This is how I created the project in Xcode6: * Add the Coda2 Information and "Principal Class" information > -| Name | Type | Description | -| ------------------------------- | -------- | ----------------------- | -| CodaAuthorString | [String] | The Authors name | -| CodaDescriptionString | [String] | Sidebar Description | -| CodaIconHighlightHexColor | [String] | #9100FF | -| CodaIconMaskFile | [String] | Your Sidebar Icon File | -| CodaPlugInSupportedAPIVersion | [Number] | 7 | -| Principal Class | [String] | YourStartingClass | - +| Name | Type | Description | +| ------------------------------- | -------- | ------------------------------------- | +| CodaAuthorString | [String] | The Authors name | +| CodaDescriptionString | [String] | Sidebar Description | +| CodaIconHighlightHexColor | [String] | #9100FF | +| CodaIconMaskFile | [String] | Your Sidebar Icon File | +| CodaPlugInSupportedAPIVersion | [Number] | 7 | +| Principal Class | [String] | . | + +* Note: According To Apple for Principal Class: "...In this case that occurs because Swift classes have + namespaced runtime names. Your principal class should therefore be of the form 'MyFramework.MyClass'." * Create a pdf of your icon for the home view. 200px x 200px black and white image for best results with the name you have in the "CodaIconMaskFile" entry. * Create your principal class where the class name is what your set in your info.plist: - "File" / "File.." / "OS X" / "Source" / "Swift File" / Save as YourStartingClass + "File" / "File.." / "OS X" / "Source" / "Swift File" / Save as * When it asks you to create a bridging Header, Agree. * Here's a starter for your Starting Class: @@ -100,15 +102,11 @@ Here's a list of the ones that I added for this project: * Set "Destinaton" to "Frameworks" * For each file missing; Click "+" and browse for the dylib needed in the SwiftLibs directory. -## Swift PrincipalClass Workaround -Swift will override the PrincipalClass item in info.plist using the class name found in -the first file compiled. You'll need to make sure that the class is always the first file -compiled. Here's how: - - * Select your plugin target - * Select "Build Phases" tab - * Click "Compile Sources" line to open it up - * If your PrincipalClass isn't the first file compiled drag it to the top line. +## Swift PrincipalClass Note +Swift will override the PrincipalClass item in info.plist without warning using the class name +found in the first file compiled if it can't find the fully namespaced classname in PrincipalClass. +You'll need to use . (i.e. "SwiftSidebar.SwiftSidebar") to maintain your +sanity. ## Debugging the Project To Setup Debugging — [Thank-you to http://ngs.io](http://ngs.io/2012/05/25/debugging-coda-plug-in-with-lldb/) diff --git a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar.xcodeproj/project.pbxproj b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar.xcodeproj/project.pbxproj index 86cf979..38acb77 100644 --- a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar.xcodeproj/project.pbxproj +++ b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar.xcodeproj/project.pbxproj @@ -228,8 +228,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2BCC56A91ACD9A20002C3E80 /* SwitftSidebar.swift in Sources */, 2BDD21E91ADB0CFA00480F72 /* SwiftSidebarView.swift in Sources */, + 2BCC56A91ACD9A20002C3E80 /* SwitftSidebar.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/Info.plist b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/Info.plist index 3687ee9..bdbdf82 100644 --- a/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/Info.plist +++ b/Cocoa Plug-ins/SwiftSidebar/SwiftSidebar/Info.plist @@ -23,7 +23,7 @@ NSHumanReadableCopyright Copyright © 2015 William J Heaton. All rights reserved. See README.md for license terms NSPrincipalClass - SwiftSidebar + SwiftSidebar.SwiftSidebar CodaPlugInSupportedAPIVersion 7 CodaAuthorString