diff --git a/pyInstaller/English.lproj/InfoPlist.strings b/pyInstaller/English.lproj/InfoPlist.strings
new file mode 100755
index 00000000..fe463ab0
Binary files /dev/null and b/pyInstaller/English.lproj/InfoPlist.strings differ
diff --git a/pyInstaller/English.lproj/MainMenu.xib b/pyInstaller/English.lproj/MainMenu.xib
new file mode 100755
index 00000000..9de354a5
--- /dev/null
+++ b/pyInstaller/English.lproj/MainMenu.xib
@@ -0,0 +1,2852 @@
+
+
+
+ 1050
+ 11B26
+ 851
+ 1138
+ 566.00
+
+
+ YES
+
+
+
+
+
+ YES
+ com.apple.QTKitIBPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+
+
+ PluginDependencyRecalculationVersion
+
+
+
+ YES
+
+ NSApplication
+
+
+ FirstResponder
+
+
+ NSApplication
+
+
+
+ 3
+ 2
+ {{335, 516}, {494, 234}}
+ 872415232
+ OpenVanilla McBopomofo
+ NSWindow
+
+
+ {1.7976931348623157e+308, 1.7976931348623157e+308}
+
+
+ 256
+ {494, 234}
+
+
+ {{0, 0}, {1440, 878}}
+ {1.7976931348623157e+308, 1.7976931348623157e+308}
+ YES
+
+
+ InstallerAppDelegate
+
+
+ NSFontManager
+
+
+
+ 290
+
+ YES
+
+ YES
+ Apple URL pasteboard type
+ CorePasteboardFlavorType 0x6D6F6F76
+ NSFilenamesPboardType
+ QTMoviePasteboardType
+
+
+ {{-1, 0}, {495, 31}}
+ _NS:46
+
+ 3
+ MAA
+
+
+
+
+
+
+
+
+ 268
+
+ YES
+
+
+ 268
+ {{17, 27}, {196, 17}}
+
+ _NS:4068
+ YES
+
+ 68288064
+ 272630784
+ Do you agree with the license?
+
+ LucidaGrande
+ 13
+ 1040
+
+ _NS:4068
+
+
+ 6
+ System
+ controlColor
+
+ 3
+ MC42NjY2NjY2NjY3AA
+
+
+
+ 6
+ System
+ controlTextColor
+
+
+
+
+
+
+ 268
+ {{226, 17}, {96, 32}}
+
+ _NS:610
+ YES
+
+ 67239424
+ 134217728
+ Cancel
+
+ _NS:610
+
+ -2038284033
+ 129
+
+ Gw
+ 200
+ 25
+
+
+
+
+ 268
+ {{322, 17}, {96, 32}}
+
+ _NS:610
+ YES
+
+ 67239424
+ 134217728
+ Agree
+
+ _NS:610
+
+ -2038284033
+ 129
+
+
+ 200
+ 25
+
+
+
+
+ 256
+
+ YES
+
+
+ 2304
+
+ YES
+
+
+ 2322
+ {375, 66}
+
+ _NS:1498
+
+
+
+
+
+
+
+
+
+ YES
+
+
+ 134
+
+
+
+ 375
+ 1
+
+
+ 100667277
+ 0
+
+
+ 3
+ MQA
+
+
+ YES
+
+ YES
+ NSBackgroundColor
+ NSColor
+
+
+ YES
+
+ 6
+ System
+ selectedTextBackgroundColor
+
+
+
+ 6
+ System
+ selectedTextColor
+
+
+
+
+
+
+ YES
+
+ YES
+ NSColor
+ NSCursor
+ NSUnderline
+
+
+ YES
+
+ 1
+ MCAwIDEAA
+
+
+ {8, -8}
+ 13
+
+
+
+
+
+
+ 0
+
+ 6
+ {463, 10000000}
+ {223, 66}
+
+
+
+ {{1, 1}, {375, 167}}
+
+
+ _NS:1496
+
+
+
+ {4, -5}
+ 1
+
+ 4
+
+
+
+ 256
+ {{376, 1}, {15, 167}}
+
+ _NS:1512
+
+ _doScroller:
+ 1
+ 0.85256409645080566
+
+
+
+ -2147483392
+ {{-100, -100}, {87, 18}}
+
+ _NS:1514
+ 1
+
+ _doScroller:
+ 1
+ 0.94565218687057495
+
+
+ {{20, 60}, {392, 169}}
+
+
+ _NS:1494
+ 133138
+
+
+
+
+
+ {432, 248}
+
+ _NS:1109
+ NSView
+
+
+
+
+ YES
+
+
+ performMiniaturize:
+
+
+
+ 37
+
+
+
+ arrangeInFront:
+
+
+
+ 39
+
+
+
+ orderFrontStandardAboutPanel:
+
+
+
+ 142
+
+
+
+ performClose:
+
+
+
+ 193
+
+
+
+ toggleContinuousSpellChecking:
+
+
+
+ 222
+
+
+
+ undo:
+
+
+
+ 223
+
+
+
+ copy:
+
+
+
+ 224
+
+
+
+ checkSpelling:
+
+
+
+ 225
+
+
+
+ paste:
+
+
+
+ 226
+
+
+
+ stopSpeaking:
+
+
+
+ 227
+
+
+
+ cut:
+
+
+
+ 228
+
+
+
+ showGuessPanel:
+
+
+
+ 230
+
+
+
+ redo:
+
+
+
+ 231
+
+
+
+ selectAll:
+
+
+
+ 232
+
+
+
+ startSpeaking:
+
+
+
+ 233
+
+
+
+ delete:
+
+
+
+ 235
+
+
+
+ performZoom:
+
+
+
+ 240
+
+
+
+ performFindPanelAction:
+
+
+
+ 241
+
+
+
+ centerSelectionInVisibleArea:
+
+
+
+ 245
+
+
+
+ toggleGrammarChecking:
+
+
+
+ 347
+
+
+
+ toggleSmartInsertDelete:
+
+
+
+ 355
+
+
+
+ toggleAutomaticQuoteSubstitution:
+
+
+
+ 356
+
+
+
+ toggleAutomaticLinkDetection:
+
+
+
+ 357
+
+
+
+ showHelp:
+
+
+
+ 360
+
+
+
+ hide:
+
+
+
+ 367
+
+
+
+ hideOtherApplications:
+
+
+
+ 368
+
+
+
+ terminate:
+
+
+
+ 369
+
+
+
+ unhideAllApplications:
+
+
+
+ 370
+
+
+
+ delegate
+
+
+
+ 374
+
+
+
+ window
+
+
+
+ 504
+
+
+
+ delegate
+
+
+
+ 505
+
+
+
+ agreeButton
+
+
+
+ 517
+
+
+
+ cancelButton
+
+
+
+ 518
+
+
+
+ licenseTextView
+
+
+
+ 519
+
+
+
+ licenseView
+
+
+
+ 520
+
+
+
+ agreeLicenseAction:
+
+
+
+ 521
+
+
+
+ disagreeLicenseAction:
+
+
+
+ 522
+
+
+
+
+ YES
+
+ 0
+
+ YES
+
+
+
+
+
+ -2
+
+
+ File's Owner
+
+
+ -1
+
+
+ First Responder
+
+
+ -3
+
+
+ Application
+
+
+ 29
+
+
+ YES
+
+
+
+
+
+
+
+ MainMenu
+
+
+ 19
+
+
+ YES
+
+
+
+
+
+ 56
+
+
+ YES
+
+
+
+
+
+ 103
+
+
+ YES
+
+
+
+ 1
+
+
+ 217
+
+
+ YES
+
+
+
+
+
+ 83
+
+
+ YES
+
+
+
+
+
+ 81
+
+
+ YES
+
+
+
+
+
+ 73
+
+
+ 1
+
+
+ 205
+
+
+ YES
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 202
+
+
+
+
+ 198
+
+
+
+
+ 207
+
+
+
+
+ 214
+
+
+
+
+ 199
+
+
+
+
+ 203
+
+
+
+
+ 197
+
+
+
+
+ 206
+
+
+
+
+ 215
+
+
+
+
+ 218
+
+
+ YES
+
+
+
+
+
+ 216
+
+
+ YES
+
+
+
+
+
+ 200
+
+
+ YES
+
+
+
+
+
+
+
+
+ 219
+
+
+
+
+ 201
+
+
+
+
+ 204
+
+
+
+
+ 220
+
+
+ YES
+
+
+
+
+
+
+
+
+
+ 213
+
+
+
+
+ 210
+
+
+
+
+ 221
+
+
+
+
+ 208
+
+
+
+
+ 209
+
+
+
+
+ 106
+
+
+ YES
+
+
+
+ 2
+
+
+ 111
+
+
+
+
+ 57
+
+
+ YES
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 58
+
+
+
+
+ 134
+
+
+
+
+ 150
+
+
+
+
+ 136
+
+
+ 1111
+
+
+ 144
+
+
+
+
+ 143
+
+
+
+
+ 131
+
+
+ YES
+
+
+
+
+
+ 149
+
+
+
+
+ 145
+
+
+
+
+ 130
+
+
+
+
+ 24
+
+
+ YES
+
+
+
+
+
+
+
+
+ 92
+
+
+
+
+ 5
+
+
+
+
+ 239
+
+
+
+
+ 23
+
+
+
+
+ 211
+
+
+ YES
+
+
+
+
+
+ 212
+
+
+ YES
+
+
+
+
+
+
+ 195
+
+
+
+
+ 196
+
+
+
+
+ 346
+
+
+
+
+ 348
+
+
+ YES
+
+
+
+
+
+ 349
+
+
+ YES
+
+
+
+
+
+
+
+ 350
+
+
+
+
+ 351
+
+
+
+
+ 354
+
+
+
+
+ 371
+
+
+ YES
+
+
+
+
+
+ 372
+
+
+ YES
+
+
+
+
+ 373
+
+
+ AppDelegate
+
+
+ 420
+
+
+
+
+ 483
+
+
+
+
+ 506
+
+
+ YES
+
+
+
+
+
+
+
+
+ 507
+
+
+ YES
+
+
+
+
+
+
+
+ 508
+
+
+
+
+ 509
+
+
+
+
+ 510
+
+
+
+
+ 511
+
+
+ YES
+
+
+
+
+
+ 512
+
+
+
+
+ 513
+
+
+ YES
+
+
+
+
+
+ 514
+
+
+
+
+ 515
+
+
+ YES
+
+
+
+
+
+ 516
+
+
+
+
+
+
+ YES
+
+ YES
+ -1.IBPluginDependency
+ -2.IBPluginDependency
+ -3.IBPluginDependency
+ 103.IBPluginDependency
+ 106.IBEditorWindowLastContentRect
+ 106.IBPluginDependency
+ 111.IBPluginDependency
+ 130.IBPluginDependency
+ 131.IBPluginDependency
+ 134.IBPluginDependency
+ 136.IBPluginDependency
+ 143.IBPluginDependency
+ 144.IBPluginDependency
+ 145.IBPluginDependency
+ 149.IBPluginDependency
+ 150.IBPluginDependency
+ 19.IBPluginDependency
+ 195.IBPluginDependency
+ 196.IBPluginDependency
+ 197.IBPluginDependency
+ 198.IBPluginDependency
+ 199.IBPluginDependency
+ 200.IBPluginDependency
+ 201.IBPluginDependency
+ 202.IBPluginDependency
+ 203.IBPluginDependency
+ 204.IBPluginDependency
+ 205.IBPluginDependency
+ 206.IBPluginDependency
+ 207.IBPluginDependency
+ 208.IBPluginDependency
+ 209.IBPluginDependency
+ 210.IBPluginDependency
+ 211.IBPluginDependency
+ 212.IBPluginDependency
+ 213.IBPluginDependency
+ 214.IBPluginDependency
+ 215.IBPluginDependency
+ 216.IBPluginDependency
+ 217.IBPluginDependency
+ 218.IBPluginDependency
+ 219.IBPluginDependency
+ 220.IBPluginDependency
+ 221.IBPluginDependency
+ 23.IBPluginDependency
+ 239.IBPluginDependency
+ 24.IBPluginDependency
+ 29.IBEditorWindowLastContentRect
+ 29.IBPluginDependency
+ 346.IBPluginDependency
+ 348.IBPluginDependency
+ 349.IBPluginDependency
+ 350.IBPluginDependency
+ 351.IBPluginDependency
+ 354.IBPluginDependency
+ 371.IBEditorWindowLastContentRect
+ 371.IBPluginDependency
+ 371.IBWindowTemplateEditedContentRect
+ 371.NSWindowTemplate.visibleAtLaunch
+ 371.windowTemplate.hasMaxSize
+ 371.windowTemplate.hasMinSize
+ 371.windowTemplate.maxSize
+ 371.windowTemplate.minSize
+ 372.IBPluginDependency
+ 373.IBPluginDependency
+ 420.IBPluginDependency
+ 483.IBPluginDependency
+ 5.IBPluginDependency
+ 506.IBEditorWindowLastContentRect
+ 506.IBPluginDependency
+ 507.IBPluginDependency
+ 507.IBViewBoundsToFrameTransform
+ 508.IBPluginDependency
+ 509.IBPluginDependency
+ 510.IBPluginDependency
+ 511.IBPluginDependency
+ 511.IBViewBoundsToFrameTransform
+ 512.IBPluginDependency
+ 513.IBPluginDependency
+ 513.IBViewBoundsToFrameTransform
+ 514.IBPluginDependency
+ 515.IBPluginDependency
+ 515.IBViewBoundsToFrameTransform
+ 516.IBPluginDependency
+ 56.IBPluginDependency
+ 57.IBEditorWindowLastContentRect
+ 57.IBPluginDependency
+ 58.IBPluginDependency
+ 73.IBPluginDependency
+ 81.IBEditorWindowLastContentRect
+ 81.IBPluginDependency
+ 83.IBPluginDependency
+ 92.IBPluginDependency
+
+
+ YES
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ {{247, 952}, {161, 23}}
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ {{0, 975}, {308, 20}}
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ {{149, 746}, {494, 234}}
+ com.apple.InterfaceBuilder.CocoaPlugin
+ {{149, 746}, {494, 234}}
+
+
+
+ {800, 800}
+ {500, 500}
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.QTKitIBPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ {{132, 590}, {432, 248}}
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+
+ P4AAAL+AAABDLAAAw0gAAA
+
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+
+ P4AAAL+AAABDoQAAwmAAAA
+
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+
+ P4AAAL+AAABDo4AAwkwAAA
+
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+
+ P4AAAL+AAABBiAAAwkwAAA
+
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ {{12, 822}, {190, 153}}
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ {{90, 952}, {115, 23}}
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+ com.apple.InterfaceBuilder.CocoaPlugin
+
+
+
+ YES
+
+
+ YES
+
+
+
+
+ YES
+
+
+ YES
+
+
+
+ 522
+
+
+
+ YES
+
+ InstallerAppDelegate
+ NSObject
+
+ YES
+
+ YES
+ agreeLicenseAction:
+ disagreeLicenseAction:
+
+
+ YES
+ id
+ id
+
+
+
+ YES
+
+ YES
+ agreeLicenseAction:
+ disagreeLicenseAction:
+
+
+ YES
+
+ agreeLicenseAction:
+ id
+
+
+ disagreeLicenseAction:
+ id
+
+
+
+
+ YES
+
+ YES
+ agreeButton
+ cancelButton
+ licenseTextView
+ licenseView
+ window
+
+
+ YES
+ id
+ id
+ id
+ id
+ id
+
+
+
+ YES
+
+ YES
+ agreeButton
+ cancelButton
+ licenseTextView
+ licenseView
+ window
+
+
+ YES
+
+ agreeButton
+ id
+
+
+ cancelButton
+ id
+
+
+ licenseTextView
+ id
+
+
+ licenseView
+ id
+
+
+ window
+ id
+
+
+
+
+ IBProjectSource
+ InstallerAppDelegate.py
+
+
+
+
+ YES
+
+ NSActionCell
+ NSCell
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSActionCell.h
+
+
+
+ NSApplication
+ NSResponder
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSApplication.h
+
+
+
+ NSApplication
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSApplicationScripting.h
+
+
+
+ NSApplication
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSColorPanel.h
+
+
+
+ NSApplication
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSHelpManager.h
+
+
+
+ NSApplication
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSPageLayout.h
+
+
+
+ NSApplication
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSUserInterfaceItemSearching.h
+
+
+
+ NSApplication
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSWindowRestoration.h
+
+
+
+ NSBrowser
+ NSControl
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSBrowser.h
+
+
+
+ NSButton
+ NSControl
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSButton.h
+
+
+
+ NSButtonCell
+ NSActionCell
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSButtonCell.h
+
+
+
+ NSCell
+ NSObject
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSCell.h
+
+
+
+ NSControl
+ NSView
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSControl.h
+
+
+
+ NSControl
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSLayoutConstraint.h
+
+
+
+ NSFontManager
+ NSObject
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSFontManager.h
+
+
+
+ NSFormatter
+ NSObject
+
+ IBFrameworkSource
+ Foundation.framework/Headers/NSFormatter.h
+
+
+
+ NSMatrix
+ NSControl
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSMatrix.h
+
+
+
+ NSMenu
+ NSObject
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSMenu.h
+
+
+
+ NSMenuItem
+ NSObject
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSMenuItem.h
+
+
+
+ NSMovieView
+ NSView
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSMovieView.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSAccessibility.h
+
+
+
+ NSObject
+
+
+
+ NSObject
+
+
+
+ NSObject
+
+
+
+ NSObject
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSDictionaryController.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSDragging.h
+
+
+
+ NSObject
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSFontPanel.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSKeyValueBinding.h
+
+
+
+ NSObject
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSNibLoading.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSPasteboard.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSSavePanel.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSTableView.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSToolbarItem.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSView.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ Foundation.framework/Headers/NSArchiver.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ Foundation.framework/Headers/NSClassDescription.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ Foundation.framework/Headers/NSError.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ Foundation.framework/Headers/NSFileManager.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ Foundation.framework/Headers/NSKeyValueCoding.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ Foundation.framework/Headers/NSKeyValueObserving.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ Foundation.framework/Headers/NSKeyedArchiver.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ Foundation.framework/Headers/NSObject.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ Foundation.framework/Headers/NSObjectScripting.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ Foundation.framework/Headers/NSPortCoder.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ Foundation.framework/Headers/NSRunLoop.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ Foundation.framework/Headers/NSScriptClassDescription.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ Foundation.framework/Headers/NSScriptKeyValueCoding.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ Foundation.framework/Headers/NSScriptObjectSpecifiers.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ Foundation.framework/Headers/NSScriptWhoseTests.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ Foundation.framework/Headers/NSThread.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ Foundation.framework/Headers/NSURL.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ QTKit.framework/Headers/QTCaptureDecompressedAudioOutput.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ QTKit.framework/Headers/QTCaptureDecompressedVideoOutput.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ QTKit.framework/Headers/QTCaptureFileOutput.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ QTKit.framework/Headers/QTCaptureVideoPreviewOutput.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ QTKit.framework/Headers/QTCaptureView.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ QTKit.framework/Headers/QTMovie.h
+
+
+
+ NSObject
+
+ IBFrameworkSource
+ QTKit.framework/Headers/QTMovieView.h
+
+
+
+ NSPopover
+ NSResponder
+
+ performClose:
+ id
+
+
+ performClose:
+
+ performClose:
+ id
+
+
+
+ YES
+
+ YES
+ contentViewController
+ delegate
+
+
+ YES
+ NSViewController
+ id
+
+
+
+ YES
+
+ YES
+ contentViewController
+ delegate
+
+
+ YES
+
+ contentViewController
+ NSViewController
+
+
+ delegate
+ id
+
+
+
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSPopover.h
+
+
+
+ NSResponder
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSInterfaceStyle.h
+
+
+
+ NSResponder
+ NSObject
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSResponder.h
+
+
+
+ NSResponder
+
+
+
+ NSScrollView
+ NSView
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSScrollView.h
+
+
+
+ NSScroller
+ NSControl
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSScroller.h
+
+
+
+ NSTableView
+ NSControl
+
+
+
+ NSText
+ NSView
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSText.h
+
+
+
+ NSTextField
+ NSControl
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSTextField.h
+
+
+
+ NSTextFieldCell
+ NSActionCell
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSTextFieldCell.h
+
+
+
+ NSTextView
+ NSText
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSTextView.h
+
+
+
+ NSView
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSClipView.h
+
+
+
+ NSView
+
+
+
+ NSView
+
+
+
+ NSView
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSOpenGLView.h
+
+
+
+ NSView
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSRulerView.h
+
+
+
+ NSView
+ NSResponder
+
+
+
+ NSViewController
+ NSResponder
+
+ view
+ NSView
+
+
+ view
+
+ view
+ NSView
+
+
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSViewController.h
+
+
+
+ NSWindow
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSDrawer.h
+
+
+
+ NSWindow
+
+
+
+ NSWindow
+ NSResponder
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSWindow.h
+
+
+
+ NSWindow
+
+
+
+ NSWindow
+
+ IBFrameworkSource
+ AppKit.framework/Headers/NSWindowScripting.h
+
+
+
+ QTMovieView
+ NSView
+
+ YES
+
+ YES
+ add:
+ addScaled:
+ copy:
+ cut:
+ delete:
+ gotoBeginning:
+ gotoEnd:
+ gotoNextSelectionPoint:
+ gotoPosterFrame:
+ gotoPreviousSelectionPoint:
+ paste:
+ pause:
+ play:
+ replace:
+ selectAll:
+ selectNone:
+ stepBackward:
+ stepForward:
+ trim:
+
+
+ YES
+ id
+ id
+ id
+ id
+ id
+ id
+ id
+ id
+ id
+ id
+ id
+ id
+ id
+ id
+ id
+ id
+ id
+ id
+ id
+
+
+
+ YES
+
+ YES
+ add:
+ addScaled:
+ copy:
+ cut:
+ delete:
+ gotoBeginning:
+ gotoEnd:
+ gotoNextSelectionPoint:
+ gotoPosterFrame:
+ gotoPreviousSelectionPoint:
+ paste:
+ pause:
+ play:
+ replace:
+ selectAll:
+ selectNone:
+ stepBackward:
+ stepForward:
+ trim:
+
+
+ YES
+
+ add:
+ id
+
+
+ addScaled:
+ id
+
+
+ copy:
+ id
+
+
+ cut:
+ id
+
+
+ delete:
+ id
+
+
+ gotoBeginning:
+ id
+
+
+ gotoEnd:
+ id
+
+
+ gotoNextSelectionPoint:
+ id
+
+
+ gotoPosterFrame:
+ id
+
+
+ gotoPreviousSelectionPoint:
+ id
+
+
+ paste:
+ id
+
+
+ pause:
+ id
+
+
+ play:
+ id
+
+
+ replace:
+ id
+
+
+ selectAll:
+ id
+
+
+ selectNone:
+ id
+
+
+ stepBackward:
+ id
+
+
+ stepForward:
+ id
+
+
+ trim:
+ id
+
+
+
+
+
+
+
+ 0
+ IBCocoaFramework
+
+ com.apple.InterfaceBuilder.CocoaPlugin.macosx
+
+
+
+ com.apple.InterfaceBuilder.CocoaPlugin.macosx
+
+
+
+ com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3
+
+
+ YES
+ ../Installer.xcodeproj
+ 3
+
+ YES
+
+ YES
+ NSMenuCheckmark
+ NSMenuMixedState
+
+
+ YES
+ {9, 8}
+ {7, 2}
+
+
+
+
diff --git a/pyInstaller/Info.plist b/pyInstaller/Info.plist
new file mode 100755
index 00000000..ccf2e95b
--- /dev/null
+++ b/pyInstaller/Info.plist
@@ -0,0 +1,30 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ English
+ CFBundleExecutable
+ ${EXECUTABLE_NAME}
+ CFBundleIconFile
+
+ CFBundleIdentifier
+ tw.com.kkbox.${PRODUCT_NAME:identifier}
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ ${PRODUCT_NAME}
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ KKBX
+ CFBundleVersion
+ 1.0
+ NSMainNibFile
+ MainMenu
+ NSPrincipalClass
+ NSApplication
+
+
diff --git a/pyInstaller/Installer.xcodeproj/project.pbxproj b/pyInstaller/Installer.xcodeproj/project.pbxproj
new file mode 100755
index 00000000..b3bf7ace
--- /dev/null
+++ b/pyInstaller/Installer.xcodeproj/project.pbxproj
@@ -0,0 +1,382 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 44;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 77631A270C06C501005415CB /* Python.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 77631A260C06C501005415CB /* Python.framework */; };
+ 77631A3F0C0748CF005415CB /* main.py in Resources */ = {isa = PBXBuildFile; fileRef = 77631A3E0C0748CF005415CB /* main.py */; };
+ 7790198F0C07548A00326F66 /* InstallerAppDelegate.py in Resources */ = {isa = PBXBuildFile; fileRef = 7790198E0C07548A00326F66 /* InstallerAppDelegate.py */; };
+ 77C8C1F90C07829500965286 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 77C8C1F70C07829500965286 /* MainMenu.xib */; };
+ 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
+ 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
+ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; };
+ D48D001D143868DA0050BDFF /* McBopomofo.app in Copy Files to Resource Folder */ = {isa = PBXBuildFile; fileRef = D48D0016143868A90050BDFF /* McBopomofo.app */; };
+ D4CA5DAD14040B3300B58ED3 /* QTKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D4CA5DAC14040B3300B58ED3 /* QTKit.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ D48D0015143868A90050BDFF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = D48D000F143868A90050BDFF /* Lettuce.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 6A8515B5137277DB0066B1BD /* McBopomofo.app */;
+ remoteInfo = Lettuce;
+ };
+ D48D0017143868A90050BDFF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = D48D000F143868A90050BDFF /* Lettuce.xcodeproj */;
+ proxyType = 2;
+ remoteGlobalIDString = 6ACF37C213A7BE68008798F2 /* IconMaker.app */;
+ remoteInfo = IconMaker;
+ };
+ D48D001E143868E40050BDFF /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = D48D000F143868A90050BDFF /* Lettuce.xcodeproj */;
+ proxyType = 1;
+ remoteGlobalIDString = 6A8515B4137277DB0066B1BD /* Lettuce */;
+ remoteInfo = Lettuce;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ D48D0025143868EC0050BDFF /* Copy Files to Resource Folder */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 7;
+ files = (
+ D48D001D143868DA0050BDFF /* McBopomofo.app in Copy Files to Resource Folder */,
+ );
+ name = "Copy Files to Resource Folder";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; };
+ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; };
+ 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; };
+ 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
+ 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; };
+ 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; };
+ 32CA4F630368D1EE00C91783 /* Installer_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Installer_Prefix.pch; sourceTree = ""; };
+ 77631A260C06C501005415CB /* Python.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Python.framework; path = /System/Library/Frameworks/Python.framework; sourceTree = ""; };
+ 77631A3E0C0748CF005415CB /* main.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = main.py; sourceTree = ""; };
+ 7790198E0C07548A00326F66 /* InstallerAppDelegate.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = InstallerAppDelegate.py; sourceTree = ""; };
+ 77C8C1F80C07829500965286 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainMenu.xib; sourceTree = ""; };
+ 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ 8D1107320486CEB800E47090 /* Installer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Installer.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ D48D000F143868A90050BDFF /* Lettuce.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Lettuce.xcodeproj; path = ../Source/Lettuce.xcodeproj; sourceTree = SOURCE_ROOT; };
+ D4CA5DAC14040B3300B58ED3 /* QTKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QTKit.framework; path = System/Library/Frameworks/QTKit.framework; sourceTree = SDKROOT; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 8D11072E0486CEB800E47090 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
+ 77631A270C06C501005415CB /* Python.framework in Frameworks */,
+ D4CA5DAD14040B3300B58ED3 /* QTKit.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 080E96DDFE201D6D7F000001 /* Classes */ = {
+ isa = PBXGroup;
+ children = (
+ 7790198E0C07548A00326F66 /* InstallerAppDelegate.py */,
+ );
+ name = Classes;
+ sourceTree = "";
+ };
+ 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ D4CA5DAC14040B3300B58ED3 /* QTKit.framework */,
+ 77631A260C06C501005415CB /* Python.framework */,
+ 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
+ );
+ name = "Linked Frameworks";
+ sourceTree = "";
+ };
+ 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 29B97324FDCFA39411CA2CEA /* AppKit.framework */,
+ 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */,
+ 29B97325FDCFA39411CA2CEA /* Foundation.framework */,
+ );
+ name = "Other Frameworks";
+ sourceTree = "";
+ };
+ 19C28FACFE9D520D11CA2CBB /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 8D1107320486CEB800E47090 /* Installer.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 29B97314FDCFA39411CA2CEA /* xcPROJECTNAMEASXMLxc */ = {
+ isa = PBXGroup;
+ children = (
+ D48D000F143868A90050BDFF /* Lettuce.xcodeproj */,
+ 080E96DDFE201D6D7F000001 /* Classes */,
+ 29B97315FDCFA39411CA2CEA /* Other Sources */,
+ 29B97317FDCFA39411CA2CEA /* Resources */,
+ 29B97323FDCFA39411CA2CEA /* Frameworks */,
+ 19C28FACFE9D520D11CA2CBB /* Products */,
+ );
+ name = xcPROJECTNAMEASXMLxc;
+ sourceTree = "";
+ };
+ 29B97315FDCFA39411CA2CEA /* Other Sources */ = {
+ isa = PBXGroup;
+ children = (
+ 32CA4F630368D1EE00C91783 /* Installer_Prefix.pch */,
+ 29B97316FDCFA39411CA2CEA /* main.m */,
+ 77631A3E0C0748CF005415CB /* main.py */,
+ );
+ name = "Other Sources";
+ sourceTree = "";
+ };
+ 29B97317FDCFA39411CA2CEA /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 77C8C1F70C07829500965286 /* MainMenu.xib */,
+ 8D1107310486CEB800E47090 /* Info.plist */,
+ 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */,
+ );
+ name = Resources;
+ sourceTree = "";
+ };
+ 29B97323FDCFA39411CA2CEA /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */,
+ 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ D48D0010143868A90050BDFF /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ D48D0016143868A90050BDFF /* McBopomofo.app */,
+ D48D0018143868A90050BDFF /* IconMaker.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 8D1107260486CEB800E47090 /* Installer */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Installer" */;
+ buildPhases = (
+ 8D1107290486CEB800E47090 /* Resources */,
+ 8D11072C0486CEB800E47090 /* Sources */,
+ 8D11072E0486CEB800E47090 /* Frameworks */,
+ D48D0025143868EC0050BDFF /* Copy Files to Resource Folder */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ D48D001F143868E40050BDFF /* PBXTargetDependency */,
+ );
+ name = Installer;
+ productInstallPath = "$(HOME)/Applications";
+ productName = xcPROJECTNAMExc;
+ productReference = 8D1107320486CEB800E47090 /* Installer.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 29B97313FDCFA39411CA2CEA /* Project object */ = {
+ isa = PBXProject;
+ buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Installer" */;
+ compatibilityVersion = "Xcode 3.0";
+ developmentRegion = English;
+ hasScannedForEncodings = 1;
+ knownRegions = (
+ English,
+ Japanese,
+ French,
+ German,
+ );
+ mainGroup = 29B97314FDCFA39411CA2CEA /* xcPROJECTNAMEASXMLxc */;
+ projectDirPath = "";
+ projectReferences = (
+ {
+ ProductGroup = D48D0010143868A90050BDFF /* Products */;
+ ProjectRef = D48D000F143868A90050BDFF /* Lettuce.xcodeproj */;
+ },
+ );
+ projectRoot = "";
+ targets = (
+ 8D1107260486CEB800E47090 /* Installer */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXReferenceProxy section */
+ D48D0016143868A90050BDFF /* McBopomofo.app */ = {
+ isa = PBXReferenceProxy;
+ fileType = wrapper.application;
+ path = McBopomofo.app;
+ remoteRef = D48D0015143868A90050BDFF /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+ D48D0018143868A90050BDFF /* IconMaker.app */ = {
+ isa = PBXReferenceProxy;
+ fileType = wrapper.application;
+ path = IconMaker.app;
+ remoteRef = D48D0017143868A90050BDFF /* PBXContainerItemProxy */;
+ sourceTree = BUILT_PRODUCTS_DIR;
+ };
+/* End PBXReferenceProxy section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 8D1107290486CEB800E47090 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */,
+ 77631A3F0C0748CF005415CB /* main.py in Resources */,
+ 7790198F0C07548A00326F66 /* InstallerAppDelegate.py in Resources */,
+ 77C8C1F90C07829500965286 /* MainMenu.xib in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 8D11072C0486CEB800E47090 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8D11072D0486CEB800E47090 /* main.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ D48D001F143868E40050BDFF /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ name = Lettuce;
+ targetProxy = D48D001E143868E40050BDFF /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 089C165DFE840E0CC02AAC07 /* English */,
+ );
+ name = InfoPlist.strings;
+ sourceTree = "";
+ };
+ 77C8C1F70C07829500965286 /* MainMenu.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 77C8C1F80C07829500965286 /* English */,
+ );
+ name = MainMenu.xib;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ C01FCF4B08A954540054247B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ COPY_PHASE_STRIP = NO;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_ENABLE_FIX_AND_CONTINUE = YES;
+ GCC_MODEL_TUNING = G5;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = Installer_Prefix.pch;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ PRODUCT_NAME = Installer;
+ WRAPPER_EXTENSION = app;
+ ZERO_LINK = YES;
+ };
+ name = Debug;
+ };
+ C01FCF4C08A954540054247B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ GCC_MODEL_TUNING = G5;
+ GCC_PRECOMPILE_PREFIX_HEADER = YES;
+ GCC_PREFIX_HEADER = Installer_Prefix.pch;
+ INFOPLIST_FILE = Info.plist;
+ INSTALL_PATH = "$(HOME)/Applications";
+ PRODUCT_NAME = Installer;
+ WRAPPER_EXTENSION = app;
+ };
+ name = Release;
+ };
+ C01FCF4F08A954540054247B /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)";
+ ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "x86_64 i386 ppc";
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ PREBINDING = NO;
+ SDKROOT = macosx;
+ };
+ name = Debug;
+ };
+ C01FCF5008A954540054247B /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)";
+ ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "x86_64 i386 ppc";
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ PREBINDING = NO;
+ SDKROOT = macosx;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "Installer" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C01FCF4B08A954540054247B /* Debug */,
+ C01FCF4C08A954540054247B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Installer" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ C01FCF4F08A954540054247B /* Debug */,
+ C01FCF5008A954540054247B /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 29B97313FDCFA39411CA2CEA /* Project object */;
+}
diff --git a/pyInstaller/InstallerAppDelegate.py b/pyInstaller/InstallerAppDelegate.py
new file mode 100755
index 00000000..5f1c150f
--- /dev/null
+++ b/pyInstaller/InstallerAppDelegate.py
@@ -0,0 +1,72 @@
+from Foundation import *
+from AppKit import *
+import os, shutil, platform
+
+class InstallerAppDelegate(NSObject):
+
+ window = objc.IBOutlet()
+ licenseView = objc.IBOutlet()
+ licenseTextView = objc.IBOutlet()
+ agreeButton = objc.IBOutlet()
+ cancelButton = objc.IBOutlet()
+
+ def checkOSVerion(self):
+ mac_version = platform.mac_ver()[0].split(".")
+ if int(mac_version[1]) < 6:
+ NSRunAlertPanel("McBoPoMoFo requires on Mac OS X 10.6 or later verion.", "", "OK", None, None)
+ NSApp.terminate_(self)
+
+ def showLicenseWindow(self):
+ self.licenseTextView.textStorage().mutableString().setString_("License")
+ windowFrame = self.window.frame()
+ windowFrame.size = self.licenseView.frame().size
+ windowFrame.size.height += 20.0
+ self.window.setFrame_display_animate_(windowFrame, True, True)
+ self.window.contentView().addSubview_(self.licenseView)
+ self.window.center()
+ self.window.setDefaultButtonCell_(self.agreeButton.cell())
+ self.window.makeKeyAndOrderFront_(None)
+
+ @objc.IBAction
+ def agreeLicenseAction_(self, sender):
+ self.window.orderOut_(None)
+ from subprocess import call
+ call(["killall", "McBopomofo"])
+
+ inputMethodDir = os.path.expanduser("~/Library/Input Methods")
+ if os.path.exists(inputMethodDir) is False:
+ os.makedirs(inputMethodDir)
+
+ packagePath = NSBundle.mainBundle().pathForResource_ofType_("McBopomofo", "app")
+ McBopomofoPath = os.path.join(inputMethodDir, "McBopomofo.app")
+ if os.path.exists(McBopomofoPath) is True:
+ try:
+ shutil.rmtree(McBopomofoPath)
+ except:
+ NSRunAlertPanel("Failed to remove existing application!", "", "OK", None, None)
+ try:
+ shutil.copytree(packagePath, McBopomofoPath)
+ except:
+ NSRunAlertPanel("Failed to copy application!", "", "OK", None, None)
+ NSApp.terminate_(self)
+
+ print McBopomofoPath
+ try:
+ call([os.path.join(McBopomofoPath, "Contents/MacOS/McBopomofo"), "install"])
+ except:
+ NSRunAlertPanel("Failed to install McBopomofo!", "", "OK", None, None)
+ NSApp.terminate_(self)
+ NSRunAlertPanel("Done!", "", "OK", None, None)
+ NSApp.terminate_(self)
+
+ @objc.IBAction
+ def disagreeLicenseAction_(self, sender):
+ NSApp.terminate_(self)
+
+ def applicationDidFinishLaunching_(self, sender):
+ self.checkOSVerion()
+ self.showLicenseWindow()
+ pass
+
+
+
diff --git a/pyInstaller/Installer_Prefix.pch b/pyInstaller/Installer_Prefix.pch
new file mode 100755
index 00000000..aabef477
--- /dev/null
+++ b/pyInstaller/Installer_Prefix.pch
@@ -0,0 +1,3 @@
+#ifdef __OBJC__
+ #import
+#endif
diff --git a/pyInstaller/main.m b/pyInstaller/main.m
new file mode 100755
index 00000000..028ee668
--- /dev/null
+++ b/pyInstaller/main.m
@@ -0,0 +1,43 @@
+// AUTHOR: Weizhong Yang (wzyang@kkbox.com.tw)
+
+#import
+#import
+
+int main(int argc, char *argv[])
+{
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+
+ NSBundle *mainBundle = [NSBundle mainBundle];
+ NSString *resourcePath = [mainBundle resourcePath];
+ NSArray *pythonPathArray = [NSArray arrayWithObjects: resourcePath, [resourcePath stringByAppendingPathComponent:@"PyObjC"], nil];
+
+ setenv("PYTHONPATH", [[pythonPathArray componentsJoinedByString:@":"] UTF8String], 1);
+
+ NSArray *possibleMainExtensions = [NSArray arrayWithObjects: @"py", @"pyc", @"pyo", nil];
+ NSString *mainFilePath = nil;
+
+ for (NSString *possibleMainExtension in possibleMainExtensions) {
+ mainFilePath = [mainBundle pathForResource: @"main" ofType: possibleMainExtension];
+ if ( mainFilePath != nil ) break;
+ }
+
+ if ( !mainFilePath ) {
+ [NSException raise: NSInternalInconsistencyException format: @"%s:%d main() Failed to find the Main.{py,pyc,pyo} file in the application wrapper's Resources directory.", __FILE__, __LINE__];
+ }
+
+ Py_SetProgramName("/usr/bin/python");
+ Py_Initialize();
+ PySys_SetArgv(argc, (char **)argv);
+
+ const char *mainFilePathPtr = [mainFilePath UTF8String];
+ FILE *mainFile = fopen(mainFilePathPtr, "r");
+ int result = PyRun_SimpleFile(mainFile, (char *)[[mainFilePath lastPathComponent] UTF8String]);
+
+ if ( result != 0 )
+ [NSException raise: NSInternalInconsistencyException
+ format: @"%s:%d main() PyRun_SimpleFile failed with file '%@'. See console for errors.", __FILE__, __LINE__, mainFilePath];
+
+ [pool drain];
+
+ return result;
+}
diff --git a/pyInstaller/main.py b/pyInstaller/main.py
new file mode 100755
index 00000000..bf89767a
--- /dev/null
+++ b/pyInstaller/main.py
@@ -0,0 +1,11 @@
+import objc
+import Foundation
+import AppKit
+
+from PyObjCTools import AppHelper
+
+# import modules containing classes required to start application and load MainMenu.nib
+import InstallerAppDelegate
+
+# pass control to AppKit
+AppHelper.runEventLoop()