├── LICENSE ├── NumberInput ├── ConversionEngine.h ├── ConversionEngine.m ├── Decimal.tiff ├── English.lproj │ ├── InfoPlist.strings │ ├── MainMenu.nib │ │ ├── classes.nib │ │ ├── info.nib │ │ └── keyedobjects.nib │ └── preferences.nib │ │ ├── classes.nib │ │ ├── info.nib │ │ └── keyedobjects.nib ├── Info.plist ├── NumberInput.xcodeproj │ ├── jh.mode1v3 │ └── project.pbxproj ├── NumberInputApplicationDelegate.h ├── NumberInputApplicationDelegate.m ├── NumberInputController.h ├── NumberInputController.m ├── NumberInput_Prefix.pch ├── ReadMe ├── currency.tiff ├── main.m ├── nine.tiff ├── nostyle.tiff ├── percent.tiff ├── preferences.plist ├── scientific.tiff └── spellout.tiff ├── NumberInput_IMKit_Sample.zip └── README.md /LICENSE: -------------------------------------------------------------------------------- 1 | Disclaimer: IMPORTANT: This Apple software is supplied to you by 2 | Apple Inc. ("Apple") in consideration of your agreement to the 3 | following terms, and your use, installation, modification or 4 | redistribution of this Apple software constitutes acceptance of these 5 | terms. If you do not agree with these terms, please do not use, 6 | install, modify or redistribute this Apple software. 7 | 8 | In consideration of your agreement to abide by the following terms, and 9 | subject to these terms, Apple grants you a personal, non-exclusive 10 | license, under Apple's copyrights in this original Apple software (the 11 | "Apple Software"), to use, reproduce, modify and redistribute the Apple 12 | Software, with or without modifications, in source and/or binary forms; 13 | provided that if you redistribute the Apple Software in its entirety and 14 | without modifications, you must retain this notice and the following 15 | text and disclaimers in all such redistributions of the Apple Software. 16 | Neither the name, trademarks, service marks or logos of Apple Inc. 17 | may be used to endorse or promote products derived from the Apple 18 | Software without specific prior written permission from Apple. Except 19 | as expressly stated in this notice, no other rights or licenses, express 20 | or implied, are granted by Apple herein, including but not limited to 21 | any patent rights that may be infringed by your derivative works or by 22 | other works in which the Apple Software may be incorporated. 23 | 24 | The Apple Software is provided by Apple on an "AS IS" basis. APPLE 25 | MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION 26 | THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS 27 | FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND 28 | OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. 29 | 30 | IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL 31 | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 32 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 33 | INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, 34 | MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED 35 | AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), 36 | STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE 37 | POSSIBILITY OF SUCH DAMAGE. 38 | 39 | Copyright (C) 2007 Apple Inc. All Rights Reserved. 40 | -------------------------------------------------------------------------------- /NumberInput/ConversionEngine.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | File:ConversionEngine.h 4 | 5 | Abstract: Class declaration for a conversion engine object. 6 | 7 | Version: 1.0 8 | 9 | Disclaimer: IMPORTANT: This Apple software is supplied to you by 10 | Apple Inc. ("Apple") in consideration of your agreement to the 11 | following terms, and your use, installation, modification or 12 | redistribution of this Apple software constitutes acceptance of these 13 | terms. If you do not agree with these terms, please do not use, 14 | install, modify or redistribute this Apple software. 15 | 16 | In consideration of your agreement to abide by the following terms, and 17 | subject to these terms, Apple grants you a personal, non-exclusive 18 | license, under Apple's copyrights in this original Apple software (the 19 | "Apple Software"), to use, reproduce, modify and redistribute the Apple 20 | Software, with or without modifications, in source and/or binary forms; 21 | provided that if you redistribute the Apple Software in its entirety and 22 | without modifications, you must retain this notice and the following 23 | text and disclaimers in all such redistributions of the Apple Software. 24 | Neither the name, trademarks, service marks or logos of Apple Inc. 25 | may be used to endorse or promote products derived from the Apple 26 | Software without specific prior written permission from Apple. Except 27 | as expressly stated in this notice, no other rights or licenses, express 28 | or implied, are granted by Apple herein, including but not limited to 29 | any patent rights that may be infringed by your derivative works or by 30 | other works in which the Apple Software may be incorporated. 31 | 32 | The Apple Software is provided by Apple on an "AS IS" basis. APPLE 33 | MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION 34 | THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS 35 | FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND 36 | OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. 37 | 38 | IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL 39 | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 40 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 41 | INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, 42 | MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED 43 | AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), 44 | STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE 45 | POSSIBILITY OF SUCH DAMAGE. 46 | 47 | Copyright (C) 2007 Apple Inc. All Rights Reserved. 48 | 49 | */ 50 | #import 51 | 52 | /*! 53 | @class 54 | @abstract Sample Conversion Engine 55 | @discussion It is not necessary to have a separate object. It is done here to demonstrate how it is possible to modularize your input method. 56 | 57 | This object uses an NSNumberFormatter to format input text. The single formatter is shared between all input sessions. 58 | The ConversionEngine also uses an NSCharacterSet that determines how the output number should be formatted. 59 | */ 60 | 61 | @interface ConversionEngine : NSObject { 62 | NSNumberFormatter* formatter; 63 | NSNumberFormatterStyle conversionMode; 64 | } 65 | 66 | /* 67 | @method 68 | @abstract Convert the input text. 69 | @discussion convert takes the input text buffer as input a returns a string that has been formatted to a given number format. 70 | */ 71 | -(NSString*)convert:(NSString*)string; 72 | 73 | /* 74 | @method 75 | @abstract Return the current conversion mode. 76 | @discussion convert takes the input text buffer as input a returns a string that has been formatted to a given number format. 77 | */ 78 | -(NSNumberFormatterStyle)conversionMode; 79 | 80 | -(void)setConversionMode:(NSNumberFormatterStyle)mode; 81 | 82 | @end 83 | -------------------------------------------------------------------------------- /NumberInput/ConversionEngine.m: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | File:ConversionEngine.m 4 | 5 | Abstract: A simple conversion engine. This converts number strings into one of the formats supported by NSNumberFormatter. 6 | 7 | Version: 1.0 8 | 9 | Disclaimer: IMPORTANT: This Apple software is supplied to you by 10 | Apple Inc. ("Apple") in consideration of your agreement to the 11 | following terms, and your use, installation, modification or 12 | redistribution of this Apple software constitutes acceptance of these 13 | terms. If you do not agree with these terms, please do not use, 14 | install, modify or redistribute this Apple software. 15 | 16 | In consideration of your agreement to abide by the following terms, and 17 | subject to these terms, Apple grants you a personal, non-exclusive 18 | license, under Apple's copyrights in this original Apple software (the 19 | "Apple Software"), to use, reproduce, modify and redistribute the Apple 20 | Software, with or without modifications, in source and/or binary forms; 21 | provided that if you redistribute the Apple Software in its entirety and 22 | without modifications, you must retain this notice and the following 23 | text and disclaimers in all such redistributions of the Apple Software. 24 | Neither the name, trademarks, service marks or logos of Apple Inc. 25 | may be used to endorse or promote products derived from the Apple 26 | Software without specific prior written permission from Apple. Except 27 | as expressly stated in this notice, no other rights or licenses, express 28 | or implied, are granted by Apple herein, including but not limited to 29 | any patent rights that may be infringed by your derivative works or by 30 | other works in which the Apple Software may be incorporated. 31 | 32 | The Apple Software is provided by Apple on an "AS IS" basis. APPLE 33 | MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION 34 | THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS 35 | FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND 36 | OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. 37 | 38 | IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL 39 | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 40 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 41 | INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, 42 | MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED 43 | AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), 44 | STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE 45 | POSSIBILITY OF SUCH DAMAGE. 46 | 47 | Copyright (C) 2007 Apple Inc. All Rights Reserved. 48 | 49 | */ 50 | #import "ConversionEngine.h" 51 | 52 | 53 | @implementation ConversionEngine 54 | 55 | -(void)awakeFromNib 56 | { 57 | [self setConversionMode:NSNumberFormatterDecimalStyle]; 58 | 59 | } 60 | 61 | -(NSString*)convert:(NSString*)string 62 | { 63 | // Allocate the formatter lazily 64 | // We want to use the 10.4 methods of NSNumberFormatter so we allocate it here and set the default behavior to the 10.4 behavior. 65 | // See comment below from documentation. 66 | 67 | /* 68 | Important: The pre-Mac OS X v10.4 methods of NSNumberFormatter are not compatible with the methods added for Mac OS X v10.4. An NSNumberFormatter object should not invoke methods in these different behavior groups indiscriminately. Use the old-style methods if you have configured the number-formatter behavior to be NSNumberFormatterBehavior10_0. Use the new methods instead of the older-style ones if you have configured the number-formatter behavior to be NSNumberFormatterBehavior10_4. 69 | Note also that number formatters created in Interface Builder use the Mac OS X v10.0 behavior—see NSNumberFormatter on Mac OS X v10.4. 70 | */ 71 | 72 | if ( formatter == nil ) { 73 | // Specify that we want the modern 10.4 behavior 74 | [NSNumberFormatter setDefaultFormatterBehavior:NSNumberFormatterBehavior10_4]; 75 | // Now allocate our formatter 76 | formatter = [[NSNumberFormatter alloc] init]; 77 | } 78 | // Convert the string into a number first 79 | // We set the conversion style each time in case it has changed. 80 | [formatter setNumberStyle:NSNumberFormatterNoStyle]; 81 | 82 | NSNumber* number = [formatter numberFromString:string]; 83 | 84 | // Now convert the number to the right format string 85 | [formatter setNumberStyle:[self conversionMode]]; 86 | return [formatter stringFromNumber:number]; 87 | } 88 | 89 | -(NSNumberFormatterStyle)conversionMode { 90 | return conversionMode; 91 | } 92 | 93 | -(void)setConversionMode:(NSNumberFormatterStyle)mode 94 | { 95 | conversionMode = mode; 96 | } 97 | 98 | @end 99 | -------------------------------------------------------------------------------- /NumberInput/Decimal.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pkamb/NumberInput_IMKit_Sample/6c37ea05d85d0b7b5af9378a0ce88e191ca07241/NumberInput/Decimal.tiff -------------------------------------------------------------------------------- /NumberInput/English.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pkamb/NumberInput_IMKit_Sample/6c37ea05d85d0b7b5af9378a0ce88e191ca07241/NumberInput/English.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /NumberInput/English.lproj/MainMenu.nib/classes.nib: -------------------------------------------------------------------------------- 1 | { 2 | IBClasses = ( 3 | { 4 | CLASS = ConversionEngine; 5 | LANGUAGE = ObjC; 6 | SUPERCLASS = NSObject; 7 | }, 8 | { 9 | CLASS = FirstResponder; 10 | LANGUAGE = ObjC; 11 | SUPERCLASS = NSObject; 12 | }, 13 | { 14 | CLASS = InputEngine; 15 | LANGUAGE = ObjC; 16 | SUPERCLASS = NSObject; 17 | }, 18 | { 19 | CLASS = NumberInputApplicationDelegate; 20 | LANGUAGE = ObjC; 21 | OUTLETS = { 22 | "_conversionEngine" = ConversionEngine; 23 | "_menu" = NSMenu; 24 | }; 25 | SUPERCLASS = NSObject; 26 | } 27 | ); 28 | IBVersion = 1; 29 | } -------------------------------------------------------------------------------- /NumberInput/English.lproj/MainMenu.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBDocumentLocation 6 | 29 406 356 240 0 0 1280 778 7 | IBEditorPositions 8 | 9 | 268 10 | 29 651 75 76 0 0 1280 778 11 | 12 | IBFramework Version 13 | 461.0 14 | IBOpenObjects 15 | 16 | 268 17 | 18 | IBSystem Version 19 | 9A439 20 | 21 | 22 | -------------------------------------------------------------------------------- /NumberInput/English.lproj/MainMenu.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pkamb/NumberInput_IMKit_Sample/6c37ea05d85d0b7b5af9378a0ce88e191ca07241/NumberInput/English.lproj/MainMenu.nib/keyedobjects.nib -------------------------------------------------------------------------------- /NumberInput/English.lproj/preferences.nib/classes.nib: -------------------------------------------------------------------------------- 1 | { 2 | IBClasses = ( 3 | { 4 | CLASS = FirstResponder; 5 | LANGUAGE = ObjC; 6 | SUPERCLASS = NSObject; 7 | } 8 | ); 9 | IBVersion = 1; 10 | } -------------------------------------------------------------------------------- /NumberInput/English.lproj/preferences.nib/info.nib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IBDocumentLocation 6 | 69 104 356 240 0 0 1280 778 7 | IBFramework Version 8 | 461.0 9 | IBOpenObjects 10 | 11 | 5 12 | 13 | IBSystem Version 14 | 9A439 15 | 16 | 17 | -------------------------------------------------------------------------------- /NumberInput/English.lproj/preferences.nib/keyedobjects.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pkamb/NumberInput_IMKit_Sample/6c37ea05d85d0b7b5af9378a0ce88e191ca07241/NumberInput/English.lproj/preferences.nib/keyedobjects.nib -------------------------------------------------------------------------------- /NumberInput/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | NumberInput 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | com.yourcompany.inputmethod.NumberInput 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | «PROJECTNAME» 17 | CFBundlePackageType 18 | APPL 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | NSMainNibFile 24 | MainMenu 25 | NSPrincipalClass 26 | NSApplication 27 | 28 | 29 | 30 | 31 | LSBackgroundOnly 32 | 1 33 | 34 | 35 | 36 | 37 | 38 | 39 | InputMethodConnectionName 40 | NumberInput_1_Connection 41 | 42 | 43 | 44 | 45 | InputMethodServerControllerClass 46 | NumberInputController 47 | 48 | 49 | 50 | tsInputMethodIconFileKey 51 | nine.tiff 52 | 53 | 54 | 55 | 56 | tsInputMethodCharacterRepertoireKey 57 | 58 | Latn 59 | 60 | 61 | 62 | 63 | ComponentInputModeDict 64 | 65 | tsInputModeListKey 66 | 67 | com.apple.inputmethod.decimal 68 | 69 | tsInputModeAlternateMenuIconFileKey 70 | Decimal.tiff 71 | tsInputModeDefaultStateKey 72 | 73 | tsInputModeIsVisibleKey 74 | 75 | tsInputModeKeyEquivalentKey 76 | D 77 | tsInputModeKeyEquivalentModifiersKey 78 | 4608 79 | tsInputModeMenuIconFileKey 80 | Decimal.tiff 81 | tsInputModePaletteIconFileKey 82 | Decimal.tiff 83 | tsInputModePrimaryInScriptKey 84 | 85 | tsInputModeScriptKey 86 | smUnicodeScript 87 | 88 | com.apple.inputmethod.currency 89 | 90 | tsInputModeAlternateMenuIconFileKey 91 | currency.tiff 92 | tsInputModeDefaultStateKey 93 | 94 | tsInputModeIsVisibleKey 95 | 96 | tsInputModeKeyEquivalentKey 97 | C 98 | tsInputModeKeyEquivalentModifiersKey 99 | 4608 100 | tsInputModeMenuIconFileKey 101 | currency.tiff 102 | tsInputModePaletteIconFileKey 103 | currency.tiff 104 | tsInputModePrimaryInScriptKey 105 | 106 | tsInputModeScriptKey 107 | smUnicodeScript 108 | 109 | com.apple.inputmethod.percent 110 | 111 | tsInputModeAlternateMenuIconFileKey 112 | percent.tiff 113 | tsInputModeDefaultStateKey 114 | 115 | tsInputModeIsVisibleKey 116 | 117 | tsInputModeKeyEquivalentKey 118 | P 119 | tsInputModeKeyEquivalentModifiersKey 120 | 4608 121 | tsInputModeMenuIconFileKey 122 | percent.tiff 123 | tsInputModePaletteIconFileKey 124 | percent.tiff 125 | tsInputModePrimaryInScriptKey 126 | 127 | tsInputModeScriptKey 128 | smUnicodeScript 129 | 130 | com.apple.inputmethod.scientific 131 | 132 | tsInputModeAlternateMenuIconFileKey 133 | scientific.tiff 134 | tsInputModeDefaultStateKey 135 | 136 | tsInputModeIsVisibleKey 137 | 138 | tsInputModeKeyEquivalentKey 139 | S 140 | tsInputModeKeyEquivalentModifiersKey 141 | 4608 142 | tsInputModeMenuIconFileKey 143 | scientific.tiff 144 | tsInputModePaletteIconFileKey 145 | scientific.tiff 146 | tsInputModePrimaryInScriptKey 147 | 148 | tsInputModeScriptKey 149 | smUnicodeScript 150 | 151 | com.apple.inputmethod.spellout 152 | 153 | tsInputModeAlternateMenuIconFileKey 154 | spellout.tiff 155 | tsInputModeDefaultStateKey 156 | 157 | tsInputModeIsVisibleKey 158 | 159 | tsInputModeKeyEquivalentKey 160 | 161 | tsInputModeKeyEquivalentModifiersKey 162 | 0 163 | tsInputModeMenuIconFileKey 164 | spellout.tiff 165 | tsInputModePaletteIconFileKey 166 | spellout.tiff 167 | tsInputModePrimaryInScriptKey 168 | 169 | tsInputModeScriptKey 170 | smUnicodeScript 171 | 172 | 173 | tsVisibleInputModeOrderedArrayKey 174 | 175 | com.apple.inputmethod.decimal 176 | com.apple.inputmethod.currency 177 | com.apple.inputmethod.percent 178 | com.apple.inputmethod.scientific 179 | com.apple.inputmethod.spellout 180 | 181 | 182 | 183 | 184 | 185 | -------------------------------------------------------------------------------- /NumberInput/NumberInput.xcodeproj/jh.mode1v3: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ActivePerspectiveName 6 | Project 7 | AllowedModules 8 | 9 | 10 | BundleLoadPath 11 | 12 | MaxInstances 13 | n 14 | Module 15 | PBXSmartGroupTreeModule 16 | Name 17 | Groups and Files Outline View 18 | 19 | 20 | BundleLoadPath 21 | 22 | MaxInstances 23 | n 24 | Module 25 | PBXNavigatorGroup 26 | Name 27 | Editor 28 | 29 | 30 | BundleLoadPath 31 | 32 | MaxInstances 33 | n 34 | Module 35 | XCTaskListModule 36 | Name 37 | Task List 38 | 39 | 40 | BundleLoadPath 41 | 42 | MaxInstances 43 | n 44 | Module 45 | XCDetailModule 46 | Name 47 | File and Smart Group Detail Viewer 48 | 49 | 50 | BundleLoadPath 51 | 52 | MaxInstances 53 | 1 54 | Module 55 | PBXBuildResultsModule 56 | Name 57 | Detailed Build Results Viewer 58 | 59 | 60 | BundleLoadPath 61 | 62 | MaxInstances 63 | 1 64 | Module 65 | PBXProjectFindModule 66 | Name 67 | Project Batch Find Tool 68 | 69 | 70 | BundleLoadPath 71 | 72 | MaxInstances 73 | n 74 | Module 75 | PBXRunSessionModule 76 | Name 77 | Run Log 78 | 79 | 80 | BundleLoadPath 81 | 82 | MaxInstances 83 | n 84 | Module 85 | PBXBookmarksModule 86 | Name 87 | Bookmarks Tool 88 | 89 | 90 | BundleLoadPath 91 | 92 | MaxInstances 93 | n 94 | Module 95 | PBXClassBrowserModule 96 | Name 97 | Class Browser 98 | 99 | 100 | BundleLoadPath 101 | 102 | MaxInstances 103 | n 104 | Module 105 | PBXCVSModule 106 | Name 107 | Source Code Control Tool 108 | 109 | 110 | BundleLoadPath 111 | 112 | MaxInstances 113 | n 114 | Module 115 | PBXDebugBreakpointsModule 116 | Name 117 | Debug Breakpoints Tool 118 | 119 | 120 | BundleLoadPath 121 | 122 | MaxInstances 123 | n 124 | Module 125 | XCDockableInspector 126 | Name 127 | Inspector 128 | 129 | 130 | BundleLoadPath 131 | 132 | MaxInstances 133 | n 134 | Module 135 | PBXOpenQuicklyModule 136 | Name 137 | Open Quickly Tool 138 | 139 | 140 | BundleLoadPath 141 | 142 | MaxInstances 143 | 1 144 | Module 145 | PBXDebugSessionModule 146 | Name 147 | Debugger 148 | 149 | 150 | BundleLoadPath 151 | 152 | MaxInstances 153 | 1 154 | Module 155 | PBXDebugCLIModule 156 | Name 157 | Debug Console 158 | 159 | 160 | BundleLoadPath 161 | 162 | MaxInstances 163 | n 164 | Module 165 | XCSnapshotModule 166 | Name 167 | Snapshots Tool 168 | 169 | 170 | Description 171 | DefaultDescriptionKey 172 | DockingSystemVisible 173 | 174 | Extension 175 | mode1v3 176 | FavBarConfig 177 | 178 | PBXProjectModuleGUID 179 | E93397130A9A11FA0073E6C4 180 | XCBarModuleItemNames 181 | 182 | XCBarModuleItems 183 | 184 | 185 | FirstTimeWindowDisplayed 186 | 187 | Identifier 188 | com.apple.perspectives.project.mode1v3 189 | MajorVersion 190 | 32 191 | MinorVersion 192 | 1 193 | Name 194 | Default 195 | Notifications 196 | 197 | OpenEditors 198 | 199 | 200 | Content 201 | 202 | PBXProjectModuleGUID 203 | E9B735E40C0CF529004A9393 204 | PBXProjectModuleLabel 205 | NSNumberFormatter.h 206 | PBXSplitModuleInNavigatorKey 207 | 208 | Split0 209 | 210 | PBXProjectModuleGUID 211 | E9B735E50C0CF529004A9393 212 | PBXProjectModuleLabel 213 | NSNumberFormatter.h 214 | _historyCapacity 215 | 0 216 | bookmark 217 | E9B735E70C0CF529004A9393 218 | history 219 | 220 | E9B735E60C0CF529004A9393 221 | 222 | 223 | SplitCount 224 | 1 225 | 226 | StatusBarVisibility 227 | 228 | 229 | Geometry 230 | 231 | Frame 232 | {{0, 20}, {750, 461}} 233 | PBXModuleWindowStatusBarHidden2 234 | 235 | RubberWindowFrame 236 | 15 271 750 502 0 0 1280 778 237 | 238 | 239 | 240 | PerspectiveWidths 241 | 242 | -1 243 | -1 244 | 245 | Perspectives 246 | 247 | 248 | ChosenToolbarItems 249 | 250 | active-target-popup 251 | active-buildstyle-popup 252 | action 253 | NSToolbarFlexibleSpaceItem 254 | buildOrClean 255 | build-and-goOrGo 256 | com.apple.ide.PBXToolbarStopButton 257 | get-info 258 | toggle-editor 259 | NSToolbarFlexibleSpaceItem 260 | com.apple.pbx.toolbar.searchfield 261 | 262 | ControllerClassBaseName 263 | 264 | IconName 265 | WindowOfProjectWithEditor 266 | Identifier 267 | perspective.project 268 | IsVertical 269 | 270 | Layout 271 | 272 | 273 | BecomeActive 274 | 275 | ContentConfiguration 276 | 277 | PBXBottomSmartGroupGIDs 278 | 279 | 1C37FBAC04509CD000000102 280 | 1C37FAAC04509CD000000102 281 | 1C08E77C0454961000C914BD 282 | 1C37FABC05509CD000000102 283 | 1C37FABC05539CD112110102 284 | E2644B35053B69B200211256 285 | 1C37FABC04509CD000100104 286 | 1CC0EA4004350EF90044410B 287 | 1CC0EA4004350EF90041110B 288 | 289 | PBXProjectModuleGUID 290 | 1CE0B1FE06471DED0097A5F4 291 | PBXProjectModuleLabel 292 | Files 293 | PBXProjectStructureProvided 294 | yes 295 | PBXSmartGroupTreeModuleColumnData 296 | 297 | PBXSmartGroupTreeModuleColumnWidthsKey 298 | 299 | 330 300 | 301 | PBXSmartGroupTreeModuleColumnsKey_v4 302 | 303 | MainColumn 304 | 305 | 306 | PBXSmartGroupTreeModuleOutlineStateKey_v7 307 | 308 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 309 | 310 | 29B97314FDCFA39411CA2CEA 311 | 080E96DDFE201D6D7F000001 312 | 29B97315FDCFA39411CA2CEA 313 | 29B97317FDCFA39411CA2CEA 314 | 29B97318FDCFA39411CA2CEA 315 | 29B97323FDCFA39411CA2CEA 316 | 1058C7A2FEA54F0111CA2CBB 317 | E93074B60A5C264700470842 318 | 1C37FBAC04509CD000000102 319 | 1C37FABC05509CD000000102 320 | 321 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 322 | 323 | 324 | 29 325 | 0 326 | 327 | 328 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 329 | {{0, 0}, {330, 567}} 330 | 331 | PBXTopSmartGroupGIDs 332 | 333 | XCIncludePerspectivesSwitch 334 | 335 | XCSharingToken 336 | com.apple.Xcode.GFSharingToken 337 | 338 | GeometryConfiguration 339 | 340 | Frame 341 | {{0, 0}, {347, 585}} 342 | GroupTreeTableConfiguration 343 | 344 | MainColumn 345 | 330 346 | 347 | RubberWindowFrame 348 | 0 152 1280 626 0 0 1280 778 349 | 350 | Module 351 | PBXSmartGroupTreeModule 352 | Proportion 353 | 347pt 354 | 355 | 356 | Dock 357 | 358 | 359 | ContentConfiguration 360 | 361 | PBXProjectModuleGUID 362 | 1CE0B20306471E060097A5F4 363 | PBXProjectModuleLabel 364 | NumberInputController.m 365 | PBXSplitModuleInNavigatorKey 366 | 367 | Split0 368 | 369 | PBXProjectModuleGUID 370 | 1CE0B20406471E060097A5F4 371 | PBXProjectModuleLabel 372 | NumberInputController.m 373 | _historyCapacity 374 | 0 375 | bookmark 376 | E9B735E10C0CF529004A9393 377 | history 378 | 379 | E93396F70A9A11FA0073E6C4 380 | E93396FB0A9A11FA0073E6C4 381 | E999E13E0BE8AEAE00CAE01B 382 | E9FB8C5E0BF8E9A200305C76 383 | E9C4259B0BFA113E0065E4C6 384 | E9D9475E0BFA2A3200DCF552 385 | E9D9475F0BFA2A3200DCF552 386 | E99A78A70BFA33C600935A00 387 | E99A78D70BFA939200935A00 388 | E99A78D90BFA939200935A00 389 | E99A78DA0BFA939200935A00 390 | E99A78DB0BFA939200935A00 391 | E99A78DC0BFA939200935A00 392 | E91514340BFB3CDD001376D1 393 | E91514360BFB3CDD001376D1 394 | E91514370BFB3CDD001376D1 395 | E9B735DE0C0CF529004A9393 396 | E9B735DF0C0CF529004A9393 397 | 398 | prevStack 399 | 400 | E93397040A9A11FA0073E6C4 401 | E93397060A9A11FA0073E6C4 402 | E933970B0A9A11FA0073E6C4 403 | E933970E0A9A11FA0073E6C4 404 | E999E1490BE8AEAE00CAE01B 405 | E9FB8BF10BF0DAE800305C76 406 | E9FB8C650BF8E9A200305C76 407 | E9FB8C6E0BF8E9A200305C76 408 | E9FB8C730BF8E9A200305C76 409 | E9C4259E0BFA113E0065E4C6 410 | E9D947660BFA2A3200DCF552 411 | E99A78E00BFA939200935A00 412 | E99A78E30BFA939200935A00 413 | E99A78E60BFA939200935A00 414 | E99A78E70BFA939200935A00 415 | E91514380BFB3CDD001376D1 416 | E91514390BFB3CDD001376D1 417 | E9B735E00C0CF529004A9393 418 | 419 | 420 | SplitCount 421 | 1 422 | 423 | StatusBarVisibility 424 | 425 | 426 | GeometryConfiguration 427 | 428 | Frame 429 | {{0, 0}, {928, 414}} 430 | RubberWindowFrame 431 | 0 152 1280 626 0 0 1280 778 432 | 433 | Module 434 | PBXNavigatorGroup 435 | Proportion 436 | 414pt 437 | 438 | 439 | ContentConfiguration 440 | 441 | PBXProjectModuleGUID 442 | 1CE0B20506471E060097A5F4 443 | PBXProjectModuleLabel 444 | Detail 445 | 446 | GeometryConfiguration 447 | 448 | Frame 449 | {{0, 419}, {928, 178}} 450 | RubberWindowFrame 451 | 0 152 1280 626 0 0 1280 778 452 | 453 | Module 454 | XCDetailModule 455 | Proportion 456 | 178pt 457 | 458 | 459 | Proportion 460 | 928pt 461 | 462 | 463 | Name 464 | Project 465 | ServiceClasses 466 | 467 | XCModuleDock 468 | PBXSmartGroupTreeModule 469 | XCModuleDock 470 | PBXNavigatorGroup 471 | XCDetailModule 472 | 473 | TableOfContents 474 | 475 | E9B735E20C0CF529004A9393 476 | 1CE0B1FE06471DED0097A5F4 477 | E9B735E30C0CF529004A9393 478 | 1CE0B20306471E060097A5F4 479 | 1CE0B20506471E060097A5F4 480 | 481 | ToolbarConfiguration 482 | xcode.toolbar.config.defaultV3 483 | 484 | 485 | ControllerClassBaseName 486 | 487 | IconName 488 | WindowOfProject 489 | Identifier 490 | perspective.morph 491 | IsVertical 492 | 0 493 | Layout 494 | 495 | 496 | BecomeActive 497 | 1 498 | ContentConfiguration 499 | 500 | PBXBottomSmartGroupGIDs 501 | 502 | 1C37FBAC04509CD000000102 503 | 1C37FAAC04509CD000000102 504 | 1C08E77C0454961000C914BD 505 | 1C37FABC05509CD000000102 506 | 1C37FABC05539CD112110102 507 | E2644B35053B69B200211256 508 | 1C37FABC04509CD000100104 509 | 1CC0EA4004350EF90044410B 510 | 1CC0EA4004350EF90041110B 511 | 512 | PBXProjectModuleGUID 513 | 11E0B1FE06471DED0097A5F4 514 | PBXProjectModuleLabel 515 | Files 516 | PBXProjectStructureProvided 517 | yes 518 | PBXSmartGroupTreeModuleColumnData 519 | 520 | PBXSmartGroupTreeModuleColumnWidthsKey 521 | 522 | 186 523 | 524 | PBXSmartGroupTreeModuleColumnsKey_v4 525 | 526 | MainColumn 527 | 528 | 529 | PBXSmartGroupTreeModuleOutlineStateKey_v7 530 | 531 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 532 | 533 | 29B97314FDCFA39411CA2CEA 534 | 1C37FABC05509CD000000102 535 | 536 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 537 | 538 | 539 | 0 540 | 541 | 542 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 543 | {{0, 0}, {186, 337}} 544 | 545 | PBXTopSmartGroupGIDs 546 | 547 | XCIncludePerspectivesSwitch 548 | 1 549 | XCSharingToken 550 | com.apple.Xcode.GFSharingToken 551 | 552 | GeometryConfiguration 553 | 554 | Frame 555 | {{0, 0}, {203, 355}} 556 | GroupTreeTableConfiguration 557 | 558 | MainColumn 559 | 186 560 | 561 | RubberWindowFrame 562 | 373 269 690 397 0 0 1440 878 563 | 564 | Module 565 | PBXSmartGroupTreeModule 566 | Proportion 567 | 100% 568 | 569 | 570 | Name 571 | Morph 572 | PreferredWidth 573 | 300 574 | ServiceClasses 575 | 576 | XCModuleDock 577 | PBXSmartGroupTreeModule 578 | 579 | TableOfContents 580 | 581 | 11E0B1FE06471DED0097A5F4 582 | 583 | ToolbarConfiguration 584 | xcode.toolbar.config.default.shortV3 585 | 586 | 587 | PerspectivesBarVisible 588 | 589 | ShelfIsVisible 590 | 591 | SourceDescription 592 | file at '/System/Library/PrivateFrameworks/DevToolsInterface.framework/Versions/A/Resources/XCPerspectivesSpecificationMode1.xcperspec' 593 | StatusbarIsVisible 594 | 595 | TimeStamp 596 | 0.0 597 | ToolbarDisplayMode 598 | 1 599 | ToolbarIsVisible 600 | 601 | ToolbarSizeMode 602 | 1 603 | Type 604 | Perspectives 605 | UpdateMessage 606 | The Default Workspace in this version of Xcode now includes support to hide and show the detail view (what has been referred to as the "Metro-Morph" feature). You must discard your current Default Workspace settings and update to the latest Default Workspace in order to gain this feature. Do you wish to update to the latest Workspace defaults for project '%@'? 607 | WindowJustification 608 | 5 609 | WindowOrderList 610 | 611 | E9B735EB0C0CF529004A9393 612 | E9B735E40C0CF529004A9393 613 | 1C530D57069F1CE1000CFCEE 614 | /Volumes/hm/sources/wwdc_2007_imkit_samples/NumberInput 4/NumberInput.xcodeproj 615 | 616 | WindowString 617 | 0 152 1280 626 0 0 1280 778 618 | WindowToolsV3 619 | 620 | 621 | FirstTimeWindowDisplayed 622 | 623 | Identifier 624 | windowTool.build 625 | IsVertical 626 | 627 | Layout 628 | 629 | 630 | Dock 631 | 632 | 633 | ContentConfiguration 634 | 635 | PBXProjectModuleGUID 636 | 1CD0528F0623707200166675 637 | PBXProjectModuleLabel 638 | 639 | StatusBarVisibility 640 | 641 | 642 | GeometryConfiguration 643 | 644 | Frame 645 | {{0, 0}, {887, 191}} 646 | RubberWindowFrame 647 | 229 213 887 473 0 0 1280 778 648 | 649 | Module 650 | PBXNavigatorGroup 651 | Proportion 652 | 191pt 653 | 654 | 655 | ContentConfiguration 656 | 657 | PBXBuildLogShowsTranscriptDefaultKey 658 | {{0, 5}, {887, 231}} 659 | PBXProjectModuleGUID 660 | XCMainBuildResultsModuleGUID 661 | PBXProjectModuleLabel 662 | Build 663 | XCBuildResultsTrigger_Collapse 664 | 1021 665 | XCBuildResultsTrigger_Open 666 | 1011 667 | 668 | GeometryConfiguration 669 | 670 | Frame 671 | {{0, 196}, {887, 236}} 672 | RubberWindowFrame 673 | 229 213 887 473 0 0 1280 778 674 | 675 | Module 676 | PBXBuildResultsModule 677 | Proportion 678 | 236pt 679 | 680 | 681 | Proportion 682 | 432pt 683 | 684 | 685 | Name 686 | Build Results 687 | ServiceClasses 688 | 689 | PBXBuildResultsModule 690 | 691 | StatusbarIsVisible 692 | 693 | TableOfContents 694 | 695 | E93397390A9A148F0073E6C4 696 | E91514280BFB3CCC001376D1 697 | 1CD0528F0623707200166675 698 | XCMainBuildResultsModuleGUID 699 | 700 | ToolbarConfiguration 701 | xcode.toolbar.config.buildV3 702 | WindowString 703 | 229 213 887 473 0 0 1280 778 704 | WindowToolGUID 705 | E93397390A9A148F0073E6C4 706 | WindowToolIsVisible 707 | 708 | 709 | 710 | FirstTimeWindowDisplayed 711 | 712 | Identifier 713 | windowTool.debugger 714 | IsVertical 715 | 716 | Layout 717 | 718 | 719 | Dock 720 | 721 | 722 | ContentConfiguration 723 | 724 | Debugger 725 | 726 | HorizontalSplitView 727 | 728 | _collapsingFrameDimension 729 | 0.0 730 | _indexOfCollapsedView 731 | 0 732 | _percentageOfCollapsedView 733 | 0.0 734 | isCollapsed 735 | yes 736 | sizes 737 | 738 | {{0, 0}, {316, 203}} 739 | {{316, 0}, {378, 203}} 740 | 741 | 742 | VerticalSplitView 743 | 744 | _collapsingFrameDimension 745 | 0.0 746 | _indexOfCollapsedView 747 | 0 748 | _percentageOfCollapsedView 749 | 0.0 750 | isCollapsed 751 | yes 752 | sizes 753 | 754 | {{0, 0}, {694, 203}} 755 | {{0, 203}, {694, 178}} 756 | 757 | 758 | 759 | LauncherConfigVersion 760 | 8 761 | PBXProjectModuleGUID 762 | 1C162984064C10D400B95A72 763 | PBXProjectModuleLabel 764 | Debug - GLUTExamples (Underwater) 765 | 766 | GeometryConfiguration 767 | 768 | DebugConsoleVisible 769 | None 770 | DebugConsoleWindowFrame 771 | {{200, 200}, {500, 300}} 772 | DebugSTDIOWindowFrame 773 | {{200, 200}, {500, 300}} 774 | Frame 775 | {{0, 0}, {694, 381}} 776 | PBXDebugSessionStackFrameViewKey 777 | 778 | DebugVariablesTableConfiguration 779 | 780 | Name 781 | 120 782 | Value 783 | 85 784 | Summary 785 | 148 786 | 787 | Frame 788 | {{316, 0}, {378, 203}} 789 | RubberWindowFrame 790 | 92 276 694 422 0 0 1280 778 791 | 792 | RubberWindowFrame 793 | 92 276 694 422 0 0 1280 778 794 | 795 | Module 796 | PBXDebugSessionModule 797 | Proportion 798 | 381pt 799 | 800 | 801 | Proportion 802 | 381pt 803 | 804 | 805 | Name 806 | Debugger 807 | ServiceClasses 808 | 809 | PBXDebugSessionModule 810 | 811 | StatusbarIsVisible 812 | 813 | TableOfContents 814 | 815 | 1CD10A99069EF8BA00B06720 816 | E91514290BFB3CCC001376D1 817 | 1C162984064C10D400B95A72 818 | E915142A0BFB3CCC001376D1 819 | E915142B0BFB3CCC001376D1 820 | E915142C0BFB3CCC001376D1 821 | E915142D0BFB3CCC001376D1 822 | E915142E0BFB3CCC001376D1 823 | 824 | ToolbarConfiguration 825 | xcode.toolbar.config.debugV3 826 | WindowString 827 | 92 276 694 422 0 0 1280 778 828 | WindowToolGUID 829 | 1CD10A99069EF8BA00B06720 830 | WindowToolIsVisible 831 | 832 | 833 | 834 | FirstTimeWindowDisplayed 835 | 836 | Identifier 837 | windowTool.find 838 | IsVertical 839 | 840 | Layout 841 | 842 | 843 | Dock 844 | 845 | 846 | Dock 847 | 848 | 849 | BecomeActive 850 | 851 | ContentConfiguration 852 | 853 | PBXProjectModuleGUID 854 | 1CDD528C0622207200134675 855 | PBXProjectModuleLabel 856 | InfoPlist.strings 857 | StatusBarVisibility 858 | 859 | 860 | GeometryConfiguration 861 | 862 | Frame 863 | {{0, 0}, {781, 212}} 864 | RubberWindowFrame 865 | 21 285 781 470 0 0 1280 778 866 | 867 | Module 868 | PBXNavigatorGroup 869 | Proportion 870 | 781pt 871 | 872 | 873 | Proportion 874 | 212pt 875 | 876 | 877 | ContentConfiguration 878 | 879 | PBXProjectModuleGUID 880 | 1CD0528E0623707200166675 881 | PBXProjectModuleLabel 882 | Project Find 883 | 884 | GeometryConfiguration 885 | 886 | Frame 887 | {{0, 217}, {781, 212}} 888 | RubberWindowFrame 889 | 21 285 781 470 0 0 1280 778 890 | 891 | Module 892 | PBXProjectFindModule 893 | Proportion 894 | 212pt 895 | 896 | 897 | Proportion 898 | 429pt 899 | 900 | 901 | Name 902 | Project Find 903 | ServiceClasses 904 | 905 | PBXProjectFindModule 906 | 907 | StatusbarIsVisible 908 | 909 | TableOfContents 910 | 911 | 1C530D57069F1CE1000CFCEE 912 | E9B735E90C0CF529004A9393 913 | E9B735EA0C0CF529004A9393 914 | 1CDD528C0622207200134675 915 | 1CD0528E0623707200166675 916 | 917 | WindowString 918 | 21 285 781 470 0 0 1280 778 919 | WindowToolGUID 920 | 1C530D57069F1CE1000CFCEE 921 | WindowToolIsVisible 922 | 923 | 924 | 925 | Identifier 926 | MENUSEPARATOR 927 | 928 | 929 | FirstTimeWindowDisplayed 930 | 931 | Identifier 932 | windowTool.debuggerConsole 933 | IsVertical 934 | 935 | Layout 936 | 937 | 938 | Dock 939 | 940 | 941 | BecomeActive 942 | 943 | ContentConfiguration 944 | 945 | PBXProjectModuleGUID 946 | 1C78EAAC065D492600B07095 947 | PBXProjectModuleLabel 948 | Debugger Console 949 | 950 | GeometryConfiguration 951 | 952 | Frame 953 | {{0, 0}, {863, 379}} 954 | RubberWindowFrame 955 | 112 403 863 420 0 0 1920 1178 956 | 957 | Module 958 | PBXDebugCLIModule 959 | Proportion 960 | 379pt 961 | 962 | 963 | Proportion 964 | 379pt 965 | 966 | 967 | Name 968 | Debugger Console 969 | ServiceClasses 970 | 971 | PBXDebugCLIModule 972 | 973 | StatusbarIsVisible 974 | 975 | TableOfContents 976 | 977 | E93397410A9A148F0073E6C4 978 | E93397420A9A148F0073E6C4 979 | 1C78EAAC065D492600B07095 980 | 981 | WindowString 982 | 112 403 863 420 0 0 1920 1178 983 | WindowToolGUID 984 | E93397410A9A148F0073E6C4 985 | WindowToolIsVisible 986 | 987 | 988 | 989 | Identifier 990 | windowTool.snapshots 991 | Layout 992 | 993 | 994 | Dock 995 | 996 | 997 | Module 998 | XCSnapshotModule 999 | Proportion 1000 | 100% 1001 | 1002 | 1003 | Proportion 1004 | 100% 1005 | 1006 | 1007 | Name 1008 | Snapshots 1009 | ServiceClasses 1010 | 1011 | XCSnapshotModule 1012 | 1013 | StatusbarIsVisible 1014 | Yes 1015 | ToolbarConfiguration 1016 | xcode.toolbar.config.snapshots 1017 | WindowString 1018 | 315 824 300 550 0 0 1440 878 1019 | WindowToolIsVisible 1020 | Yes 1021 | 1022 | 1023 | Identifier 1024 | windowTool.run 1025 | Layout 1026 | 1027 | 1028 | Dock 1029 | 1030 | 1031 | ContentConfiguration 1032 | 1033 | LauncherConfigVersion 1034 | 3 1035 | PBXProjectModuleGUID 1036 | 1CD0528B0623707200166675 1037 | PBXProjectModuleLabel 1038 | Run 1039 | Runner 1040 | 1041 | HorizontalSplitView 1042 | 1043 | _collapsingFrameDimension 1044 | 0.0 1045 | _indexOfCollapsedView 1046 | 0 1047 | _percentageOfCollapsedView 1048 | 0.0 1049 | isCollapsed 1050 | yes 1051 | sizes 1052 | 1053 | {{0, 0}, {493, 167}} 1054 | {{0, 176}, {493, 267}} 1055 | 1056 | 1057 | VerticalSplitView 1058 | 1059 | _collapsingFrameDimension 1060 | 0.0 1061 | _indexOfCollapsedView 1062 | 0 1063 | _percentageOfCollapsedView 1064 | 0.0 1065 | isCollapsed 1066 | yes 1067 | sizes 1068 | 1069 | {{0, 0}, {405, 443}} 1070 | {{414, 0}, {514, 443}} 1071 | 1072 | 1073 | 1074 | 1075 | GeometryConfiguration 1076 | 1077 | Frame 1078 | {{0, 0}, {460, 159}} 1079 | RubberWindowFrame 1080 | 316 696 459 200 0 0 1280 1002 1081 | 1082 | Module 1083 | PBXRunSessionModule 1084 | Proportion 1085 | 159pt 1086 | 1087 | 1088 | Proportion 1089 | 159pt 1090 | 1091 | 1092 | Name 1093 | Run Log 1094 | ServiceClasses 1095 | 1096 | PBXRunSessionModule 1097 | 1098 | StatusbarIsVisible 1099 | 1 1100 | TableOfContents 1101 | 1102 | 1C0AD2B3069F1EA900FABCE6 1103 | 1C0AD2B4069F1EA900FABCE6 1104 | 1CD0528B0623707200166675 1105 | 1C0AD2B5069F1EA900FABCE6 1106 | 1107 | ToolbarConfiguration 1108 | xcode.toolbar.config.run 1109 | WindowString 1110 | 316 696 459 200 0 0 1280 1002 1111 | WindowToolGUID 1112 | 1C0AD2B3069F1EA900FABCE6 1113 | WindowToolIsVisible 1114 | 0 1115 | 1116 | 1117 | Identifier 1118 | windowTool.scm 1119 | Layout 1120 | 1121 | 1122 | Dock 1123 | 1124 | 1125 | ContentConfiguration 1126 | 1127 | PBXProjectModuleGUID 1128 | 1C78EAB2065D492600B07095 1129 | PBXProjectModuleLabel 1130 | <No Editor> 1131 | PBXSplitModuleInNavigatorKey 1132 | 1133 | Split0 1134 | 1135 | PBXProjectModuleGUID 1136 | 1C78EAB3065D492600B07095 1137 | 1138 | SplitCount 1139 | 1 1140 | 1141 | StatusBarVisibility 1142 | 1 1143 | 1144 | GeometryConfiguration 1145 | 1146 | Frame 1147 | {{0, 0}, {452, 0}} 1148 | RubberWindowFrame 1149 | 743 379 452 308 0 0 1280 1002 1150 | 1151 | Module 1152 | PBXNavigatorGroup 1153 | Proportion 1154 | 0pt 1155 | 1156 | 1157 | BecomeActive 1158 | 1 1159 | ContentConfiguration 1160 | 1161 | PBXProjectModuleGUID 1162 | 1CD052920623707200166675 1163 | PBXProjectModuleLabel 1164 | SCM 1165 | 1166 | GeometryConfiguration 1167 | 1168 | ConsoleFrame 1169 | {{0, 259}, {452, 0}} 1170 | Frame 1171 | {{0, 7}, {452, 259}} 1172 | RubberWindowFrame 1173 | 743 379 452 308 0 0 1280 1002 1174 | TableConfiguration 1175 | 1176 | Status 1177 | 30 1178 | FileName 1179 | 199 1180 | Path 1181 | 197.09500122070312 1182 | 1183 | TableFrame 1184 | {{0, 0}, {452, 250}} 1185 | 1186 | Module 1187 | PBXCVSModule 1188 | Proportion 1189 | 262pt 1190 | 1191 | 1192 | Proportion 1193 | 266pt 1194 | 1195 | 1196 | Name 1197 | SCM 1198 | ServiceClasses 1199 | 1200 | PBXCVSModule 1201 | 1202 | StatusbarIsVisible 1203 | 1 1204 | TableOfContents 1205 | 1206 | 1C78EAB4065D492600B07095 1207 | 1C78EAB5065D492600B07095 1208 | 1C78EAB2065D492600B07095 1209 | 1CD052920623707200166675 1210 | 1211 | ToolbarConfiguration 1212 | xcode.toolbar.config.scm 1213 | WindowString 1214 | 743 379 452 308 0 0 1280 1002 1215 | 1216 | 1217 | Identifier 1218 | windowTool.breakpoints 1219 | IsVertical 1220 | 0 1221 | Layout 1222 | 1223 | 1224 | Dock 1225 | 1226 | 1227 | BecomeActive 1228 | 1 1229 | ContentConfiguration 1230 | 1231 | PBXBottomSmartGroupGIDs 1232 | 1233 | 1C77FABC04509CD000000102 1234 | 1235 | PBXProjectModuleGUID 1236 | 1CE0B1FE06471DED0097A5F4 1237 | PBXProjectModuleLabel 1238 | Files 1239 | PBXProjectStructureProvided 1240 | no 1241 | PBXSmartGroupTreeModuleColumnData 1242 | 1243 | PBXSmartGroupTreeModuleColumnWidthsKey 1244 | 1245 | 168 1246 | 1247 | PBXSmartGroupTreeModuleColumnsKey_v4 1248 | 1249 | MainColumn 1250 | 1251 | 1252 | PBXSmartGroupTreeModuleOutlineStateKey_v7 1253 | 1254 | PBXSmartGroupTreeModuleOutlineStateExpansionKey 1255 | 1256 | 1C77FABC04509CD000000102 1257 | 1258 | PBXSmartGroupTreeModuleOutlineStateSelectionKey 1259 | 1260 | 1261 | 0 1262 | 1263 | 1264 | PBXSmartGroupTreeModuleOutlineStateVisibleRectKey 1265 | {{0, 0}, {168, 350}} 1266 | 1267 | PBXTopSmartGroupGIDs 1268 | 1269 | XCIncludePerspectivesSwitch 1270 | 0 1271 | 1272 | GeometryConfiguration 1273 | 1274 | Frame 1275 | {{0, 0}, {185, 368}} 1276 | GroupTreeTableConfiguration 1277 | 1278 | MainColumn 1279 | 168 1280 | 1281 | RubberWindowFrame 1282 | 315 424 744 409 0 0 1440 878 1283 | 1284 | Module 1285 | PBXSmartGroupTreeModule 1286 | Proportion 1287 | 185pt 1288 | 1289 | 1290 | ContentConfiguration 1291 | 1292 | PBXProjectModuleGUID 1293 | 1CA1AED706398EBD00589147 1294 | PBXProjectModuleLabel 1295 | Detail 1296 | 1297 | GeometryConfiguration 1298 | 1299 | Frame 1300 | {{190, 0}, {554, 368}} 1301 | RubberWindowFrame 1302 | 315 424 744 409 0 0 1440 878 1303 | 1304 | Module 1305 | XCDetailModule 1306 | Proportion 1307 | 554pt 1308 | 1309 | 1310 | Proportion 1311 | 368pt 1312 | 1313 | 1314 | MajorVersion 1315 | 3 1316 | MinorVersion 1317 | 0 1318 | Name 1319 | Breakpoints 1320 | ServiceClasses 1321 | 1322 | PBXSmartGroupTreeModule 1323 | XCDetailModule 1324 | 1325 | StatusbarIsVisible 1326 | 1 1327 | TableOfContents 1328 | 1329 | 1CDDB66807F98D9800BB5817 1330 | 1CDDB66907F98D9800BB5817 1331 | 1CE0B1FE06471DED0097A5F4 1332 | 1CA1AED706398EBD00589147 1333 | 1334 | ToolbarConfiguration 1335 | xcode.toolbar.config.breakpointsV3 1336 | WindowString 1337 | 315 424 744 409 0 0 1440 878 1338 | WindowToolGUID 1339 | 1CDDB66807F98D9800BB5817 1340 | WindowToolIsVisible 1341 | 1 1342 | 1343 | 1344 | Identifier 1345 | windowTool.debugAnimator 1346 | Layout 1347 | 1348 | 1349 | Dock 1350 | 1351 | 1352 | Module 1353 | PBXNavigatorGroup 1354 | Proportion 1355 | 100% 1356 | 1357 | 1358 | Proportion 1359 | 100% 1360 | 1361 | 1362 | Name 1363 | Debug Visualizer 1364 | ServiceClasses 1365 | 1366 | PBXNavigatorGroup 1367 | 1368 | StatusbarIsVisible 1369 | 1 1370 | ToolbarConfiguration 1371 | xcode.toolbar.config.debugAnimatorV3 1372 | WindowString 1373 | 100 100 700 500 0 0 1280 1002 1374 | 1375 | 1376 | Identifier 1377 | windowTool.bookmarks 1378 | Layout 1379 | 1380 | 1381 | Dock 1382 | 1383 | 1384 | Module 1385 | PBXBookmarksModule 1386 | Proportion 1387 | 100% 1388 | 1389 | 1390 | Proportion 1391 | 100% 1392 | 1393 | 1394 | Name 1395 | Bookmarks 1396 | ServiceClasses 1397 | 1398 | PBXBookmarksModule 1399 | 1400 | StatusbarIsVisible 1401 | 0 1402 | WindowString 1403 | 538 42 401 187 0 0 1280 1002 1404 | 1405 | 1406 | Identifier 1407 | windowTool.classBrowser 1408 | Layout 1409 | 1410 | 1411 | Dock 1412 | 1413 | 1414 | BecomeActive 1415 | 1 1416 | ContentConfiguration 1417 | 1418 | OptionsSetName 1419 | Hierarchy, all classes 1420 | PBXProjectModuleGUID 1421 | 1CA6456E063B45B4001379D8 1422 | PBXProjectModuleLabel 1423 | Class Browser - NSObject 1424 | 1425 | GeometryConfiguration 1426 | 1427 | ClassesFrame 1428 | {{0, 0}, {374, 96}} 1429 | ClassesTreeTableConfiguration 1430 | 1431 | PBXClassNameColumnIdentifier 1432 | 208 1433 | PBXClassBookColumnIdentifier 1434 | 22 1435 | 1436 | Frame 1437 | {{0, 0}, {630, 331}} 1438 | MembersFrame 1439 | {{0, 105}, {374, 395}} 1440 | MembersTreeTableConfiguration 1441 | 1442 | PBXMemberTypeIconColumnIdentifier 1443 | 22 1444 | PBXMemberNameColumnIdentifier 1445 | 216 1446 | PBXMemberTypeColumnIdentifier 1447 | 97 1448 | PBXMemberBookColumnIdentifier 1449 | 22 1450 | 1451 | PBXModuleWindowStatusBarHidden2 1452 | 1 1453 | RubberWindowFrame 1454 | 385 179 630 352 0 0 1440 878 1455 | 1456 | Module 1457 | PBXClassBrowserModule 1458 | Proportion 1459 | 332pt 1460 | 1461 | 1462 | Proportion 1463 | 332pt 1464 | 1465 | 1466 | Name 1467 | Class Browser 1468 | ServiceClasses 1469 | 1470 | PBXClassBrowserModule 1471 | 1472 | StatusbarIsVisible 1473 | 0 1474 | TableOfContents 1475 | 1476 | 1C0AD2AF069F1E9B00FABCE6 1477 | 1C0AD2B0069F1E9B00FABCE6 1478 | 1CA6456E063B45B4001379D8 1479 | 1480 | ToolbarConfiguration 1481 | xcode.toolbar.config.classbrowser 1482 | WindowString 1483 | 385 179 630 352 0 0 1440 878 1484 | WindowToolGUID 1485 | 1C0AD2AF069F1E9B00FABCE6 1486 | WindowToolIsVisible 1487 | 0 1488 | 1489 | 1490 | Identifier 1491 | windowTool.refactoring 1492 | IncludeInToolsMenu 1493 | 0 1494 | Layout 1495 | 1496 | 1497 | Dock 1498 | 1499 | 1500 | BecomeActive 1501 | 1 1502 | GeometryConfiguration 1503 | 1504 | Frame 1505 | {0, 0}, {500, 335} 1506 | RubberWindowFrame 1507 | {0, 0}, {500, 335} 1508 | 1509 | Module 1510 | XCRefactoringModule 1511 | Proportion 1512 | 100% 1513 | 1514 | 1515 | Proportion 1516 | 100% 1517 | 1518 | 1519 | Name 1520 | Refactoring 1521 | ServiceClasses 1522 | 1523 | XCRefactoringModule 1524 | 1525 | WindowString 1526 | 200 200 500 356 0 0 1920 1200 1527 | 1528 | 1529 | 1530 | 1531 | -------------------------------------------------------------------------------- /NumberInput/NumberInput.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 42; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; }; 11 | 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 12 | 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 13 | 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 14 | E93074B70A5C264700470842 /* InputMethodKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E93074B60A5C264700470842 /* InputMethodKit.framework */; }; 15 | E93074E20A5C2F1200470842 /* NumberInputController.m in Sources */ = {isa = PBXBuildFile; fileRef = E93074E10A5C2F1200470842 /* NumberInputController.m */; }; 16 | E93396E90A9A0AD60073E6C4 /* nine.tiff in Resources */ = {isa = PBXBuildFile; fileRef = E93396E50A9A0AD50073E6C4 /* nine.tiff */; }; 17 | E93396F50A9A105E0073E6C4 /* ConversionEngine.m in Sources */ = {isa = PBXBuildFile; fileRef = E93396F40A9A105E0073E6C4 /* ConversionEngine.m */; }; 18 | E999E1590BE8D77E00CAE01B /* ReadMe in Resources */ = {isa = PBXBuildFile; fileRef = E999E1580BE8D77E00CAE01B /* ReadMe */; }; 19 | E99A791E0BFA9CBF00935A00 /* preferences.nib in Resources */ = {isa = PBXBuildFile; fileRef = E99A791C0BFA9CBF00935A00 /* preferences.nib */; }; 20 | E99A79200BFAA07E00935A00 /* preferences.plist in Resources */ = {isa = PBXBuildFile; fileRef = E99A791F0BFAA07E00935A00 /* preferences.plist */; }; 21 | E9C425850BFA0FC90065E4C6 /* currency.tiff in Resources */ = {isa = PBXBuildFile; fileRef = E9C425830BFA0FC90065E4C6 /* currency.tiff */; }; 22 | E9C425860BFA0FC90065E4C6 /* Decimal.tiff in Resources */ = {isa = PBXBuildFile; fileRef = E9C425840BFA0FC90065E4C6 /* Decimal.tiff */; }; 23 | E9C4258A0BFA0FD60065E4C6 /* nostyle.tiff in Resources */ = {isa = PBXBuildFile; fileRef = E9C425890BFA0FD60065E4C6 /* nostyle.tiff */; }; 24 | E9C4258E0BFA0FE70065E4C6 /* percent.tiff in Resources */ = {isa = PBXBuildFile; fileRef = E9C4258D0BFA0FE70065E4C6 /* percent.tiff */; }; 25 | E9C425930BFA10060065E4C6 /* scientific.tiff in Resources */ = {isa = PBXBuildFile; fileRef = E9C425910BFA10060065E4C6 /* scientific.tiff */; }; 26 | E9C425940BFA10060065E4C6 /* spellout.tiff in Resources */ = {isa = PBXBuildFile; fileRef = E9C425920BFA10060065E4C6 /* spellout.tiff */; }; 27 | E9FB8BCB0BF0D79B00305C76 /* NumberInputApplicationDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = E9FB8BCA0BF0D79B00305C76 /* NumberInputApplicationDelegate.m */; }; 28 | /* End PBXBuildFile section */ 29 | 30 | /* Begin PBXFileReference section */ 31 | 089C165DFE840E0CC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 32 | 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 33 | 29B97316FDCFA39411CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 34 | 29B97319FDCFA39411CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = ""; }; 35 | 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 36 | 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 37 | 32CA4F630368D1EE00C91783 /* NumberInput_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NumberInput_Prefix.pch; sourceTree = ""; }; 38 | 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 39 | 8D1107320486CEB800E47090 /* NumberInput.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = NumberInput.app; sourceTree = BUILT_PRODUCTS_DIR; }; 40 | E93074B60A5C264700470842 /* InputMethodKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = InputMethodKit.framework; path = /System/Library/Frameworks/InputMethodKit.framework; sourceTree = ""; }; 41 | E93074E00A5C2F1200470842 /* NumberInputController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NumberInputController.h; sourceTree = ""; }; 42 | E93074E10A5C2F1200470842 /* NumberInputController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NumberInputController.m; sourceTree = ""; }; 43 | E93396E50A9A0AD50073E6C4 /* nine.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = nine.tiff; sourceTree = ""; }; 44 | E93396F30A9A105E0073E6C4 /* ConversionEngine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConversionEngine.h; sourceTree = ""; }; 45 | E93396F40A9A105E0073E6C4 /* ConversionEngine.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ConversionEngine.m; sourceTree = ""; }; 46 | E999E1580BE8D77E00CAE01B /* ReadMe */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ReadMe; sourceTree = ""; }; 47 | E99A791D0BFA9CBF00935A00 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/preferences.nib; sourceTree = ""; }; 48 | E99A791F0BFAA07E00935A00 /* preferences.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = preferences.plist; sourceTree = ""; }; 49 | E9C425830BFA0FC90065E4C6 /* currency.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = currency.tiff; sourceTree = ""; }; 50 | E9C425840BFA0FC90065E4C6 /* Decimal.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = Decimal.tiff; sourceTree = ""; }; 51 | E9C425890BFA0FD60065E4C6 /* nostyle.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = nostyle.tiff; sourceTree = ""; }; 52 | E9C4258D0BFA0FE70065E4C6 /* percent.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = percent.tiff; sourceTree = ""; }; 53 | E9C425910BFA10060065E4C6 /* scientific.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = scientific.tiff; sourceTree = ""; }; 54 | E9C425920BFA10060065E4C6 /* spellout.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = spellout.tiff; sourceTree = ""; }; 55 | E9FB8BC90BF0D79B00305C76 /* NumberInputApplicationDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NumberInputApplicationDelegate.h; sourceTree = ""; }; 56 | E9FB8BCA0BF0D79B00305C76 /* NumberInputApplicationDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NumberInputApplicationDelegate.m; sourceTree = ""; }; 57 | E9FB8C530BF4A77900305C76 /* InputMethodKeysDictionary.dict */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = InputMethodKeysDictionary.dict; sourceTree = ""; }; 58 | /* End PBXFileReference section */ 59 | 60 | /* Begin PBXFrameworksBuildPhase section */ 61 | 8D11072E0486CEB800E47090 /* Frameworks */ = { 62 | isa = PBXFrameworksBuildPhase; 63 | buildActionMask = 2147483647; 64 | files = ( 65 | 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, 66 | E93074B70A5C264700470842 /* InputMethodKit.framework in Frameworks */, 67 | ); 68 | runOnlyForDeploymentPostprocessing = 0; 69 | }; 70 | /* End PBXFrameworksBuildPhase section */ 71 | 72 | /* Begin PBXGroup section */ 73 | 080E96DDFE201D6D7F000001 /* Classes */ = { 74 | isa = PBXGroup; 75 | children = ( 76 | E93074E00A5C2F1200470842 /* NumberInputController.h */, 77 | E93074E10A5C2F1200470842 /* NumberInputController.m */, 78 | E93396F30A9A105E0073E6C4 /* ConversionEngine.h */, 79 | E93396F40A9A105E0073E6C4 /* ConversionEngine.m */, 80 | E9FB8BC90BF0D79B00305C76 /* NumberInputApplicationDelegate.h */, 81 | E9FB8BCA0BF0D79B00305C76 /* NumberInputApplicationDelegate.m */, 82 | ); 83 | name = Classes; 84 | sourceTree = ""; 85 | }; 86 | 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, 90 | ); 91 | name = "Linked Frameworks"; 92 | sourceTree = ""; 93 | }; 94 | 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | E93074B60A5C264700470842 /* InputMethodKit.framework */, 98 | 29B97324FDCFA39411CA2CEA /* AppKit.framework */, 99 | 29B97325FDCFA39411CA2CEA /* Foundation.framework */, 100 | ); 101 | name = "Other Frameworks"; 102 | sourceTree = ""; 103 | }; 104 | 19C28FACFE9D520D11CA2CBB /* Products */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | 8D1107320486CEB800E47090 /* NumberInput.app */, 108 | ); 109 | name = Products; 110 | sourceTree = ""; 111 | }; 112 | 29B97314FDCFA39411CA2CEA /* NumberInput */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | 080E96DDFE201D6D7F000001 /* Classes */, 116 | 29B97315FDCFA39411CA2CEA /* Other Sources */, 117 | 29B97317FDCFA39411CA2CEA /* Resources */, 118 | 29B97323FDCFA39411CA2CEA /* Frameworks */, 119 | 19C28FACFE9D520D11CA2CBB /* Products */, 120 | E999E1580BE8D77E00CAE01B /* ReadMe */, 121 | ); 122 | name = NumberInput; 123 | sourceTree = ""; 124 | }; 125 | 29B97315FDCFA39411CA2CEA /* Other Sources */ = { 126 | isa = PBXGroup; 127 | children = ( 128 | 32CA4F630368D1EE00C91783 /* NumberInput_Prefix.pch */, 129 | 29B97316FDCFA39411CA2CEA /* main.m */, 130 | ); 131 | name = "Other Sources"; 132 | sourceTree = ""; 133 | }; 134 | 29B97317FDCFA39411CA2CEA /* Resources */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | E93396E20A9A0AAD0073E6C4 /* images */, 138 | 8D1107310486CEB800E47090 /* Info.plist */, 139 | 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, 140 | 29B97318FDCFA39411CA2CEA /* MainMenu.nib */, 141 | E9FB8C530BF4A77900305C76 /* InputMethodKeysDictionary.dict */, 142 | E99A791C0BFA9CBF00935A00 /* preferences.nib */, 143 | E99A791F0BFAA07E00935A00 /* preferences.plist */, 144 | ); 145 | name = Resources; 146 | sourceTree = ""; 147 | }; 148 | 29B97323FDCFA39411CA2CEA /* Frameworks */ = { 149 | isa = PBXGroup; 150 | children = ( 151 | 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 152 | 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, 153 | ); 154 | name = Frameworks; 155 | sourceTree = ""; 156 | }; 157 | E93396E20A9A0AAD0073E6C4 /* images */ = { 158 | isa = PBXGroup; 159 | children = ( 160 | E9C425910BFA10060065E4C6 /* scientific.tiff */, 161 | E9C425920BFA10060065E4C6 /* spellout.tiff */, 162 | E9C4258D0BFA0FE70065E4C6 /* percent.tiff */, 163 | E9C425890BFA0FD60065E4C6 /* nostyle.tiff */, 164 | E9C425830BFA0FC90065E4C6 /* currency.tiff */, 165 | E9C425840BFA0FC90065E4C6 /* Decimal.tiff */, 166 | E93396E50A9A0AD50073E6C4 /* nine.tiff */, 167 | ); 168 | name = images; 169 | sourceTree = ""; 170 | }; 171 | /* End PBXGroup section */ 172 | 173 | /* Begin PBXNativeTarget section */ 174 | 8D1107260486CEB800E47090 /* NumberInput */ = { 175 | isa = PBXNativeTarget; 176 | buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "NumberInput" */; 177 | buildPhases = ( 178 | 8D1107290486CEB800E47090 /* Resources */, 179 | 8D11072C0486CEB800E47090 /* Sources */, 180 | 8D11072E0486CEB800E47090 /* Frameworks */, 181 | ); 182 | buildRules = ( 183 | ); 184 | dependencies = ( 185 | ); 186 | name = NumberInput; 187 | productInstallPath = "$(HOME)/Applications"; 188 | productName = NumberInput; 189 | productReference = 8D1107320486CEB800E47090 /* NumberInput.app */; 190 | productType = "com.apple.product-type.application"; 191 | }; 192 | /* End PBXNativeTarget section */ 193 | 194 | /* Begin PBXProject section */ 195 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 196 | isa = PBXProject; 197 | buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "NumberInput" */; 198 | compatibilityVersion = "Xcode 2.4"; 199 | hasScannedForEncodings = 1; 200 | mainGroup = 29B97314FDCFA39411CA2CEA /* NumberInput */; 201 | projectDirPath = ""; 202 | projectRoot = ""; 203 | shouldCheckCompatibility = 1; 204 | targets = ( 205 | 8D1107260486CEB800E47090 /* NumberInput */, 206 | ); 207 | }; 208 | /* End PBXProject section */ 209 | 210 | /* Begin PBXResourcesBuildPhase section */ 211 | 8D1107290486CEB800E47090 /* Resources */ = { 212 | isa = PBXResourcesBuildPhase; 213 | buildActionMask = 2147483647; 214 | files = ( 215 | 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */, 216 | 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, 217 | E93396E90A9A0AD60073E6C4 /* nine.tiff in Resources */, 218 | E999E1590BE8D77E00CAE01B /* ReadMe in Resources */, 219 | E9C425850BFA0FC90065E4C6 /* currency.tiff in Resources */, 220 | E9C425860BFA0FC90065E4C6 /* Decimal.tiff in Resources */, 221 | E9C4258A0BFA0FD60065E4C6 /* nostyle.tiff in Resources */, 222 | E9C4258E0BFA0FE70065E4C6 /* percent.tiff in Resources */, 223 | E9C425930BFA10060065E4C6 /* scientific.tiff in Resources */, 224 | E9C425940BFA10060065E4C6 /* spellout.tiff in Resources */, 225 | E99A791E0BFA9CBF00935A00 /* preferences.nib in Resources */, 226 | E99A79200BFAA07E00935A00 /* preferences.plist in Resources */, 227 | ); 228 | runOnlyForDeploymentPostprocessing = 0; 229 | }; 230 | /* End PBXResourcesBuildPhase section */ 231 | 232 | /* Begin PBXSourcesBuildPhase section */ 233 | 8D11072C0486CEB800E47090 /* Sources */ = { 234 | isa = PBXSourcesBuildPhase; 235 | buildActionMask = 2147483647; 236 | files = ( 237 | 8D11072D0486CEB800E47090 /* main.m in Sources */, 238 | E93074E20A5C2F1200470842 /* NumberInputController.m in Sources */, 239 | E93396F50A9A105E0073E6C4 /* ConversionEngine.m in Sources */, 240 | E9FB8BCB0BF0D79B00305C76 /* NumberInputApplicationDelegate.m in Sources */, 241 | ); 242 | runOnlyForDeploymentPostprocessing = 0; 243 | }; 244 | /* End PBXSourcesBuildPhase section */ 245 | 246 | /* Begin PBXVariantGroup section */ 247 | 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */ = { 248 | isa = PBXVariantGroup; 249 | children = ( 250 | 089C165DFE840E0CC02AAC07 /* English */, 251 | ); 252 | name = InfoPlist.strings; 253 | sourceTree = ""; 254 | }; 255 | 29B97318FDCFA39411CA2CEA /* MainMenu.nib */ = { 256 | isa = PBXVariantGroup; 257 | children = ( 258 | 29B97319FDCFA39411CA2CEA /* English */, 259 | ); 260 | name = MainMenu.nib; 261 | sourceTree = ""; 262 | }; 263 | E99A791C0BFA9CBF00935A00 /* preferences.nib */ = { 264 | isa = PBXVariantGroup; 265 | children = ( 266 | E99A791D0BFA9CBF00935A00 /* English */, 267 | ); 268 | name = preferences.nib; 269 | sourceTree = ""; 270 | }; 271 | /* End PBXVariantGroup section */ 272 | 273 | /* Begin XCBuildConfiguration section */ 274 | C01FCF4B08A954540054247B /* Debug */ = { 275 | isa = XCBuildConfiguration; 276 | buildSettings = { 277 | COPY_PHASE_STRIP = NO; 278 | GCC_DYNAMIC_NO_PIC = NO; 279 | GCC_ENABLE_FIX_AND_CONTINUE = YES; 280 | GCC_MODEL_TUNING = G5; 281 | GCC_OPTIMIZATION_LEVEL = 0; 282 | INFOPLIST_FILE = Info.plist; 283 | INSTALL_PATH = "\"$(LOCAL_LIBRARY_DIR)/Input Methods/\""; 284 | PRODUCT_NAME = NumberInput; 285 | WRAPPER_EXTENSION = app; 286 | ZERO_LINK = YES; 287 | }; 288 | name = Debug; 289 | }; 290 | C01FCF4C08A954540054247B /* Release */ = { 291 | isa = XCBuildConfiguration; 292 | buildSettings = { 293 | ARCHS = ( 294 | ppc, 295 | i386, 296 | ); 297 | GCC_GENERATE_DEBUGGING_SYMBOLS = NO; 298 | GCC_MODEL_TUNING = G5; 299 | INFOPLIST_FILE = Info.plist; 300 | INSTALL_PATH = "$(HOME)/Applications"; 301 | PRODUCT_NAME = NumberInput; 302 | WRAPPER_EXTENSION = app; 303 | }; 304 | name = Release; 305 | }; 306 | C01FCF4F08A954540054247B /* Debug */ = { 307 | isa = XCBuildConfiguration; 308 | buildSettings = { 309 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 310 | GCC_WARN_UNUSED_VARIABLE = YES; 311 | PREBINDING = NO; 312 | }; 313 | name = Debug; 314 | }; 315 | C01FCF5008A954540054247B /* Release */ = { 316 | isa = XCBuildConfiguration; 317 | buildSettings = { 318 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 319 | GCC_WARN_UNUSED_VARIABLE = YES; 320 | PREBINDING = NO; 321 | }; 322 | name = Release; 323 | }; 324 | /* End XCBuildConfiguration section */ 325 | 326 | /* Begin XCConfigurationList section */ 327 | C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "NumberInput" */ = { 328 | isa = XCConfigurationList; 329 | buildConfigurations = ( 330 | C01FCF4B08A954540054247B /* Debug */, 331 | C01FCF4C08A954540054247B /* Release */, 332 | ); 333 | defaultConfigurationIsVisible = 0; 334 | defaultConfigurationName = Release; 335 | }; 336 | C01FCF4E08A954540054247B /* Build configuration list for PBXProject "NumberInput" */ = { 337 | isa = XCConfigurationList; 338 | buildConfigurations = ( 339 | C01FCF4F08A954540054247B /* Debug */, 340 | C01FCF5008A954540054247B /* Release */, 341 | ); 342 | defaultConfigurationIsVisible = 0; 343 | defaultConfigurationName = Release; 344 | }; 345 | /* End XCConfigurationList section */ 346 | }; 347 | rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; 348 | } 349 | -------------------------------------------------------------------------------- /NumberInput/NumberInputApplicationDelegate.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | File:NumberInputApplicationDelegate.h 4 | 5 | Abstract: The input method's application delegate object. 6 | 7 | Version: 1.0 8 | 9 | Disclaimer: IMPORTANT: This Apple software is supplied to you by 10 | Apple Inc. ("Apple") in consideration of your agreement to the 11 | following terms, and your use, installation, modification or 12 | redistribution of this Apple software constitutes acceptance of these 13 | terms. If you do not agree with these terms, please do not use, 14 | install, modify or redistribute this Apple software. 15 | 16 | In consideration of your agreement to abide by the following terms, and 17 | subject to these terms, Apple grants you a personal, non-exclusive 18 | license, under Apple's copyrights in this original Apple software (the 19 | "Apple Software"), to use, reproduce, modify and redistribute the Apple 20 | Software, with or without modifications, in source and/or binary forms; 21 | provided that if you redistribute the Apple Software in its entirety and 22 | without modifications, you must retain this notice and the following 23 | text and disclaimers in all such redistributions of the Apple Software. 24 | Neither the name, trademarks, service marks or logos of Apple Inc. 25 | may be used to endorse or promote products derived from the Apple 26 | Software without specific prior written permission from Apple. Except 27 | as expressly stated in this notice, no other rights or licenses, express 28 | or implied, are granted by Apple herein, including but not limited to 29 | any patent rights that may be infringed by your derivative works or by 30 | other works in which the Apple Software may be incorporated. 31 | 32 | The Apple Software is provided by Apple on an "AS IS" basis. APPLE 33 | MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION 34 | THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS 35 | FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND 36 | OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. 37 | 38 | IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL 39 | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 40 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 41 | INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, 42 | MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED 43 | AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), 44 | STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE 45 | POSSIBILITY OF SUCH DAMAGE. 46 | 47 | Copyright (C) 2007 Apple Inc. All Rights Reserved. 48 | 49 | */ 50 | #import 51 | #import "ConversionEngine.h" 52 | 53 | //The conversion engine is shared by all the input controllers. For that reason we store it in the application delegate where it 54 | //can be accessed by any of the controllers. 55 | //Note that the ConversionEngine is instantiated automatically because we said to instantiate the engine object in Interface Builder. 56 | @interface NumberInputApplicationDelegate : NSObject { 57 | IBOutlet ConversionEngine* _conversionEngine; 58 | IBOutlet NSMenu* _menu; 59 | } 60 | 61 | -(ConversionEngine*)conversionEngine; 62 | -(NSMenu*)menu; 63 | 64 | @end 65 | -------------------------------------------------------------------------------- /NumberInput/NumberInputApplicationDelegate.m: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | File:NumberInputApplicationDelegate.m 4 | 5 | Abstract: The input method's application delegate object. 6 | 7 | Version: 1.0 8 | 9 | Disclaimer: IMPORTANT: This Apple software is supplied to you by 10 | Apple Inc. ("Apple") in consideration of your agreement to the 11 | following terms, and your use, installation, modification or 12 | redistribution of this Apple software constitutes acceptance of these 13 | terms. If you do not agree with these terms, please do not use, 14 | install, modify or redistribute this Apple software. 15 | 16 | In consideration of your agreement to abide by the following terms, and 17 | subject to these terms, Apple grants you a personal, non-exclusive 18 | license, under Apple's copyrights in this original Apple software (the 19 | "Apple Software"), to use, reproduce, modify and redistribute the Apple 20 | Software, with or without modifications, in source and/or binary forms; 21 | provided that if you redistribute the Apple Software in its entirety and 22 | without modifications, you must retain this notice and the following 23 | text and disclaimers in all such redistributions of the Apple Software. 24 | Neither the name, trademarks, service marks or logos of Apple Inc. 25 | may be used to endorse or promote products derived from the Apple 26 | Software without specific prior written permission from Apple. Except 27 | as expressly stated in this notice, no other rights or licenses, express 28 | or implied, are granted by Apple herein, including but not limited to 29 | any patent rights that may be infringed by your derivative works or by 30 | other works in which the Apple Software may be incorporated. 31 | 32 | The Apple Software is provided by Apple on an "AS IS" basis. APPLE 33 | MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION 34 | THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS 35 | FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND 36 | OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. 37 | 38 | IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL 39 | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 40 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 41 | INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, 42 | MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED 43 | AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), 44 | STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE 45 | POSSIBILITY OF SUCH DAMAGE. 46 | 47 | Copyright (C) 2007 Apple Inc. All Rights Reserved. 48 | 49 | */ 50 | #import "NumberInputApplicationDelegate.h" 51 | 52 | 53 | @implementation NumberInputApplicationDelegate 54 | 55 | -(ConversionEngine*)conversionEngine 56 | { 57 | return _conversionEngine; 58 | } 59 | 60 | 61 | //this method is added so that our controllers can access the shared NSMenu. 62 | -(NSMenu*)menu 63 | { 64 | return _menu; 65 | } 66 | 67 | 68 | //add an awakeFromNib item so that we can set the action method. Note that any menuItems without an action will be disabled when 69 | //displayed in the Text Input Menud. 70 | -(void)awakeFromNib 71 | { 72 | NSMenuItem* preferences = [_menu itemWithTag:1]; 73 | 74 | if ( preferences ) { 75 | [preferences setAction:@selector(showPreferences:)]; 76 | } 77 | 78 | } 79 | 80 | @end 81 | -------------------------------------------------------------------------------- /NumberInput/NumberInputController.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | File:NumberInputController.h 4 | 5 | Abstract: Input controller header file. 6 | 7 | Version: 1.0 8 | 9 | Disclaimer: IMPORTANT: This Apple software is supplied to you by 10 | Apple Inc. ("Apple") in consideration of your agreement to the 11 | following terms, and your use, installation, modification or 12 | redistribution of this Apple software constitutes acceptance of these 13 | terms. If you do not agree with these terms, please do not use, 14 | install, modify or redistribute this Apple software. 15 | 16 | In consideration of your agreement to abide by the following terms, and 17 | subject to these terms, Apple grants you a personal, non-exclusive 18 | license, under Apple's copyrights in this original Apple software (the 19 | "Apple Software"), to use, reproduce, modify and redistribute the Apple 20 | Software, with or without modifications, in source and/or binary forms; 21 | provided that if you redistribute the Apple Software in its entirety and 22 | without modifications, you must retain this notice and the following 23 | text and disclaimers in all such redistributions of the Apple Software. 24 | Neither the name, trademarks, service marks or logos of Apple Inc. 25 | may be used to endorse or promote products derived from the Apple 26 | Software without specific prior written permission from Apple. Except 27 | as expressly stated in this notice, no other rights or licenses, express 28 | or implied, are granted by Apple herein, including but not limited to 29 | any patent rights that may be infringed by your derivative works or by 30 | other works in which the Apple Software may be incorporated. 31 | 32 | The Apple Software is provided by Apple on an "AS IS" basis. APPLE 33 | MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION 34 | THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS 35 | FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND 36 | OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. 37 | 38 | IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL 39 | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 40 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 41 | INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, 42 | MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED 43 | AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), 44 | STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE 45 | POSSIBILITY OF SUCH DAMAGE. 46 | 47 | Copyright (C) 2007 Apple Inc. All Rights Reserved. 48 | 49 | */ 50 | #import 51 | #import 52 | 53 | const NSString* kDecimalMode = @"com.apple.inputmethod.decimal"; 54 | const NSString* kCurrencyMode = @"com.apple.inputmethod.currency"; 55 | const NSString* kPercentMode = @"com.apple.inputmethod.percent"; 56 | const NSString* kScientificMode = @"com.apple.inputmethod.scientific"; 57 | const NSString* kSpelloutMode = @"com.apple.inputmethod.spellout"; 58 | 59 | @interface NumberInputController : IMKInputController { 60 | 61 | //_composedBuffer contains text that the input method has converted 62 | NSMutableString* _composedBuffer; 63 | //_original buffer contains the text has it was received from user input. 64 | NSMutableString* _originalBuffer; 65 | //used to mark where text is being inserted in the _composedBuffer 66 | NSInteger _insertionIndex; 67 | //This flag indicates that the original text was converted once in response to a trigger (space key) 68 | //the next time the trigger is received the composition will be committed. 69 | BOOL _didConvert; 70 | //the current active client. 71 | id _currentClient; 72 | } 73 | 74 | //These are simple methods for managing our composition and original buffers 75 | //They are all simple wrappers around basic NSString methods. 76 | -(NSMutableString*)composedBuffer; 77 | -(void)setComposedBuffer:(NSString*)string; 78 | 79 | -(NSMutableString*)originalBuffer; 80 | -(void)originalBufferAppend:(NSString*)string client:(id)sender; 81 | -(void)setOriginalBuffer:(NSString*)string; 82 | 83 | - (BOOL)convert:(NSString*)trigger client:(id)sender; 84 | 85 | @end 86 | -------------------------------------------------------------------------------- /NumberInput/NumberInputController.m: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | File:NumberInputController.m 4 | 5 | Abstract: Number input controller class. 6 | 7 | Version: 1.0 8 | 9 | Disclaimer: IMPORTANT: This Apple software is supplied to you by 10 | Apple Inc. ("Apple") in consideration of your agreement to the 11 | following terms, and your use, installation, modification or 12 | redistribution of this Apple software constitutes acceptance of these 13 | terms. If you do not agree with these terms, please do not use, 14 | install, modify or redistribute this Apple software. 15 | 16 | In consideration of your agreement to abide by the following terms, and 17 | subject to these terms, Apple grants you a personal, non-exclusive 18 | license, under Apple's copyrights in this original Apple software (the 19 | "Apple Software"), to use, reproduce, modify and redistribute the Apple 20 | Software, with or without modifications, in source and/or binary forms; 21 | provided that if you redistribute the Apple Software in its entirety and 22 | without modifications, you must retain this notice and the following 23 | text and disclaimers in all such redistributions of the Apple Software. 24 | Neither the name, trademarks, service marks or logos of Apple Inc. 25 | may be used to endorse or promote products derived from the Apple 26 | Software without specific prior written permission from Apple. Except 27 | as expressly stated in this notice, no other rights or licenses, express 28 | or implied, are granted by Apple herein, including but not limited to 29 | any patent rights that may be infringed by your derivative works or by 30 | other works in which the Apple Software may be incorporated. 31 | 32 | The Apple Software is provided by Apple on an "AS IS" basis. APPLE 33 | MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION 34 | THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS 35 | FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND 36 | OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. 37 | 38 | IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL 39 | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 40 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 41 | INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, 42 | MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED 43 | AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), 44 | STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE 45 | POSSIBILITY OF SUCH DAMAGE. 46 | 47 | Copyright (C) 2007 Apple Inc. All Rights Reserved. 48 | 49 | */ 50 | #import "NumberInputController.h" 51 | #import "ConversionEngine.h" 52 | #import "NumberInputApplicationDelegate.h" 53 | 54 | 55 | @implementation NumberInputController 56 | 57 | /* 58 | Implement one of the three ways to receive input from the client. 59 | Here are the three approaches: 60 | 61 | 1. Support keybinding. 62 | In this approach the system takes each keydown and trys to map the keydown to an action method that the input method has implemented. If an action is found the system calls didCommandBySelector:client:. If no action method is found inputText:client: is called. An input method choosing this approach should implement 63 | -(BOOL)inputText:(NSString*)string client:(id)sender; 64 | -(BOOL)didCommandBySelector:(SEL)aSelector client:(id)sender; 65 | 66 | 2. Receive all key events without the keybinding, but do "unpack" the relevant text data. 67 | Key events are broken down into the Unicodes, the key code that generated them, and modifier flags. This data is then sent to the input method's inputText:key:modifiers:client: method. For this approach implement: 68 | -(BOOL)inputText:(NSString*)string key:(NSInteger)keyCode modifiers:(NSUInteger)flags client:(id)sender; 69 | 70 | 3. Receive events directly from the Text Services Manager as NSEvent objects. For this approach implement: 71 | -(BOOL)handleEvent:(NSEvent*)event client:(id)sender; 72 | */ 73 | 74 | /*! 75 | @method 76 | @abstract Receive incoming text. 77 | @discussion This method receives key board input from the client application. The method receives the key input as an NSString. The string will have been created from the keydown event by the InputMethodKit. 78 | */ 79 | -(BOOL)inputText:(NSString*)string client:(id)sender 80 | { 81 | // Return YES to indicate the the key input was received and dealt with. Key processing will not continue in that case. In 82 | // other words the system will not deliver a key down event to the application. 83 | // Returning NO means the original key down will be passed on to the client. 84 | BOOL inputHandled = NO; 85 | // The parser is an NSScanner. 86 | NSScanner* scanner = [NSScanner scannerWithString:string]; 87 | NSDecimal decimalValue; 88 | // Check the input. If it is possibly part of a decimal number remember that. 89 | BOOL isDecimal = [scanner scanDecimal:&decimalValue]; 90 | 91 | if ( isDecimal ) { 92 | // If the input text is part of a decimal number. Add it to the original buffer, and return that we handled it. 93 | [self originalBufferAppend:string client:sender]; 94 | inputHandled = YES; 95 | } 96 | else { 97 | // If the input isn't part of a decimal number see if we need to convert the previously input text. 98 | inputHandled = [self convert:string client:sender]; 99 | } 100 | return inputHandled; 101 | } 102 | 103 | /*! 104 | @method 105 | @abstract Called when a user action was taken that ends an input session. Typically triggered by the user selecting a new input method or keyboard layout. 106 | @discussion When this method is called your controller should send the current input buffer to the client via a call to insertText:replacementRange:. Additionally, this is the time to clean up if that is necessary. 107 | */ 108 | 109 | -(void)commitComposition:(id)sender 110 | { 111 | NSString* text = [self composedBuffer]; 112 | 113 | if ( text == nil || [text length] == 0 ) { 114 | text = [self originalBuffer]; 115 | } 116 | 117 | [sender insertText:text replacementRange:NSMakeRange(NSNotFound, NSNotFound)]; 118 | 119 | [self setComposedBuffer:@""]; 120 | [self setOriginalBuffer:@""]; 121 | _insertionIndex = 0; 122 | _didConvert = NO; 123 | } 124 | 125 | // Return the composed buffer. If it is NIL create it. 126 | -(NSMutableString*)composedBuffer; 127 | { 128 | if ( _composedBuffer == nil ) { 129 | _composedBuffer = [[NSMutableString alloc] init]; 130 | } 131 | return _composedBuffer; 132 | } 133 | 134 | // Change the composed buffer. 135 | -(void)setComposedBuffer:(NSString*)string 136 | { 137 | NSMutableString* buffer = [self composedBuffer]; 138 | [buffer setString:string]; 139 | } 140 | 141 | 142 | // Get the original buffer. 143 | -(NSMutableString*)originalBuffer 144 | { 145 | if ( _originalBuffer == nil ) { 146 | _originalBuffer = [[NSMutableString alloc] init]; 147 | } 148 | return _originalBuffer; 149 | } 150 | 151 | // Add newly input text to the original buffer. 152 | -(void)originalBufferAppend:(NSString*)string client:(id)sender 153 | { 154 | NSMutableString* buffer = [self originalBuffer]; 155 | [buffer appendString: string]; 156 | _insertionIndex++; 157 | [sender setMarkedText:buffer selectionRange:NSMakeRange(0, [buffer length]) replacementRange:NSMakeRange(NSNotFound, NSNotFound)]; 158 | } 159 | 160 | // Change the original buffer. 161 | -(void)setOriginalBuffer:(NSString*)string 162 | { 163 | NSMutableString* buffer = [self originalBuffer]; 164 | [buffer setString:string]; 165 | } 166 | 167 | // This method is called to see if your input method handles an NSResponder action. 168 | -(BOOL)didCommandBySelector:(SEL)aSelector client:(id)sender 169 | { 170 | if ([self respondsToSelector:aSelector]) { 171 | // The NSResponder methods like insertNewline: or deleteBackward: are 172 | // methods that return void. didCommandBySelector method requires 173 | // that you return YES if the command is handled and NO if you do not. 174 | // This is necessary so that unhandled commands can be passed on to the 175 | // client application. For that reason we need to test in the case where 176 | // we might not handle the command. 177 | 178 | // The test here is simple. Test to see if any text has been aded to the original buffer. 179 | NSString* bufferedText = [self originalBuffer]; 180 | 181 | if ( bufferedText && [bufferedText length] > 0 ) { 182 | if (aSelector == @selector(insertNewline:) || 183 | aSelector == @selector(deleteBackward:) ) { 184 | [self performSelector:aSelector withObject:sender]; 185 | return YES; 186 | } 187 | } 188 | 189 | } 190 | 191 | return NO; 192 | } 193 | 194 | // When a new line is input we commit the composition. 195 | - (void)insertNewline:(id)sender 196 | { 197 | [self commitComposition:sender]; 198 | 199 | } 200 | 201 | // If backspace is entered remove the preceding character and update the marked text. 202 | - (void)deleteBackward:(id)sender 203 | { 204 | NSMutableString* originalText = [self originalBuffer]; 205 | NSString* convertedString; 206 | 207 | if ( _insertionIndex > 0 && _insertionIndex <= [originalText length] ) { 208 | --_insertionIndex; 209 | [originalText deleteCharactersInRange:NSMakeRange(_insertionIndex,1)]; 210 | convertedString = [[[NSApp delegate] conversionEngine] convert:originalText]; 211 | [self setComposedBuffer:convertedString]; 212 | [sender setMarkedText:convertedString selectionRange:NSMakeRange(_insertionIndex, 0) replacementRange:NSMakeRange(NSNotFound,NSNotFound)]; 213 | } 214 | } 215 | 216 | 217 | 218 | // This method converts buffered text based on the trigger string. If we did convert the text previously insert the converted text with 219 | // the trigger string appended to the converted text. 220 | // If we have not done a previous conversion check to see if the input string is a space. If it is convert the text mark it in the client, and remember that we did do a conversion. 221 | // If the input text is not a string. Commit the composition, and then insert the input string. 222 | - (BOOL)convert:(NSString*)trigger client:(id)sender 223 | { 224 | NSString* originalText = [self originalBuffer]; 225 | NSString* convertedString = [self composedBuffer]; 226 | BOOL handled = NO; 227 | 228 | if ( _didConvert && convertedString && [convertedString length] > 0 ) { 229 | 230 | extern IMKCandidates* candidates; 231 | if ( candidates ) { 232 | // Read the preferences to get the candidate orientation. 233 | NSInteger vertical = [[NSUserDefaults standardUserDefaults] integerForKey: @"verticalCandidate"]; 234 | 235 | if ( vertical ) { 236 | [candidates setPanelType:kIMKSingleColumnScrollingCandidatePanel]; 237 | } 238 | else { 239 | [candidates setPanelType:kIMKSingleRowSteppingCandidatePanel]; 240 | } 241 | _currentClient = sender; 242 | [candidates updateCandidates]; // This updates the candidates. 243 | [candidates show:kIMKLocateCandidatesBelowHint]; // This shows the candidates. If possible, display them below the users current 244 | // insertion point. 245 | 246 | 247 | } 248 | else { 249 | 250 | NSString* completeString = [convertedString stringByAppendingString:trigger]; 251 | 252 | [sender insertText:completeString replacementRange:NSMakeRange(NSNotFound, NSNotFound)]; 253 | 254 | [self setComposedBuffer:@""]; 255 | [self setOriginalBuffer:@""]; 256 | _insertionIndex = 0; 257 | _didConvert = NO; 258 | handled = YES; 259 | } 260 | 261 | } 262 | else if ( originalText && [originalText length] > 0 ) { 263 | 264 | convertedString = [[[NSApp delegate] conversionEngine] convert:originalText]; 265 | [self setComposedBuffer:convertedString]; 266 | 267 | if ( [trigger isEqual: @" "] ) { 268 | [sender setMarkedText:convertedString selectionRange:NSMakeRange(_insertionIndex, 0) replacementRange:NSMakeRange(NSNotFound,NSNotFound)]; 269 | _didConvert = YES; 270 | } 271 | else { 272 | [self commitComposition:sender]; 273 | [sender insertText:trigger replacementRange:NSMakeRange(NSNotFound, NSNotFound)]; 274 | } 275 | handled = YES; 276 | } 277 | return handled; 278 | } 279 | 280 | //This method is called by the InputMethodKit when the user as selected a new input mode from the text input menu. 281 | -(void)setValue:(id)value forTag:(unsigned long)tag client:(id)sender 282 | { 283 | NSString* newModeString = [(NSString*)value retain]; 284 | NSNumberFormatterStyle currentMode = [[[NSApp delegate] conversionEngine] conversionMode]; 285 | NSNumberFormatterStyle newMode; 286 | 287 | if ( [newModeString isEqual:kDecimalMode] ) { 288 | newMode = NSNumberFormatterDecimalStyle; 289 | } 290 | else if ( [newModeString isEqual:kCurrencyMode] ) { 291 | newMode = NSNumberFormatterCurrencyStyle; 292 | } 293 | else if ( [newModeString isEqual:kPercentMode] ) { 294 | newMode = NSNumberFormatterPercentStyle; 295 | } 296 | else if ( [newModeString isEqual:kScientificMode] ) { 297 | newMode = NSNumberFormatterScientificStyle; 298 | } 299 | else if ( [newModeString isEqual:kSpelloutMode] ) { 300 | newMode = NSNumberFormatterSpellOutStyle; 301 | } 302 | 303 | if ( currentMode != newMode ) { 304 | [[[NSApp delegate] conversionEngine] setConversionMode:newMode]; 305 | } 306 | } 307 | 308 | - (NSArray*)candidates:(id)sender 309 | { 310 | NSMutableArray* theCandidates = [NSMutableArray array]; 311 | ConversionEngine* engine = [[NSApp delegate] conversionEngine]; 312 | NSNumberFormatterStyle currentStyle = [ engine conversionMode]; 313 | NSInteger index; 314 | NSString* originalString = [self originalBuffer]; 315 | 316 | 317 | // Build the array of candidates by converting the original text for each mode. 318 | for ( index = NSNumberFormatterDecimalStyle; index < NSNumberFormatterSpellOutStyle+1; index++ ) { 319 | [engine setConversionMode:index]; 320 | [theCandidates addObject:[engine convert:originalString]]; 321 | } 322 | [engine setConversionMode:currentStyle]; 323 | return theCandidates; 324 | 325 | } 326 | 327 | - (void)candidateSelectionChanged:(NSAttributedString*)candidateString 328 | { 329 | [_currentClient setMarkedText:[candidateString string] selectionRange:NSMakeRange(_insertionIndex, 0) replacementRange:NSMakeRange(NSNotFound,NSNotFound)]; 330 | _insertionIndex = [candidateString length]; 331 | } 332 | 333 | /*! 334 | @method 335 | @abstract Called when a new candidate has been finally selected. 336 | @discussion The candidate parameter is the users final choice from the candidate window. The candidate window will have been closed before this method is called. 337 | */ 338 | - (void)candidateSelected:(NSAttributedString*)candidateString 339 | { 340 | [self setComposedBuffer:[candidateString string]]; 341 | [self commitComposition:_currentClient]; 342 | } 343 | 344 | -(NSMenu*)menu 345 | { 346 | return [[NSApp delegate] menu]; 347 | } 348 | 349 | 350 | -(void)dealloc 351 | { 352 | [_composedBuffer release]; 353 | [_originalBuffer release]; 354 | [super dealloc]; 355 | } 356 | 357 | 358 | @end 359 | -------------------------------------------------------------------------------- /NumberInput/NumberInput_Prefix.pch: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | File:NumberInput_Prefix.pch 4 | 5 | Abstract: Standard precompiled prefix header. 6 | 7 | Version: 1.0 8 | 9 | Disclaimer: IMPORTANT: This Apple software is supplied to you by 10 | Apple Inc. ("Apple") in consideration of your agreement to the 11 | following terms, and your use, installation, modification or 12 | redistribution of this Apple software constitutes acceptance of these 13 | terms. If you do not agree with these terms, please do not use, 14 | install, modify or redistribute this Apple software. 15 | 16 | In consideration of your agreement to abide by the following terms, and 17 | subject to these terms, Apple grants you a personal, non-exclusive 18 | license, under Apple's copyrights in this original Apple software (the 19 | "Apple Software"), to use, reproduce, modify and redistribute the Apple 20 | Software, with or without modifications, in source and/or binary forms; 21 | provided that if you redistribute the Apple Software in its entirety and 22 | without modifications, you must retain this notice and the following 23 | text and disclaimers in all such redistributions of the Apple Software. 24 | Neither the name, trademarks, service marks or logos of Apple Inc. 25 | may be used to endorse or promote products derived from the Apple 26 | Software without specific prior written permission from Apple. Except 27 | as expressly stated in this notice, no other rights or licenses, express 28 | or implied, are granted by Apple herein, including but not limited to 29 | any patent rights that may be infringed by your derivative works or by 30 | other works in which the Apple Software may be incorporated. 31 | 32 | The Apple Software is provided by Apple on an "AS IS" basis. APPLE 33 | MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION 34 | THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS 35 | FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND 36 | OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. 37 | 38 | IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL 39 | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 40 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 41 | INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, 42 | MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED 43 | AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), 44 | STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE 45 | POSSIBILITY OF SUCH DAMAGE. 46 | 47 | Copyright (C) 2007 Apple Inc. All Rights Reserved. 48 | 49 | */ 50 | 51 | #ifdef __OBJC__ 52 | #import 53 | #endif 54 | -------------------------------------------------------------------------------- /NumberInput/ReadMe: -------------------------------------------------------------------------------- 1 | NumberInput 4 2 | 3 | This version of the NumberInput project adds a preferences and menu items that let the user change the preferences. 4 | 5 | To add a preferences window and preferences support your create a preferences.nib that uses an NSUserDefaultsController to bind your preferences 6 | to key-value pairs in the user defaults database. You also need to provide a preferences.plist so that the InputMethodKit can automatically set your preferences defaults. 7 | Finally, you provide the user access to the preferences by adding a preferences menu item to the Text Input Menu. 8 | 9 | 1. In Interface Builder create a nib file called preferences.nib. Add a utility panel here with controls. 10 | 1a. Make the File's owner an NSWindowController and connect it with the panel. 11 | 1b. Add a matrix of 2 Radio Buttons. Set the Tag of the first button to 1. And the tag of the second to 0. 12 | 1c. Drag a NSUserDefaultsController to your nib file. Then bind the NSMatrix to selectedTags. Set the model key path to verticalCandidate. 13 | 14 | 2. Add a preferences.plist to your the NumberInput project. It should look like this: 15 | 16 | 17 | 18 | 19 | verticalCandidate 20 | 1 21 | 22 | 23 | 24 | 3. Back in InterfaceBuilder create an NSMenu in your MainMenu.nib. Add a single NSMenuItem to the menu. Name it "Preferences..." 25 | 26 | 4. The menu in this example's case is shared amongst all controllers so create an IBOutlet in your NumberInputApplicationDelegate that is an NSMenu. 27 | Also be sure and provide an accessor function for the menu. Then have IB reread the NumberInputApplicationDelegate and connect the new menu outlet to your NSMenu. 28 | 29 | 4. Add a menu method to your input controller. This menu function overrides the menu method declared in IMKInputController, and it will be called whenever your input method is selected and the Text Input Menu needs to be updated. 30 | 31 | As usual after making these changes build the input method and then copy it to /Library/Input Methods/. 32 | 33 | Now open TextEdit.app. Choose one of the NumberInput modes you can see that the Text Input Menu now adds an item called "Preferences..." Selecting that item should display your preferences panel. -------------------------------------------------------------------------------- /NumberInput/currency.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pkamb/NumberInput_IMKit_Sample/6c37ea05d85d0b7b5af9378a0ce88e191ca07241/NumberInput/currency.tiff -------------------------------------------------------------------------------- /NumberInput/main.m: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | File:main.m 4 | 5 | Abstract: main entry for number input input method. 6 | 7 | Version: 1.0 8 | 9 | Disclaimer: IMPORTANT: This Apple software is supplied to you by 10 | Apple Inc. ("Apple") in consideration of your agreement to the 11 | following terms, and your use, installation, modification or 12 | redistribution of this Apple software constitutes acceptance of these 13 | terms. If you do not agree with these terms, please do not use, 14 | install, modify or redistribute this Apple software. 15 | 16 | In consideration of your agreement to abide by the following terms, and 17 | subject to these terms, Apple grants you a personal, non-exclusive 18 | license, under Apple's copyrights in this original Apple software (the 19 | "Apple Software"), to use, reproduce, modify and redistribute the Apple 20 | Software, with or without modifications, in source and/or binary forms; 21 | provided that if you redistribute the Apple Software in its entirety and 22 | without modifications, you must retain this notice and the following 23 | text and disclaimers in all such redistributions of the Apple Software. 24 | Neither the name, trademarks, service marks or logos of Apple Inc. 25 | may be used to endorse or promote products derived from the Apple 26 | Software without specific prior written permission from Apple. Except 27 | as expressly stated in this notice, no other rights or licenses, express 28 | or implied, are granted by Apple herein, including but not limited to 29 | any patent rights that may be infringed by your derivative works or by 30 | other works in which the Apple Software may be incorporated. 31 | 32 | The Apple Software is provided by Apple on an "AS IS" basis. APPLE 33 | MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION 34 | THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS 35 | FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND 36 | OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS. 37 | 38 | IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL 39 | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 40 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 41 | INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION, 42 | MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED 43 | AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE), 44 | STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE 45 | POSSIBILITY OF SUCH DAMAGE. 46 | 47 | Copyright (C) 2007 Apple Inc. All Rights Reserved. 48 | 49 | */ 50 | #import 51 | #import 52 | 53 | //Each input method needs a unique connection name. 54 | //Note that periods and spaces are not allowed in the connection name. 55 | const NSString* kConnectionName = @"NumberInput_1_Connection"; 56 | 57 | //let this be a global so our application controller delegate can access it easily 58 | IMKServer* server; 59 | IMKCandidates* candidates = nil; 60 | 61 | 62 | int main(int argc, char *argv[]) 63 | { 64 | 65 | NSString* identifier; 66 | NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 67 | 68 | //find the bundle identifier and then initialize the input method server 69 | identifier = [[NSBundle mainBundle] bundleIdentifier]; 70 | server = [[IMKServer alloc] initWithName:(NSString*)kConnectionName bundleIdentifier:[[NSBundle mainBundle] bundleIdentifier]]; 71 | 72 | //load the bundle explicitly because in this case the input method is a background only application 73 | [NSBundle loadNibNamed:@"MainMenu" owner:[NSApplication sharedApplication]]; 74 | 75 | //create the candidate window 76 | candidates = [[IMKCandidates alloc] initWithServer:server panelType:kIMKSingleColumnScrollingCandidatePanel]; 77 | 78 | //finally run everything 79 | [[NSApplication sharedApplication] run]; 80 | 81 | [server release]; 82 | [candidates release]; 83 | 84 | [pool release]; 85 | return 0; 86 | } 87 | -------------------------------------------------------------------------------- /NumberInput/nine.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pkamb/NumberInput_IMKit_Sample/6c37ea05d85d0b7b5af9378a0ce88e191ca07241/NumberInput/nine.tiff -------------------------------------------------------------------------------- /NumberInput/nostyle.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pkamb/NumberInput_IMKit_Sample/6c37ea05d85d0b7b5af9378a0ce88e191ca07241/NumberInput/nostyle.tiff -------------------------------------------------------------------------------- /NumberInput/percent.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pkamb/NumberInput_IMKit_Sample/6c37ea05d85d0b7b5af9378a0ce88e191ca07241/NumberInput/percent.tiff -------------------------------------------------------------------------------- /NumberInput/preferences.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | verticalCandidate 6 | 1 7 | 8 | 9 | -------------------------------------------------------------------------------- /NumberInput/scientific.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pkamb/NumberInput_IMKit_Sample/6c37ea05d85d0b7b5af9378a0ce88e191ca07241/NumberInput/scientific.tiff -------------------------------------------------------------------------------- /NumberInput/spellout.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pkamb/NumberInput_IMKit_Sample/6c37ea05d85d0b7b5af9378a0ce88e191ca07241/NumberInput/spellout.tiff -------------------------------------------------------------------------------- /NumberInput_IMKit_Sample.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pkamb/NumberInput_IMKit_Sample/6c37ea05d85d0b7b5af9378a0ce88e191ca07241/NumberInput_IMKit_Sample.zip -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # InputMethodKit Framework Sample Code 2 | 3 | Apple's `NumberInput` sample code for creating an OS X input method using the Mac OS X Cocoa-based [InputMethodKit framework](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/InputMethodKitFrameworkRef/). 4 | 5 | In this repository I have simply sequentially committed each stage of the `NumberInput_IMKit_Sample` project. This allows for easily viewing the additions in each stage of the sample project. 6 | 7 | # NumberInput_IMKit_Sample 8 | 9 | https://developer.apple.com/library/mac/samplecode/NumberInput_IMKit_Sample/Introduction/Intro.html 10 | 11 | > This sample demonstrates how to write an input method using the Mac OS X v10.5 Cocoa based InputMethodKit. 12 | 13 | > This sample includes five stages. You begin with a simple do nothing version and move to a full version. 14 | 15 | Copyright (C) 2007 Apple Inc. All Rights Reserved. 16 | 17 | # Radars and Bug Reports 18 | 19 | If you encounter any bugs around Input Method Kit for macOS, please file a Radar with Apple! 20 | 21 | Then, post the links here: 22 | 23 | https://github.com/pkamb/NumberInput_IMKit_Sample/issues/2 24 | 25 | 26 | # Post a link to your Input Method Kit project 27 | 28 | It would be great to see other projects built using the Input Method Kit framework. If you come across this sample code, feel free to post a link to your IMKit project at the GitHub issue below. 29 | 30 | https://github.com/pkamb/NumberInput_IMKit_Sample/issues/1 31 | --------------------------------------------------------------------------------