├── .gitignore ├── DerivedData └── .gitignore ├── ScrollingTextView ├── Elk-512x512.png ├── main.m ├── AppDelegate.h ├── Images.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json ├── Info.plist ├── AppDelegate.m ├── ScrollingTextView.h ├── ScrollingTextView.m └── Base.lproj │ └── MainMenu.xib ├── ScrollingTextView.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── aaron.xcuserdatad │ │ └── UserInterfaceState.xcuserstate ├── xcuserdata │ └── aaron.xcuserdatad │ │ └── xcschemes │ │ ├── xcschememanagement.plist │ │ └── ScrollingTextView.xcscheme └── project.pbxproj ├── ScrollingTextViewTests ├── Info.plist └── ScrollingTextViewTests.m └── readme.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /DerivedData/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore -------------------------------------------------------------------------------- /ScrollingTextView/Elk-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orklann/ScrollingTextView/HEAD/ScrollingTextView/Elk-512x512.png -------------------------------------------------------------------------------- /ScrollingTextView.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ScrollingTextView.xcodeproj/project.xcworkspace/xcuserdata/aaron.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orklann/ScrollingTextView/HEAD/ScrollingTextView.xcodeproj/project.xcworkspace/xcuserdata/aaron.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /ScrollingTextView/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // ScrollingTextView 4 | // 5 | // Created by Aaron Elkins on 2014-27-11. 6 | // Copyright (c) 2014 Aaron Elkins. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, const char * argv[]) { 12 | return NSApplicationMain(argc, argv); 13 | } 14 | -------------------------------------------------------------------------------- /ScrollingTextView/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // ScrollingTextView 4 | // 5 | // Created by Aaron Elkins on 2014-27-11. 6 | // Copyright (c) 2014 Aaron Elkins. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "ScrollingTextView.h" 12 | 13 | @interface AppDelegate : NSObject 14 | 15 | @property (assign) IBOutlet ScrollingTextView *view; 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /ScrollingTextView.xcodeproj/xcuserdata/aaron.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | ScrollingTextView.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 93F7E5531A27108900D37BA6 16 | 17 | primary 18 | 19 | 20 | 93F7E5661A27108900D37BA6 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /ScrollingTextViewTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | PixelEgg.me.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # ScrollingTextView 2 | 3 | Can be used in About window to show license or credits. 4 | 5 | ### ARC enabled 6 | 7 | ARC support needed in this project 8 | 9 | ### How to use 10 | 11 | - Import ScrollingTextView.h|m into your project 12 | - Change the class of NSView to `ScrollingTextView` in Interface Builder 13 | - Make sure you add this few lines of code to init the `ScrollingTextView` 14 | 15 | `// Where kSampleText is a NSString instance` 16 | 17 | `[self.view setString:kSampleText];` 18 | 19 | - Done 20 | 21 | ### Authors 22 | 23 | [Aaron Elkins](http://blog.pixelegg.me) 24 | 25 | [Email Me](mailto:threcius@yahoo.com) 26 | 27 | ### Buy me a cup of tea 28 | 29 | If you like this chunk of code, please consider [buying me a cup of tea](https://www.pixelegg.me/buy_me_tea). 30 | 31 | ### License 32 | 33 | ScrollingTextView is licensed under [MIT](http://opensource.org/licenses/MIT) license. -------------------------------------------------------------------------------- /ScrollingTextViewTests/ScrollingTextViewTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // ScrollingTextViewTests.m 3 | // ScrollingTextViewTests 4 | // 5 | // Created by Aaron Elkins on 2014-27-11. 6 | // Copyright (c) 2014 Aaron Elkins. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface ScrollingTextViewTests : XCTestCase 13 | 14 | @end 15 | 16 | @implementation ScrollingTextViewTests 17 | 18 | - (void)setUp { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown { 24 | // Put teardown code here. This method is called after the invocation of each test method in the class. 25 | [super tearDown]; 26 | } 27 | 28 | - (void)testExample { 29 | // This is an example of a functional test case. 30 | XCTAssert(YES, @"Pass"); 31 | } 32 | 33 | - (void)testPerformanceExample { 34 | // This is an example of a performance test case. 35 | [self measureBlock:^{ 36 | // Put the code you want to measure the time of here. 37 | }]; 38 | } 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /ScrollingTextView/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "size" : "128x128", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "size" : "128x128", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "size" : "256x256", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "size" : "256x256", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "size" : "512x512", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "size" : "512x512", 51 | "scale" : "2x" 52 | } 53 | ], 54 | "info" : { 55 | "version" : 1, 56 | "author" : "xcode" 57 | } 58 | } -------------------------------------------------------------------------------- /ScrollingTextView/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | PixelEgg.me.$(PRODUCT_NAME:rfc1034identifier) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | NSHumanReadableCopyright 28 | Copyright © 2014 Aaron Elkins. All rights reserved. 29 | NSMainNibFile 30 | MainMenu 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /ScrollingTextView/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // ScrollingTextView 4 | // 5 | // Created by Aaron Elkins on 2014-27-11. 6 | // Copyright (c) 2014 Aaron Elkins. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | #define kSampleText @"Acknowledgements\nPortions of this Apple Software may utilize the following copyrighted material, the use of which is hereby acknowledged.\nAdobe Systems ( epubcheck )\nCopyright © 2007 Adobe Systems Incorporated.\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:" 12 | 13 | @interface AppDelegate () 14 | 15 | @property (weak) IBOutlet NSWindow *window; 16 | @end 17 | 18 | @implementation AppDelegate 19 | 20 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 21 | [[self window] setBackgroundColor:[NSColor whiteColor]]; 22 | 23 | [self.view setString:kSampleText]; 24 | } 25 | 26 | - (void)applicationWillTerminate:(NSNotification *)aNotification { 27 | // Insert code here to tear down your application 28 | } 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /ScrollingTextView/ScrollingTextView.h: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | ScrollingTextView.h 4 | 5 | http://www.pixelegg.me 6 | 7 | Created on 2014-27-11 by Aaron Elkins 8 | encoding="UTF-8" 9 | ------------------------------------------------------------------------------ 10 | 11 | Copyright (c) 2014 Aaron Elkins 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy 14 | of this software and associated documentation files (the "Software"), to deal 15 | in the Software without restriction, including without limitation the rights 16 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 | copies of the Software, and to permit persons to whom the Software is 18 | furnished to do so, subject to the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included in 21 | all copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 29 | THE SOFTWARE. 30 | 31 | ============================================================================== 32 | */ 33 | 34 | #import 35 | 36 | @interface ScrollingTextView : NSView{ 37 | NSAttributedString *attributedString; 38 | NSTimer *timer; 39 | BOOL pauseScrolling; 40 | NSRect textRect; 41 | } 42 | 43 | @property (readwrite) NSColor *backgroundColor; 44 | 45 | - (void)setString:(NSString*)as; 46 | @end 47 | -------------------------------------------------------------------------------- /ScrollingTextView/ScrollingTextView.m: -------------------------------------------------------------------------------- 1 | /* 2 | ============================================================================== 3 | ScrollingTextView.m 4 | 5 | http://www.pixelegg.me 6 | 7 | Created on 2014-27-11 by Aaron Elkins 8 | encoding="UTF-8" 9 | ------------------------------------------------------------------------------ 10 | 11 | Copyright (c) 2014 Aaron Elkins 12 | 13 | Permission is hereby granted, free of charge, to any person obtaining a copy 14 | of this software and associated documentation files (the "Software"), to deal 15 | in the Software without restriction, including without limitation the rights 16 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 17 | copies of the Software, and to permit persons to whom the Software is 18 | furnished to do so, subject to the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be included in 21 | all copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 24 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 25 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 26 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 27 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 28 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 29 | THE SOFTWARE. 30 | 31 | ============================================================================== 32 | */ 33 | 34 | #import "ScrollingTextView.h" 35 | 36 | @interface ScrollingTextView (Expose) 37 | - (void)scrollText:(NSTimer*)t; 38 | @end 39 | 40 | @implementation ScrollingTextView (Expose) 41 | - (void)scrollText:(NSTimer*)t{ 42 | // Pause 43 | if (pauseScrolling) { 44 | return ; 45 | } 46 | 47 | NSRect frame = self.bounds; 48 | 49 | if(!CGRectIntersectsRect(frame, textRect)){ 50 | textRect.origin.y = NSMaxY(self.bounds); 51 | } 52 | 53 | textRect.origin.y -= 1; 54 | [self setNeedsDisplay:YES]; 55 | } 56 | @end 57 | 58 | @implementation ScrollingTextView 59 | 60 | - (void)setString:(NSString*)as{ 61 | // don't pause at start up 62 | pauseScrolling = NO; 63 | 64 | // Setting up attributed string 65 | NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 66 | 67 | [dict setObject:[NSFont fontWithName:@"Lucida Grande" size:10.0] forKey:NSFontAttributeName]; 68 | [dict setObject:[NSColor colorWithDeviceRed:0.64 green:0.64 blue:0.64 alpha:1.0] forKey:NSForegroundColorAttributeName]; 69 | attributedString = [[NSAttributedString alloc] initWithString:as attributes:dict]; 70 | 71 | NSSize size = self.frame.size; 72 | 73 | // Calculate attributed string rect 74 | NSTextStorage *storage = 75 | [[NSTextStorage alloc] initWithAttributedString:attributedString]; 76 | 77 | NSTextContainer *container = 78 | [[NSTextContainer alloc] initWithContainerSize:size]; 79 | NSLayoutManager *manager = [[NSLayoutManager alloc] init]; 80 | 81 | [manager addTextContainer:container]; 82 | [storage addLayoutManager:manager]; 83 | 84 | [manager glyphRangeForTextContainer:container]; 85 | 86 | NSRect idealRect = [manager usedRectForTextContainer: container]; 87 | idealRect.origin = NSZeroPoint; 88 | idealRect.size.height += 25; 89 | 90 | textRect = idealRect; 91 | textRect.origin.y = NSMaxY(self.bounds); 92 | [self setNeedsDisplay:YES]; 93 | } 94 | 95 | - (void)awakeFromNib{ 96 | // don't pause at start up 97 | pauseScrolling = NO; 98 | 99 | // Setup background color 100 | [self setBackgroundColor:[NSColor whiteColor]]; 101 | timer = [NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(scrollText:) userInfo:nil repeats:YES]; 102 | } 103 | 104 | - (void)drawRect:(NSRect)dirtyRect{ 105 | NSRect frame = [self bounds]; 106 | 107 | // Draw background with backgroundColor 108 | [[self backgroundColor] set]; 109 | NSRectFill(frame); 110 | 111 | // Draw atrtributed string 112 | [attributedString drawInRect:textRect]; 113 | } 114 | 115 | - (BOOL)isFlipped{ 116 | return YES; 117 | } 118 | 119 | - (void)mouseDown:(NSEvent *)theEvent{ 120 | pauseScrolling = !pauseScrolling; 121 | } 122 | @end 123 | -------------------------------------------------------------------------------- /ScrollingTextView.xcodeproj/xcuserdata/aaron.xcuserdatad/xcschemes/ScrollingTextView.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 94 | 100 | 101 | 102 | 103 | 105 | 106 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /ScrollingTextView.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 93F7E55B1A27108900D37BA6 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 93F7E55A1A27108900D37BA6 /* AppDelegate.m */; }; 11 | 93F7E55D1A27108900D37BA6 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 93F7E55C1A27108900D37BA6 /* main.m */; }; 12 | 93F7E55F1A27108900D37BA6 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 93F7E55E1A27108900D37BA6 /* Images.xcassets */; }; 13 | 93F7E5621A27108900D37BA6 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93F7E5601A27108900D37BA6 /* MainMenu.xib */; }; 14 | 93F7E56E1A27108900D37BA6 /* ScrollingTextViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 93F7E56D1A27108900D37BA6 /* ScrollingTextViewTests.m */; }; 15 | 93F7E57A1A2710BC00D37BA6 /* ScrollingTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 93F7E5791A2710BC00D37BA6 /* ScrollingTextView.m */; }; 16 | 93F7E57C1A271C1400D37BA6 /* Elk-512x512.png in Resources */ = {isa = PBXBuildFile; fileRef = 93F7E57B1A271C1400D37BA6 /* Elk-512x512.png */; }; 17 | /* End PBXBuildFile section */ 18 | 19 | /* Begin PBXContainerItemProxy section */ 20 | 93F7E5681A27108900D37BA6 /* PBXContainerItemProxy */ = { 21 | isa = PBXContainerItemProxy; 22 | containerPortal = 93F7E54C1A27108800D37BA6 /* Project object */; 23 | proxyType = 1; 24 | remoteGlobalIDString = 93F7E5531A27108900D37BA6; 25 | remoteInfo = ScrollingTextView; 26 | }; 27 | /* End PBXContainerItemProxy section */ 28 | 29 | /* Begin PBXFileReference section */ 30 | 93F7E5541A27108900D37BA6 /* ScrollingTextView.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ScrollingTextView.app; sourceTree = BUILT_PRODUCTS_DIR; }; 31 | 93F7E5581A27108900D37BA6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 32 | 93F7E5591A27108900D37BA6 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 33 | 93F7E55A1A27108900D37BA6 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 34 | 93F7E55C1A27108900D37BA6 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 35 | 93F7E55E1A27108900D37BA6 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 36 | 93F7E5611A27108900D37BA6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 37 | 93F7E5671A27108900D37BA6 /* ScrollingTextViewTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ScrollingTextViewTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 38 | 93F7E56C1A27108900D37BA6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 39 | 93F7E56D1A27108900D37BA6 /* ScrollingTextViewTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ScrollingTextViewTests.m; sourceTree = ""; }; 40 | 93F7E5781A2710BC00D37BA6 /* ScrollingTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScrollingTextView.h; sourceTree = ""; }; 41 | 93F7E5791A2710BC00D37BA6 /* ScrollingTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ScrollingTextView.m; sourceTree = ""; }; 42 | 93F7E57B1A271C1400D37BA6 /* Elk-512x512.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Elk-512x512.png"; sourceTree = ""; }; 43 | /* End PBXFileReference section */ 44 | 45 | /* Begin PBXFrameworksBuildPhase section */ 46 | 93F7E5511A27108900D37BA6 /* Frameworks */ = { 47 | isa = PBXFrameworksBuildPhase; 48 | buildActionMask = 2147483647; 49 | files = ( 50 | ); 51 | runOnlyForDeploymentPostprocessing = 0; 52 | }; 53 | 93F7E5641A27108900D37BA6 /* Frameworks */ = { 54 | isa = PBXFrameworksBuildPhase; 55 | buildActionMask = 2147483647; 56 | files = ( 57 | ); 58 | runOnlyForDeploymentPostprocessing = 0; 59 | }; 60 | /* End PBXFrameworksBuildPhase section */ 61 | 62 | /* Begin PBXGroup section */ 63 | 93F7E54B1A27108800D37BA6 = { 64 | isa = PBXGroup; 65 | children = ( 66 | 93F7E5561A27108900D37BA6 /* ScrollingTextView */, 67 | 93F7E56A1A27108900D37BA6 /* ScrollingTextViewTests */, 68 | 93F7E5551A27108900D37BA6 /* Products */, 69 | ); 70 | sourceTree = ""; 71 | }; 72 | 93F7E5551A27108900D37BA6 /* Products */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | 93F7E5541A27108900D37BA6 /* ScrollingTextView.app */, 76 | 93F7E5671A27108900D37BA6 /* ScrollingTextViewTests.xctest */, 77 | ); 78 | name = Products; 79 | sourceTree = ""; 80 | }; 81 | 93F7E5561A27108900D37BA6 /* ScrollingTextView */ = { 82 | isa = PBXGroup; 83 | children = ( 84 | 93F7E57B1A271C1400D37BA6 /* Elk-512x512.png */, 85 | 93F7E5771A27109200D37BA6 /* ScrollingTextView */, 86 | 93F7E5591A27108900D37BA6 /* AppDelegate.h */, 87 | 93F7E55A1A27108900D37BA6 /* AppDelegate.m */, 88 | 93F7E55E1A27108900D37BA6 /* Images.xcassets */, 89 | 93F7E5601A27108900D37BA6 /* MainMenu.xib */, 90 | 93F7E5571A27108900D37BA6 /* Supporting Files */, 91 | ); 92 | path = ScrollingTextView; 93 | sourceTree = ""; 94 | }; 95 | 93F7E5571A27108900D37BA6 /* Supporting Files */ = { 96 | isa = PBXGroup; 97 | children = ( 98 | 93F7E5581A27108900D37BA6 /* Info.plist */, 99 | 93F7E55C1A27108900D37BA6 /* main.m */, 100 | ); 101 | name = "Supporting Files"; 102 | sourceTree = ""; 103 | }; 104 | 93F7E56A1A27108900D37BA6 /* ScrollingTextViewTests */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | 93F7E56D1A27108900D37BA6 /* ScrollingTextViewTests.m */, 108 | 93F7E56B1A27108900D37BA6 /* Supporting Files */, 109 | ); 110 | path = ScrollingTextViewTests; 111 | sourceTree = ""; 112 | }; 113 | 93F7E56B1A27108900D37BA6 /* Supporting Files */ = { 114 | isa = PBXGroup; 115 | children = ( 116 | 93F7E56C1A27108900D37BA6 /* Info.plist */, 117 | ); 118 | name = "Supporting Files"; 119 | sourceTree = ""; 120 | }; 121 | 93F7E5771A27109200D37BA6 /* ScrollingTextView */ = { 122 | isa = PBXGroup; 123 | children = ( 124 | 93F7E5781A2710BC00D37BA6 /* ScrollingTextView.h */, 125 | 93F7E5791A2710BC00D37BA6 /* ScrollingTextView.m */, 126 | ); 127 | name = ScrollingTextView; 128 | sourceTree = ""; 129 | }; 130 | /* End PBXGroup section */ 131 | 132 | /* Begin PBXNativeTarget section */ 133 | 93F7E5531A27108900D37BA6 /* ScrollingTextView */ = { 134 | isa = PBXNativeTarget; 135 | buildConfigurationList = 93F7E5711A27108900D37BA6 /* Build configuration list for PBXNativeTarget "ScrollingTextView" */; 136 | buildPhases = ( 137 | 93F7E5501A27108900D37BA6 /* Sources */, 138 | 93F7E5511A27108900D37BA6 /* Frameworks */, 139 | 93F7E5521A27108900D37BA6 /* Resources */, 140 | ); 141 | buildRules = ( 142 | ); 143 | dependencies = ( 144 | ); 145 | name = ScrollingTextView; 146 | productName = ScrollingTextView; 147 | productReference = 93F7E5541A27108900D37BA6 /* ScrollingTextView.app */; 148 | productType = "com.apple.product-type.application"; 149 | }; 150 | 93F7E5661A27108900D37BA6 /* ScrollingTextViewTests */ = { 151 | isa = PBXNativeTarget; 152 | buildConfigurationList = 93F7E5741A27108900D37BA6 /* Build configuration list for PBXNativeTarget "ScrollingTextViewTests" */; 153 | buildPhases = ( 154 | 93F7E5631A27108900D37BA6 /* Sources */, 155 | 93F7E5641A27108900D37BA6 /* Frameworks */, 156 | 93F7E5651A27108900D37BA6 /* Resources */, 157 | ); 158 | buildRules = ( 159 | ); 160 | dependencies = ( 161 | 93F7E5691A27108900D37BA6 /* PBXTargetDependency */, 162 | ); 163 | name = ScrollingTextViewTests; 164 | productName = ScrollingTextViewTests; 165 | productReference = 93F7E5671A27108900D37BA6 /* ScrollingTextViewTests.xctest */; 166 | productType = "com.apple.product-type.bundle.unit-test"; 167 | }; 168 | /* End PBXNativeTarget section */ 169 | 170 | /* Begin PBXProject section */ 171 | 93F7E54C1A27108800D37BA6 /* Project object */ = { 172 | isa = PBXProject; 173 | attributes = { 174 | LastUpgradeCheck = 0610; 175 | ORGANIZATIONNAME = "Aaron Elkins"; 176 | TargetAttributes = { 177 | 93F7E5531A27108900D37BA6 = { 178 | CreatedOnToolsVersion = 6.1; 179 | }; 180 | 93F7E5661A27108900D37BA6 = { 181 | CreatedOnToolsVersion = 6.1; 182 | TestTargetID = 93F7E5531A27108900D37BA6; 183 | }; 184 | }; 185 | }; 186 | buildConfigurationList = 93F7E54F1A27108800D37BA6 /* Build configuration list for PBXProject "ScrollingTextView" */; 187 | compatibilityVersion = "Xcode 3.2"; 188 | developmentRegion = English; 189 | hasScannedForEncodings = 0; 190 | knownRegions = ( 191 | en, 192 | Base, 193 | ); 194 | mainGroup = 93F7E54B1A27108800D37BA6; 195 | productRefGroup = 93F7E5551A27108900D37BA6 /* Products */; 196 | projectDirPath = ""; 197 | projectRoot = ""; 198 | targets = ( 199 | 93F7E5531A27108900D37BA6 /* ScrollingTextView */, 200 | 93F7E5661A27108900D37BA6 /* ScrollingTextViewTests */, 201 | ); 202 | }; 203 | /* End PBXProject section */ 204 | 205 | /* Begin PBXResourcesBuildPhase section */ 206 | 93F7E5521A27108900D37BA6 /* Resources */ = { 207 | isa = PBXResourcesBuildPhase; 208 | buildActionMask = 2147483647; 209 | files = ( 210 | 93F7E55F1A27108900D37BA6 /* Images.xcassets in Resources */, 211 | 93F7E5621A27108900D37BA6 /* MainMenu.xib in Resources */, 212 | 93F7E57C1A271C1400D37BA6 /* Elk-512x512.png in Resources */, 213 | ); 214 | runOnlyForDeploymentPostprocessing = 0; 215 | }; 216 | 93F7E5651A27108900D37BA6 /* Resources */ = { 217 | isa = PBXResourcesBuildPhase; 218 | buildActionMask = 2147483647; 219 | files = ( 220 | ); 221 | runOnlyForDeploymentPostprocessing = 0; 222 | }; 223 | /* End PBXResourcesBuildPhase section */ 224 | 225 | /* Begin PBXSourcesBuildPhase section */ 226 | 93F7E5501A27108900D37BA6 /* Sources */ = { 227 | isa = PBXSourcesBuildPhase; 228 | buildActionMask = 2147483647; 229 | files = ( 230 | 93F7E57A1A2710BC00D37BA6 /* ScrollingTextView.m in Sources */, 231 | 93F7E55D1A27108900D37BA6 /* main.m in Sources */, 232 | 93F7E55B1A27108900D37BA6 /* AppDelegate.m in Sources */, 233 | ); 234 | runOnlyForDeploymentPostprocessing = 0; 235 | }; 236 | 93F7E5631A27108900D37BA6 /* Sources */ = { 237 | isa = PBXSourcesBuildPhase; 238 | buildActionMask = 2147483647; 239 | files = ( 240 | 93F7E56E1A27108900D37BA6 /* ScrollingTextViewTests.m in Sources */, 241 | ); 242 | runOnlyForDeploymentPostprocessing = 0; 243 | }; 244 | /* End PBXSourcesBuildPhase section */ 245 | 246 | /* Begin PBXTargetDependency section */ 247 | 93F7E5691A27108900D37BA6 /* PBXTargetDependency */ = { 248 | isa = PBXTargetDependency; 249 | target = 93F7E5531A27108900D37BA6 /* ScrollingTextView */; 250 | targetProxy = 93F7E5681A27108900D37BA6 /* PBXContainerItemProxy */; 251 | }; 252 | /* End PBXTargetDependency section */ 253 | 254 | /* Begin PBXVariantGroup section */ 255 | 93F7E5601A27108900D37BA6 /* MainMenu.xib */ = { 256 | isa = PBXVariantGroup; 257 | children = ( 258 | 93F7E5611A27108900D37BA6 /* Base */, 259 | ); 260 | name = MainMenu.xib; 261 | sourceTree = ""; 262 | }; 263 | /* End PBXVariantGroup section */ 264 | 265 | /* Begin XCBuildConfiguration section */ 266 | 93F7E56F1A27108900D37BA6 /* Debug */ = { 267 | isa = XCBuildConfiguration; 268 | buildSettings = { 269 | ALWAYS_SEARCH_USER_PATHS = NO; 270 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 271 | CLANG_CXX_LIBRARY = "libc++"; 272 | CLANG_ENABLE_MODULES = YES; 273 | CLANG_ENABLE_OBJC_ARC = YES; 274 | CLANG_WARN_BOOL_CONVERSION = YES; 275 | CLANG_WARN_CONSTANT_CONVERSION = YES; 276 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 277 | CLANG_WARN_EMPTY_BODY = YES; 278 | CLANG_WARN_ENUM_CONVERSION = YES; 279 | CLANG_WARN_INT_CONVERSION = YES; 280 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 281 | CLANG_WARN_UNREACHABLE_CODE = YES; 282 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 283 | CODE_SIGN_IDENTITY = "-"; 284 | COPY_PHASE_STRIP = NO; 285 | ENABLE_STRICT_OBJC_MSGSEND = YES; 286 | GCC_C_LANGUAGE_STANDARD = gnu99; 287 | GCC_DYNAMIC_NO_PIC = NO; 288 | GCC_OPTIMIZATION_LEVEL = 0; 289 | GCC_PREPROCESSOR_DEFINITIONS = ( 290 | "DEBUG=1", 291 | "$(inherited)", 292 | ); 293 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 294 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 295 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 296 | GCC_WARN_UNDECLARED_SELECTOR = YES; 297 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 298 | GCC_WARN_UNUSED_FUNCTION = YES; 299 | GCC_WARN_UNUSED_VARIABLE = YES; 300 | MACOSX_DEPLOYMENT_TARGET = 10.10; 301 | MTL_ENABLE_DEBUG_INFO = YES; 302 | ONLY_ACTIVE_ARCH = YES; 303 | SDKROOT = macosx; 304 | }; 305 | name = Debug; 306 | }; 307 | 93F7E5701A27108900D37BA6 /* Release */ = { 308 | isa = XCBuildConfiguration; 309 | buildSettings = { 310 | ALWAYS_SEARCH_USER_PATHS = NO; 311 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 312 | CLANG_CXX_LIBRARY = "libc++"; 313 | CLANG_ENABLE_MODULES = YES; 314 | CLANG_ENABLE_OBJC_ARC = YES; 315 | CLANG_WARN_BOOL_CONVERSION = YES; 316 | CLANG_WARN_CONSTANT_CONVERSION = YES; 317 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 318 | CLANG_WARN_EMPTY_BODY = YES; 319 | CLANG_WARN_ENUM_CONVERSION = YES; 320 | CLANG_WARN_INT_CONVERSION = YES; 321 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 322 | CLANG_WARN_UNREACHABLE_CODE = YES; 323 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 324 | CODE_SIGN_IDENTITY = "-"; 325 | COPY_PHASE_STRIP = YES; 326 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 327 | ENABLE_NS_ASSERTIONS = NO; 328 | ENABLE_STRICT_OBJC_MSGSEND = YES; 329 | GCC_C_LANGUAGE_STANDARD = gnu99; 330 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 331 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 332 | GCC_WARN_UNDECLARED_SELECTOR = YES; 333 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 334 | GCC_WARN_UNUSED_FUNCTION = YES; 335 | GCC_WARN_UNUSED_VARIABLE = YES; 336 | MACOSX_DEPLOYMENT_TARGET = 10.10; 337 | MTL_ENABLE_DEBUG_INFO = NO; 338 | SDKROOT = macosx; 339 | }; 340 | name = Release; 341 | }; 342 | 93F7E5721A27108900D37BA6 /* Debug */ = { 343 | isa = XCBuildConfiguration; 344 | buildSettings = { 345 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 346 | COMBINE_HIDPI_IMAGES = YES; 347 | INFOPLIST_FILE = ScrollingTextView/Info.plist; 348 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 349 | PRODUCT_NAME = "$(TARGET_NAME)"; 350 | }; 351 | name = Debug; 352 | }; 353 | 93F7E5731A27108900D37BA6 /* Release */ = { 354 | isa = XCBuildConfiguration; 355 | buildSettings = { 356 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 357 | COMBINE_HIDPI_IMAGES = YES; 358 | INFOPLIST_FILE = ScrollingTextView/Info.plist; 359 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks"; 360 | PRODUCT_NAME = "$(TARGET_NAME)"; 361 | }; 362 | name = Release; 363 | }; 364 | 93F7E5751A27108900D37BA6 /* Debug */ = { 365 | isa = XCBuildConfiguration; 366 | buildSettings = { 367 | BUNDLE_LOADER = "$(TEST_HOST)"; 368 | COMBINE_HIDPI_IMAGES = YES; 369 | FRAMEWORK_SEARCH_PATHS = ( 370 | "$(DEVELOPER_FRAMEWORKS_DIR)", 371 | "$(inherited)", 372 | ); 373 | GCC_PREPROCESSOR_DEFINITIONS = ( 374 | "DEBUG=1", 375 | "$(inherited)", 376 | ); 377 | INFOPLIST_FILE = ScrollingTextViewTests/Info.plist; 378 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 379 | PRODUCT_NAME = "$(TARGET_NAME)"; 380 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ScrollingTextView.app/Contents/MacOS/ScrollingTextView"; 381 | }; 382 | name = Debug; 383 | }; 384 | 93F7E5761A27108900D37BA6 /* Release */ = { 385 | isa = XCBuildConfiguration; 386 | buildSettings = { 387 | BUNDLE_LOADER = "$(TEST_HOST)"; 388 | COMBINE_HIDPI_IMAGES = YES; 389 | FRAMEWORK_SEARCH_PATHS = ( 390 | "$(DEVELOPER_FRAMEWORKS_DIR)", 391 | "$(inherited)", 392 | ); 393 | INFOPLIST_FILE = ScrollingTextViewTests/Info.plist; 394 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; 395 | PRODUCT_NAME = "$(TARGET_NAME)"; 396 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ScrollingTextView.app/Contents/MacOS/ScrollingTextView"; 397 | }; 398 | name = Release; 399 | }; 400 | /* End XCBuildConfiguration section */ 401 | 402 | /* Begin XCConfigurationList section */ 403 | 93F7E54F1A27108800D37BA6 /* Build configuration list for PBXProject "ScrollingTextView" */ = { 404 | isa = XCConfigurationList; 405 | buildConfigurations = ( 406 | 93F7E56F1A27108900D37BA6 /* Debug */, 407 | 93F7E5701A27108900D37BA6 /* Release */, 408 | ); 409 | defaultConfigurationIsVisible = 0; 410 | defaultConfigurationName = Release; 411 | }; 412 | 93F7E5711A27108900D37BA6 /* Build configuration list for PBXNativeTarget "ScrollingTextView" */ = { 413 | isa = XCConfigurationList; 414 | buildConfigurations = ( 415 | 93F7E5721A27108900D37BA6 /* Debug */, 416 | 93F7E5731A27108900D37BA6 /* Release */, 417 | ); 418 | defaultConfigurationIsVisible = 0; 419 | defaultConfigurationName = Release; 420 | }; 421 | 93F7E5741A27108900D37BA6 /* Build configuration list for PBXNativeTarget "ScrollingTextViewTests" */ = { 422 | isa = XCConfigurationList; 423 | buildConfigurations = ( 424 | 93F7E5751A27108900D37BA6 /* Debug */, 425 | 93F7E5761A27108900D37BA6 /* Release */, 426 | ); 427 | defaultConfigurationIsVisible = 0; 428 | defaultConfigurationName = Release; 429 | }; 430 | /* End XCConfigurationList section */ 431 | }; 432 | rootObject = 93F7E54C1A27108800D37BA6 /* Project object */; 433 | } 434 | -------------------------------------------------------------------------------- /ScrollingTextView/Base.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | Default 540 | 541 | 542 | 543 | 544 | 545 | 546 | Left to Right 547 | 548 | 549 | 550 | 551 | 552 | 553 | Right to Left 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | Default 565 | 566 | 567 | 568 | 569 | 570 | 571 | Left to Right 572 | 573 | 574 | 575 | 576 | 577 | 578 | Right to Left 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | --------------------------------------------------------------------------------