├── .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 |
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 |
--------------------------------------------------------------------------------