├── .gitignore ├── BSD-LICENSE.txt ├── Classes ├── YRKSpinningProgressIndicator.h └── YRKSpinningProgressIndicator.m ├── Demo ├── Classes │ ├── SPIDAppController.h │ ├── SPIDAppController.m │ └── main.m ├── Configs │ ├── debug.xcconfig │ └── release.xcconfig ├── Resources │ ├── English.lproj │ │ ├── InfoPlist.strings │ │ └── MainMenu.xib │ └── Info.plist └── SPIDemo.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcuserdata │ │ └── Nathan.xcuserdatad │ │ └── WorkspaceSettings.xcsettings │ └── xcuserdata │ └── Nathan.xcuserdatad │ └── xcschemes │ ├── SPIDemo.xcscheme │ └── xcschememanagement.plist ├── README.md └── YRKSpinningProgressIndicator.podspec /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.xcodeproj/*.pbxuser 3 | *.xcodeproj/*.mode1v3 4 | *.xcodeproj/*.perspective 5 | *.xcodeproj/project.xcworkspace 6 | *.xcodeproj/xcuserdata 7 | *.xccheckout 8 | *.xcodeproj/*.tm_build_errors 9 | Demo/SPIDemo.xcodeproj/project.xcworkspace/xcuserdata 10 | -------------------------------------------------------------------------------- /BSD-LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2009, Kelan Champagne (http://yeahrightkeller.com) 2 | 3 | All rights reserved. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | * Redistributions of source code must retain the above copyright 9 | notice, this list of conditions and the following disclaimer. 10 | * Redistributions in binary form must reproduce the above copyright 11 | notice, this list of conditions and the following disclaimer in the 12 | documentation and/or other materials provided with the distribution. 13 | * Neither the name of the Kelan Champagne nor the 14 | names of its contributors may be used to endorse or promote products 15 | derived from this software without specific prior written permission. 16 | 17 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 18 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE 21 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 22 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 23 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 25 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 26 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 27 | POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /Classes/YRKSpinningProgressIndicator.h: -------------------------------------------------------------------------------- 1 | // 2 | // YRKSpinningProgressIndicator.h 3 | // 4 | // Copyright 2009 Kelan Champagne. All rights reserved. 5 | // 6 | 7 | @import Cocoa; 8 | 9 | 10 | @interface YRKSpinningProgressIndicator : NSView 11 | 12 | @property (nonatomic, copy) NSColor *color; 13 | @property (nonatomic, copy) NSColor *backgroundColor; 14 | @property (nonatomic, assign) BOOL drawsBackground; 15 | 16 | @property (nonatomic, assign, getter=isDisplayedWhenStopped) BOOL displayedWhenStopped; 17 | @property (nonatomic, assign) BOOL usesThreadedAnimation; 18 | 19 | @property (nonatomic, assign, getter=isIndeterminate) BOOL indeterminate; 20 | @property (nonatomic, assign) CGFloat currentValue; 21 | @property (nonatomic, assign) CGFloat maxValue; 22 | 23 | - (void)stopAnimation:(id)sender; 24 | - (void)startAnimation:(id)sender; 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /Classes/YRKSpinningProgressIndicator.m: -------------------------------------------------------------------------------- 1 | // 2 | // YRKSpinningProgressIndicator.m 3 | // 4 | // Copyright 2009 Kelan Champagne. All rights reserved. 5 | // 6 | 7 | #import "YRKSpinningProgressIndicator.h" 8 | 9 | // Some constants to control the animation 10 | const CGFloat kAlphaWhenStopped = 0.15; 11 | const CGFloat kFadeMultiplier = 0.85l; 12 | const NSUInteger kNumberOfFins = 12; 13 | const NSTimeInterval kFadeOutTime = 0.7; // seconds 14 | 15 | @interface YRKSpinningProgressIndicator () 16 | @end 17 | 18 | 19 | @implementation YRKSpinningProgressIndicator { 20 | int _currentPosition; 21 | NSMutableArray *_finColors; 22 | 23 | BOOL _isAnimating; 24 | NSTimer *_animationTimer; 25 | NSThread *_animationThread; 26 | BOOL _isFadingOut; 27 | NSDate *_fadeOutStartTime; 28 | } 29 | 30 | #pragma mark - Init 31 | 32 | - (instancetype)initWithFrame:(NSRect)frame 33 | { 34 | self = [super initWithFrame:frame]; 35 | if (self) { 36 | _currentPosition = 0; 37 | _finColors = [[NSMutableArray alloc] initWithCapacity:kNumberOfFins]; 38 | 39 | _isAnimating = NO; 40 | _isFadingOut = NO; 41 | 42 | // user setter, to generate all fin colors 43 | self.color = [NSColor blackColor]; 44 | _backgroundColor = [NSColor clearColor]; 45 | _drawsBackground = NO; 46 | 47 | _displayedWhenStopped = YES; 48 | _usesThreadedAnimation = YES; 49 | 50 | _indeterminate = YES; 51 | _currentValue = 0.0; 52 | _maxValue = 100.0; 53 | } 54 | return self; 55 | } 56 | 57 | 58 | #pragma mark - NSView overrides 59 | 60 | - (void)viewDidMoveToWindow 61 | { 62 | [super viewDidMoveToWindow]; 63 | 64 | if ([self window] == nil) { 65 | // No window? View hierarchy may be going away. Dispose timer to clear circular retain of timer to self to timer. 66 | [self actuallyStopAnimation]; 67 | } 68 | else if (_isAnimating) { 69 | [self actuallyStartAnimation]; 70 | } 71 | } 72 | 73 | - (void)drawRect:(NSRect)rect 74 | { 75 | const CGSize size = self.bounds.size; 76 | const CGFloat length = MIN(size.height, size.width); 77 | 78 | // fill the background, if set 79 | if (_drawsBackground) { 80 | [_backgroundColor set]; 81 | [NSBezierPath fillRect:[self bounds]]; 82 | } 83 | 84 | CGContextRef ctx = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort]; 85 | 86 | // Move the CTM so 0,0 is at the center of our bounds 87 | CGContextTranslateCTM(ctx, size.width/2, size.height/2); 88 | 89 | if (_indeterminate) { 90 | NSBezierPath *path = [[NSBezierPath alloc] init]; 91 | // magic constants determined empirically, to make it look like the NS version. 92 | const CGFloat lineWidth = 0.0859375 * length; // should be 2.75 for 32x32 93 | const CGFloat lineStart = 0.234375 * length; // should be 7.5 for 32x32 94 | const CGFloat lineEnd = 0.421875 * length; // should be 13.5 for 32x32 95 | [path setLineWidth:lineWidth]; 96 | [path setLineCapStyle:NSRoundLineCapStyle]; 97 | [path moveToPoint:NSMakePoint(0, lineStart)]; 98 | [path lineToPoint:NSMakePoint(0, lineEnd)]; 99 | 100 | // Draw all the fins by rotating the CTM, then just redraw the same path again. 101 | for (NSUInteger i = 0; i < kNumberOfFins; i++) { 102 | NSColor *c = _isAnimating ? _finColors[i] : [_color colorWithAlphaComponent:kAlphaWhenStopped]; 103 | [c set]; 104 | [path stroke]; 105 | 106 | CGContextRotateCTM(ctx, 2 * M_PI/kNumberOfFins); 107 | } 108 | } 109 | else { 110 | CGFloat lineWidth = 1 + (0.01 * length); 111 | CGFloat circleRadius = (length - lineWidth) / 2.1; 112 | NSPoint circleCenter = NSMakePoint(0, 0); 113 | [_color set]; 114 | NSBezierPath *path = [[NSBezierPath alloc] init]; 115 | [path setLineWidth:lineWidth]; 116 | [path appendBezierPathWithOvalInRect:NSMakeRect(-circleRadius, 117 | -circleRadius, 118 | circleRadius * 2, 119 | circleRadius * 2)]; 120 | [path stroke]; 121 | path = [[NSBezierPath alloc] init]; 122 | [path appendBezierPathWithArcWithCenter:circleCenter radius:circleRadius startAngle:90 endAngle:90-(360*(_currentValue/_maxValue)) clockwise:YES]; 123 | [path lineToPoint:circleCenter] ; 124 | [path fill]; 125 | } 126 | } 127 | 128 | 129 | #pragma mark - NSProgressIndicator API 130 | 131 | - (void)startAnimation:(id)sender 132 | { 133 | if (!_indeterminate || (_isAnimating && !_isFadingOut)) { 134 | return; 135 | } 136 | 137 | [self actuallyStartAnimation]; 138 | } 139 | 140 | - (void)stopAnimation:(id)sender 141 | { 142 | // animate to stopped state 143 | _isFadingOut = YES; 144 | _fadeOutStartTime = [NSDate date]; 145 | } 146 | 147 | /// Only the spinning style is implemented 148 | - (void)setStyle:(NSProgressIndicatorStyle)style 149 | { 150 | if (NSProgressIndicatorSpinningStyle != style) { 151 | NSAssert(NO, @"Non-spinning styles not available."); 152 | } 153 | } 154 | 155 | 156 | #pragma mark - Custom Accessors 157 | 158 | - (void)setColor:(NSColor *)value 159 | { 160 | if (_color != value) { 161 | _color = [value copy]; 162 | 163 | // Set all the fin colors, with their current alpha components. 164 | for (NSUInteger i = 0; i < kNumberOfFins; i++) { 165 | CGFloat alpha = [self alphaValueForPosition:i]; 166 | _finColors[i] = [_color colorWithAlphaComponent:alpha]; 167 | } 168 | 169 | [self setNeedsDisplay:YES]; 170 | } 171 | } 172 | 173 | - (void)setBackgroundColor:(NSColor *)value 174 | { 175 | if (_backgroundColor != value) { 176 | _backgroundColor = [value copy]; 177 | [self setNeedsDisplay:YES]; 178 | } 179 | } 180 | 181 | - (void)setDrawsBackground:(BOOL)value 182 | { 183 | if (_drawsBackground != value) { 184 | _drawsBackground = value; 185 | } 186 | [self setNeedsDisplay:YES]; 187 | } 188 | 189 | - (void)setIsIndeterminate:(BOOL)isIndeterminate 190 | { 191 | _indeterminate = isIndeterminate; 192 | if (!_indeterminate && _isAnimating) { 193 | [self stopAnimation:self]; 194 | } 195 | [self setNeedsDisplay:YES]; 196 | } 197 | 198 | - (void)setCurrentValue:(CGFloat)currentValue 199 | { 200 | // Automatically put it into determinate mode if it's not already. 201 | if (_indeterminate) { 202 | self.indeterminate = NO; 203 | } 204 | _currentValue = currentValue; 205 | [self setNeedsDisplay:YES]; 206 | } 207 | 208 | - (void)setMaxValue:(CGFloat)maxValue 209 | { 210 | _maxValue = maxValue; 211 | [self setNeedsDisplay:YES]; 212 | } 213 | 214 | - (void)setUsesThreadedAnimation:(BOOL)useThreaded 215 | { 216 | if (_usesThreadedAnimation != useThreaded) { 217 | _usesThreadedAnimation = useThreaded; 218 | 219 | if (_isAnimating) { 220 | // restart the timer to use the new mode 221 | [self stopAnimation:self]; 222 | [self startAnimation:self]; 223 | } 224 | } 225 | } 226 | 227 | - (void)setDisplayedWhenStopped:(BOOL)displayedWhenStopped 228 | { 229 | _displayedWhenStopped = displayedWhenStopped; 230 | 231 | // Show/hide ourself if necessary 232 | if (!_isAnimating) { 233 | self.hidden = !_displayedWhenStopped; 234 | } 235 | } 236 | 237 | 238 | #pragma mark - Private 239 | 240 | - (void)updateFrameFromTimer:(NSTimer *)timer 241 | { 242 | // update the colors 243 | const CGFloat minAlpha = _displayedWhenStopped ? kAlphaWhenStopped : 0.0; 244 | for (NSUInteger i = 0; i < kNumberOfFins; i++) { 245 | CGFloat newAlpha = MAX([self alphaValueForPosition:i], minAlpha); 246 | _finColors[i] = [_color colorWithAlphaComponent:newAlpha]; 247 | } 248 | 249 | if (_isFadingOut) { 250 | // check if the fadeout is done 251 | if ([_fadeOutStartTime timeIntervalSinceNow] < -kFadeOutTime) { 252 | [self actuallyStopAnimation]; 253 | } 254 | } 255 | 256 | if (_usesThreadedAnimation) { 257 | // draw now instead of waiting for setNeedsDisplay (that's the whole reason 258 | // we're animating from background thread) 259 | [self display]; 260 | } 261 | else { 262 | [self setNeedsDisplay:YES]; 263 | } 264 | 265 | // update the currentPosition for next time, unless fading out 266 | if (!_isFadingOut) { 267 | _currentPosition = (_currentPosition + 1) % kNumberOfFins; 268 | } 269 | } 270 | 271 | /// Returns the alpha value for the given position. 272 | /// Each fin should fade exponentially over _numberOfFins frames of animation. 273 | /// @param position is [0,kNumberOfFins) 274 | - (CGFloat)alphaValueForPosition:(NSUInteger)position 275 | { 276 | CGFloat normalValue = pow(kFadeMultiplier, (position + _currentPosition) % kNumberOfFins); 277 | if (_isFadingOut) { 278 | NSTimeInterval timeSinceStop = -[_fadeOutStartTime timeIntervalSinceNow]; 279 | normalValue *= kFadeOutTime - timeSinceStop; 280 | } 281 | return normalValue; 282 | } 283 | 284 | - (void)actuallyStartAnimation 285 | { 286 | // Just to be safe kill any existing timer. 287 | [self actuallyStopAnimation]; 288 | 289 | _isAnimating = YES; 290 | _isFadingOut = NO; 291 | 292 | // always start from the top 293 | _currentPosition = 0; 294 | 295 | if (!_displayedWhenStopped) { 296 | [self setHidden:NO]; 297 | } 298 | 299 | if ([self window]) { 300 | // Why animate if not visible? viewDidMoveToWindow will re-call this method when needed. 301 | if (_usesThreadedAnimation) { 302 | _animationThread = [[NSThread alloc] initWithTarget:self selector:@selector(animateInBackgroundThread) object:nil]; 303 | [_animationThread start]; 304 | } 305 | else { 306 | _animationTimer = [NSTimer timerWithTimeInterval:(NSTimeInterval)0.05 307 | target:self 308 | selector:@selector(updateFrameFromTimer:) 309 | userInfo:nil 310 | repeats:YES]; 311 | 312 | [[NSRunLoop currentRunLoop] addTimer:_animationTimer forMode:NSRunLoopCommonModes]; 313 | [[NSRunLoop currentRunLoop] addTimer:_animationTimer forMode:NSDefaultRunLoopMode]; 314 | [[NSRunLoop currentRunLoop] addTimer:_animationTimer forMode:NSEventTrackingRunLoopMode]; 315 | } 316 | } 317 | } 318 | 319 | - (void)actuallyStopAnimation 320 | { 321 | _isAnimating = NO; 322 | _isFadingOut = NO; 323 | 324 | if (!_displayedWhenStopped) { 325 | [self setHidden:YES]; 326 | } 327 | 328 | if (_animationThread) { 329 | // we were using threaded animation 330 | [_animationThread cancel]; 331 | if (![_animationThread isFinished]) { 332 | [[NSRunLoop currentRunLoop] runMode:NSModalPanelRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.05]]; 333 | } 334 | _animationThread = nil; 335 | } 336 | else if (_animationTimer) { 337 | // we were using timer-based animation 338 | [_animationTimer invalidate]; 339 | _animationTimer = nil; 340 | } 341 | [self setNeedsDisplay:YES]; 342 | } 343 | 344 | - (void)animateInBackgroundThread 345 | { 346 | @autoreleasepool { 347 | // Set up the animation speed to subtly change with size > 32. 348 | // int animationDelay = 38000 + (2000 * ([self bounds].size.height / 32)); 349 | 350 | // Set the rev per minute here 351 | int omega = 100; // RPM 352 | int animationDelay = 60*1000000/omega/kNumberOfFins; 353 | int poolFlushCounter = 0; 354 | 355 | do { 356 | [self updateFrameFromTimer:nil]; 357 | usleep(animationDelay); 358 | poolFlushCounter++; 359 | if (poolFlushCounter > 256) { 360 | poolFlushCounter = 0; 361 | } 362 | } while (![[NSThread currentThread] isCancelled]); 363 | } 364 | } 365 | 366 | @end 367 | -------------------------------------------------------------------------------- /Demo/Classes/SPIDAppController.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPIDAppController.h 3 | // 4 | // Copyright 2009 Kelan Champagne. All rights reserved. 5 | // 6 | 7 | @import Cocoa; 8 | 9 | @interface SPIDAppController : NSObject 10 | @end 11 | -------------------------------------------------------------------------------- /Demo/Classes/SPIDAppController.m: -------------------------------------------------------------------------------- 1 | // 2 | // SPIDAppController.m 3 | // 4 | // Copyright 2009 Kelan Champagne. All rights reserved. 5 | // 6 | 7 | #import "SPIDAppController.h" 8 | 9 | #import "YRKSpinningProgressIndicator.h" 10 | 11 | 12 | @interface SPIDAppController () 13 | @property (nonatomic) IBOutlet NSProgressIndicator *progressIndicator; 14 | @property (nonatomic) IBOutlet YRKSpinningProgressIndicator *turboFan; 15 | @property (nonatomic) IBOutlet NSButton *nspiToggleButton; 16 | @property (nonatomic) IBOutlet NSButton *yrkpiToggleButton; 17 | @property (nonatomic) IBOutlet NSButton *threadedAnimationButton; 18 | @property (nonatomic) IBOutlet NSButton *displayWhenStoppedButton; 19 | @property (nonatomic) IBOutlet NSColorWell *foregroundColorWell; 20 | @property (nonatomic) IBOutlet NSColorWell *backgroundColorWell; 21 | @property (nonatomic) IBOutlet NSButton *determinateDemoButton; 22 | @end 23 | 24 | 25 | @implementation SPIDAppController { 26 | BOOL _yrkpiIsRunning; 27 | BOOL _nspiIsRunning; 28 | } 29 | 30 | 31 | #pragma mark - NSApplicationDelegate 32 | 33 | - (void)applicationDidFinishLaunching:(NSNotification *)notification 34 | { 35 | _foregroundColorWell.color = [NSColor colorWithDeviceRed:0.2 green:0.2 blue:0.2 alpha:1.0]; 36 | _backgroundColorWell.color = [NSColor whiteColor]; 37 | [self changeForegroundColor:_foregroundColorWell]; 38 | [self changeBackgroundColor:_backgroundColorWell]; 39 | 40 | _turboFan.drawsBackground = NO; 41 | 42 | [self takeThreadedFrom:_threadedAnimationButton]; 43 | } 44 | 45 | 46 | #pragma mark - IBActions 47 | 48 | - (IBAction)toggleProgressIndicator:(id)sender 49 | { 50 | if (_nspiIsRunning) { 51 | [_progressIndicator stopAnimation:self]; 52 | _nspiToggleButton.title = @"Start"; 53 | _nspiIsRunning = NO; 54 | } 55 | else { 56 | [_progressIndicator startAnimation:self]; 57 | _nspiToggleButton.title = @"Stop"; 58 | _nspiIsRunning = YES; 59 | } 60 | } 61 | 62 | - (IBAction)toggleTurboFan:(id)sender 63 | { 64 | if (_yrkpiIsRunning) { 65 | [_turboFan stopAnimation:self]; 66 | _yrkpiToggleButton.title = @"Start"; 67 | _yrkpiIsRunning = NO; 68 | } 69 | else { 70 | [_turboFan startAnimation:self]; 71 | _yrkpiToggleButton.title = @"Stop"; 72 | _yrkpiIsRunning = YES; 73 | } 74 | } 75 | 76 | - (IBAction)startDeterminateDemo:(NSButton *)sender 77 | { 78 | [_determinateDemoButton setEnabled:NO]; 79 | 80 | _turboFan.indeterminate = NO; 81 | _turboFan.currentValue = 0.0; 82 | 83 | [NSThread detachNewThreadSelector:@selector(runDeterminateDemoInBackgroundThread) toTarget:self withObject:nil]; 84 | } 85 | 86 | - (void)runDeterminateDemoInBackgroundThread 87 | { 88 | @autoreleasepool { 89 | for (CGFloat value = 0.0; value <= 100.0; value += 0.5) { 90 | usleep(20000); 91 | _turboFan.currentValue = value; 92 | } 93 | } 94 | 95 | dispatch_async(dispatch_get_main_queue(), ^{ 96 | [_turboFan setIndeterminate:YES]; 97 | if (_yrkpiIsRunning) { 98 | [_turboFan startAnimation:self]; 99 | } 100 | 101 | [_determinateDemoButton setEnabled:YES]; 102 | }); 103 | } 104 | 105 | - (IBAction)changeForegroundColor:(NSColorWell *)sender 106 | { 107 | _turboFan.color = [sender color]; 108 | } 109 | 110 | 111 | - (IBAction)changeBackgroundColor:(NSColorWell *)sender 112 | { 113 | _turboFan.backgroundColor = [sender color]; 114 | } 115 | 116 | 117 | - (IBAction)toggleDrawBackground:(NSButton *)sender 118 | { 119 | _turboFan.drawsBackground = ([sender state] == NSOnState); 120 | } 121 | 122 | - (IBAction)toggleDisplayWhenStopped:(NSButton *)sender 123 | { 124 | _turboFan.displayedWhenStopped = ([sender state] == NSOnState); 125 | } 126 | 127 | - (IBAction)takeThreadedFrom:(NSButton *)sender 128 | { 129 | BOOL useThreaded = [sender intValue]; 130 | _turboFan.usesThreadedAnimation = useThreaded; 131 | _progressIndicator.usesThreadedAnimation = useThreaded; 132 | } 133 | 134 | @end 135 | -------------------------------------------------------------------------------- /Demo/Classes/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // 4 | // Copyright 2009 Kelan Champagne. All rights reserved. 5 | // 6 | 7 | @import Cocoa; 8 | 9 | int main(int argc, char *argv[]) 10 | { 11 | return NSApplicationMain(argc, (const char **) argv); 12 | } 13 | -------------------------------------------------------------------------------- /Demo/Configs/debug.xcconfig: -------------------------------------------------------------------------------- 1 | // debug.xcconfig 2 | // 3 | // This is mostly based on the Release config, but we override some settings 4 | 5 | #include "release.xcconfig" 6 | 7 | 8 | // Architectures 9 | ARCHS = $(NATIVE_ARCH_ACTUAL) 10 | ONLY_ACTIVE_ARCH = YES 11 | 12 | // Code Generation 13 | GCC_DYNAMIC_NO_PIC = NO 14 | GCC_GENERATE_DEBUGGING_SYMBOLS = YES 15 | GCC_OPTIMIZATION_LEVEL = 0 16 | 17 | 18 | // Deployment 19 | COPY_PHASE_STRIP = NO 20 | STRIP_INSTALLED_PRODUCT = NO 21 | STRIP_STYLE = all 22 | 23 | 24 | // Linking 25 | DEAD_CODE_STRIPPING = NO 26 | 27 | -------------------------------------------------------------------------------- /Demo/Configs/release.xcconfig: -------------------------------------------------------------------------------- 1 | // release.xcconfig 2 | // 3 | // The strategy for build Config settings is to put all the general settings in 4 | // this file. Then the other .xcconfig files can override settings as necessary. 5 | // 6 | // The only settings that should be done in the Xcode UI (at the Target level) are: 7 | // * Info.plist 8 | // * Product Name 9 | // There shouldn't be anything set at the Project level in the Xcode UI. 10 | // 11 | // 12 | // Release: 13 | // * This makes a full build, and is optimized for release. 14 | // 15 | // Debug: 16 | // * This is a full build, that should run on all machines, but has all debug info in it. 17 | // 18 | 19 | 20 | // Architectures 21 | ARCHS = $(ARCHS_STANDARD) 22 | SDKROOT = macosx // latest Mac OS 23 | ONLY_ACTIVE_ARCH = NO 24 | 25 | 26 | // Build Options 27 | DEBUG_INFORMATION_FORMAT = dwarf-with-dsym 28 | 29 | 30 | // Compiler Version 31 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0 32 | 33 | 34 | // Code Generation 35 | GCC_DYNAMIC_NO_PIC = YES 36 | GCC_ENABLE_FIX_AND_CONTINUE = NO 37 | GCC_GENERATE_DEBUGGING_SYMBOLS = NO 38 | GCC_OPTIMIZATION_LEVEL = s 39 | GCC_SYMBOLS_PRIVATE_EXTERN = YES // "Symbols Hidden by Default" in the GUI 40 | LLVM_LTO = NO 41 | 42 | 43 | // Deployment 44 | COPY_PHASE_STRIP = YES 45 | MACOSX_DEPLOYMENT_TARGET = 10.5 46 | STRIP_INSTALLED_PRODUCT = YES 47 | 48 | 49 | // Language 50 | CLANG_ENABLE_OBJC_ARC = YES 51 | GCC_C_LANGUAGE_STANDARD = gnu99 52 | GCC_PRECOMPILE_PREFIX_HEADER = YES 53 | OTHER_CPLUSPLUSFLAGS = $(OTHER_CFLAGS) 54 | 55 | 56 | // Modules 57 | CLANG_ENABLE_MODULES = YES 58 | CLANG_MODULES_AUTOLINK = YES 59 | 60 | 61 | // Preprocessing 62 | GCC_PREPROCESSOR_DEFINITIONS = NS_BLOCK_ASSERTIONS 63 | ENABLE_STRICT_OBJC_MSGSEND = YES 64 | 65 | 66 | // Linking 67 | OTHER_LDFLAGS = -ObjC 68 | DEAD_CODE_STRIPPING = YES 69 | STRIP_STYLE = all 70 | 71 | 72 | // Search Paths 73 | ALWAYS_SEARCH_USER_PATHS = NO 74 | 75 | 76 | // Warnings 77 | GCC_TREAT_WARNINGS_AS_ERRORS = YES 78 | // We have to add -Wno-unused-parameter here, because this flag gets added 79 | // after the specific GCC_WARN_* warnings below, so the -Wall overrides 80 | // any GCC_WARN_UNUSED_PARAMETER value. 81 | WARNING_CFLAGS = -Wall -Wextra -Wno-unused-parameter 82 | 83 | // Some advice from: http://boredzo.org/blog/archives/2009-11-07/warnings 84 | CLANG_WARN_BOOL_CONVERSION = YES 85 | CLANG_WARN_CONSTANT_CONVERSION = YES 86 | CLANG_WARN_EMPTY_BODY = YES 87 | CLANG_WARN_ENUM_CONVERSION = YES 88 | CLANG_WARN_INT_CONVERSION = YES 89 | CLANG_WARN_UNREACHABLE_CODE = YES 90 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES 91 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES 92 | GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES 93 | GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES 94 | GCC_WARN_ABOUT_MISSING_NEWLINE = YES 95 | GCC_WARN_ABOUT_RETURN_TYPE = YES 96 | GCC_WARN_CHECK_SWITCH_STATEMENTS = YES 97 | GCC_WARN_HIDDEN_VIRTUAL_FUNCTIONS = YES 98 | GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES 99 | GCC_WARN_MISSING_PARENTHESES = YES 100 | GCC_WARN_NON_VIRTUAL_DESTRUCTOR = YES 101 | GCC_WARN_SHADOW = YES 102 | GCC_WARN_SIGN_COMPARE = YES 103 | GCC_WARN_TYPECHECK_CALLS_TO_PRINTF = YES 104 | GCC_WARN_UNDECLARED_SELECTOR = YES 105 | GCC_WARN_UNINITIALIZED_AUTOS = YES 106 | GCC_WARN_UNUSED_FUNCTION = YES 107 | GCC_WARN_UNUSED_LABEL = YES 108 | GCC_WARN_UNUSED_PARAMETER = NO 109 | GCC_WARN_UNUSED_VALUE = YES 110 | GCC_WARN_UNUSED_VARIABLE = YES 111 | 112 | 113 | -------------------------------------------------------------------------------- /Demo/Resources/English.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kelan/YRKSpinningProgressIndicator/526f0c1e2fada34b51b527e427b1e03662a7a73f/Demo/Resources/English.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Demo/Resources/English.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1070 5 | 14B25 6 | 6254 7 | 1343.16 8 | 755.00 9 | 10 | com.apple.InterfaceBuilder.CocoaPlugin 11 | 6254 12 | 13 | 14 | NSBox 15 | NSButton 16 | NSButtonCell 17 | NSColorWell 18 | NSCustomObject 19 | NSCustomView 20 | NSMenu 21 | NSMenuItem 22 | NSProgressIndicator 23 | NSTextField 24 | NSTextFieldCell 25 | NSView 26 | NSWindowTemplate 27 | 28 | 29 | com.apple.InterfaceBuilder.CocoaPlugin 30 | 31 | 32 | PluginDependencyRecalculationVersion 33 | 34 | 35 | 36 | 37 | NSApplication 38 | 39 | 40 | FirstResponder 41 | 42 | 43 | NSApplication 44 | 45 | 46 | 15 47 | 2 48 | {{145, 763}, {389, 156}} 49 | 1881669632 50 | Window 51 | NSWindow 52 | 53 | View 54 | 55 | 56 | {389, 174} 57 | 58 | 59 | 256 60 | 61 | 62 | 63 | 274 64 | {{131, 86}, {32, 32}} 65 | 66 | 67 | 68 | YRKSpinningProgressIndicator 69 | NSView 70 | 71 | 72 | 73 | 292 74 | {{112, 30}, {70, 32}} 75 | 76 | 77 | 78 | YES 79 | 80 | 67108864 81 | 134217728 82 | Start 83 | 84 | YES 85 | 13 86 | 1044 87 | 88 | 89 | -2038284288 90 | 1 91 | 92 | 93 | 94 | 95 | 96 | 200 97 | 25 98 | 99 | NO 100 | 101 | 102 | 103 | 256 104 | {{14, 30}, {86, 32}} 105 | 106 | 107 | 108 | YES 109 | 110 | 67108864 111 | 134217728 112 | Start 113 | 114 | 115 | -2038284288 116 | 1 117 | 118 | 119 | 120 | 121 | 122 | 200 123 | 25 124 | 125 | NO 126 | 127 | 128 | 129 | 1324 130 | {{40, 86}, {32, 32}} 131 | 132 | 133 | 134 | 20490 135 | 100 136 | 137 | 138 | 139 | 265 140 | 141 | 142 | NSColor pasteboard type 143 | 144 | 145 | {{195, 122}, {52, 24}} 146 | 147 | 148 | 149 | YES 150 | NO 151 | YES 152 | 153 | 1 154 | MC4wNTgxMzA0OTkgMC4wNTU1NDE4OTkgMQA 155 | 156 | 157 | 158 | 159 | 265 160 | 161 | 162 | NSColor pasteboard type 163 | 164 | 165 | {{195, 94}, {52, 24}} 166 | 167 | 168 | 169 | YES 170 | NO 171 | YES 172 | 173 | 1 174 | MC4wNTgxMzA0OTkgMC4wNTU1NDE4OTkgMQA 175 | 176 | 177 | 178 | 179 | 265 180 | {{252, 126}, {82, 17}} 181 | 182 | 183 | 184 | YES 185 | 186 | 67108864 187 | 272629760 188 | Foreground 189 | 190 | 191 | 192 | 6 193 | System 194 | controlColor 195 | 196 | 3 197 | MC42NjY2NjY2NjY3AA 198 | 199 | 200 | 201 | 6 202 | System 203 | controlTextColor 204 | 205 | 3 206 | MAA 207 | 208 | 209 | 210 | NO 211 | 1 212 | 213 | 214 | 215 | 265 216 | {{253, 97}, {101, 18}} 217 | 218 | 219 | 220 | YES 221 | 222 | 67108864 223 | 0 224 | Background 225 | 226 | 227 | 1211912448 228 | 2 229 | 230 | NSSwitch 231 | 232 | 233 | 234 | 200 235 | 25 236 | 237 | NO 238 | 239 | 240 | 241 | 265 242 | {{190, 12}, {159, 32}} 243 | 244 | 245 | YES 246 | 247 | 67108864 248 | 134217728 249 | Determinate Demo 250 | 251 | 252 | -2038284288 253 | 1 254 | 255 | 256 | 257 | 258 | 259 | 200 260 | 25 261 | 262 | NO 263 | 264 | 265 | 266 | 265 267 | {{193, 70}, {178, 18}} 268 | 269 | 270 | 271 | YES 272 | 273 | -2080374784 274 | 0 275 | Use threaded animation 276 | 277 | 278 | 1211912448 279 | 2 280 | 281 | 282 | 283 | 200 284 | 25 285 | 286 | NO 287 | 288 | 289 | 290 | 20 291 | {{100, 38}, {5, 106}} 292 | 293 | 294 | 295 | {0, 0} 296 | 297 | 67108864 298 | 0 299 | Box 300 | 301 | 302 | 6 303 | System 304 | textBackgroundColor 305 | 306 | 3 307 | MQA 308 | 309 | 310 | 311 | 6 312 | System 313 | labelColor 314 | 315 | 316 | 317 | 3 318 | 2 319 | 0 320 | NO 321 | 322 | 323 | 324 | 265 325 | {{194, 48}, {177, 18}} 326 | 327 | 328 | 329 | YES 330 | 331 | -2080374784 332 | 0 333 | Displayed when stopped 334 | 335 | 336 | 1211912448 337 | 2 338 | 339 | 340 | 341 | 200 342 | 25 343 | 344 | NO 345 | 346 | 347 | 348 | 268 349 | {{10, 129}, {65, 17}} 350 | 351 | 352 | 353 | YES 354 | 355 | 68157504 356 | 272630784 357 | Standard: 358 | 359 | 360 | 361 | 362 | 363 | NO 364 | 1 365 | 366 | 367 | 368 | 268 369 | {{114, 129}, {47, 17}} 370 | 371 | 372 | 373 | YES 374 | 375 | 68157504 376 | 272630784 377 | YRK: 378 | 379 | 380 | 381 | 382 | 383 | NO 384 | 1 385 | 386 | 387 | {389, 156} 388 | 389 | 390 | 391 | 392 | {{0, 0}, {1680, 1028}} 393 | {389, 196} 394 | {10000000000000, 10000000000000} 395 | YES 396 | 397 | 398 | MainMenu 399 | 400 | 401 | 402 | NewApplication 403 | 404 | 1048576 405 | 2147483647 406 | 407 | NSImage 408 | NSMenuCheckmark 409 | 410 | 411 | NSImage 412 | NSMenuMixedState 413 | 414 | submenuAction: 415 | 416 | 417 | NewApplication 418 | 419 | 420 | 421 | About NewApplication 422 | 423 | 2147483647 424 | 425 | 426 | 427 | 428 | 429 | YES 430 | YES 431 | 432 | 433 | 1048576 434 | 2147483647 435 | 436 | 437 | 438 | 439 | 440 | Preferences… 441 | , 442 | 1048576 443 | 2147483647 444 | 445 | 446 | 447 | 448 | 449 | YES 450 | YES 451 | 452 | 453 | 1048576 454 | 2147483647 455 | 456 | 457 | 458 | 459 | 460 | Services 461 | 462 | 1048576 463 | 2147483647 464 | 465 | 466 | submenuAction: 467 | 468 | 469 | 470 | Services 471 | 472 | 473 | _NSServicesMenu 474 | 475 | 476 | 477 | 478 | YES 479 | YES 480 | 481 | 482 | 1048576 483 | 2147483647 484 | 485 | 486 | 487 | 488 | 489 | Hide NewApplication 490 | h 491 | 1048576 492 | 2147483647 493 | 494 | 495 | 496 | 497 | 498 | Hide Others 499 | h 500 | 1572864 501 | 2147483647 502 | 503 | 504 | 505 | 506 | 507 | Show All 508 | 509 | 1048576 510 | 2147483647 511 | 512 | 513 | 514 | 515 | 516 | YES 517 | YES 518 | 519 | 520 | 1048576 521 | 2147483647 522 | 523 | 524 | 525 | 526 | 527 | Quit NewApplication 528 | q 529 | 1048576 530 | 2147483647 531 | 532 | 533 | 534 | 535 | _NSAppleMenu 536 | 537 | 538 | 539 | 540 | File 541 | 542 | 1048576 543 | 2147483647 544 | 545 | 546 | submenuAction: 547 | 548 | 549 | 550 | File 551 | 552 | 553 | 554 | 555 | New 556 | n 557 | 1048576 558 | 2147483647 559 | 560 | 561 | 562 | 563 | 564 | Open... 565 | o 566 | 1048576 567 | 2147483647 568 | 569 | 570 | 571 | 572 | 573 | Open Recent 574 | 575 | 1048576 576 | 2147483647 577 | 578 | 579 | submenuAction: 580 | 581 | 582 | 583 | Open Recent 584 | 585 | 586 | 587 | 588 | Clear Menu 589 | 590 | 1048576 591 | 2147483647 592 | 593 | 594 | 595 | 596 | _NSRecentDocumentsMenu 597 | 598 | 599 | 600 | 601 | YES 602 | YES 603 | 604 | 605 | 1048576 606 | 2147483647 607 | 608 | 609 | 610 | 611 | 612 | Close 613 | w 614 | 1048576 615 | 2147483647 616 | 617 | 618 | 619 | 620 | 621 | Save 622 | s 623 | 1048576 624 | 2147483647 625 | 626 | 627 | 628 | 629 | 630 | Save As… 631 | S 632 | 1048576 633 | 2147483647 634 | 635 | 636 | 637 | 638 | 639 | Revert 640 | 641 | 2147483647 642 | 643 | 644 | 645 | 646 | 647 | YES 648 | YES 649 | 650 | 651 | 1048576 652 | 2147483647 653 | 654 | 655 | 656 | 657 | 658 | Page Setup… 659 | P 660 | 1048576 661 | 2147483647 662 | 663 | 664 | 665 | 666 | 667 | Print… 668 | p 669 | 1048576 670 | 2147483647 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | Edit 680 | 681 | 1048576 682 | 2147483647 683 | 684 | 685 | submenuAction: 686 | 687 | 688 | 689 | Edit 690 | 691 | 692 | 693 | 694 | Undo 695 | z 696 | 1048576 697 | 2147483647 698 | 699 | 700 | 701 | 702 | 703 | Redo 704 | Z 705 | 1048576 706 | 2147483647 707 | 708 | 709 | 710 | 711 | 712 | YES 713 | YES 714 | 715 | 716 | 1048576 717 | 2147483647 718 | 719 | 720 | 721 | 722 | 723 | Cut 724 | x 725 | 1048576 726 | 2147483647 727 | 728 | 729 | 730 | 731 | 732 | Copy 733 | c 734 | 1048576 735 | 2147483647 736 | 737 | 738 | 739 | 740 | 741 | Paste 742 | v 743 | 1048576 744 | 2147483647 745 | 746 | 747 | 748 | 749 | 750 | Paste and Match Style 751 | V 752 | 1572864 753 | 2147483647 754 | 755 | 756 | 757 | 758 | 759 | Delete 760 | 761 | 1048576 762 | 2147483647 763 | 764 | 765 | 766 | 767 | 768 | Select All 769 | a 770 | 1048576 771 | 2147483647 772 | 773 | 774 | 775 | 776 | 777 | YES 778 | YES 779 | 780 | 781 | 1048576 782 | 2147483647 783 | 784 | 785 | 786 | 787 | 788 | Find 789 | 790 | 1048576 791 | 2147483647 792 | 793 | 794 | submenuAction: 795 | 796 | 797 | 798 | Find 799 | 800 | 801 | 802 | 803 | Find… 804 | f 805 | 1048576 806 | 2147483647 807 | 808 | 809 | 1 810 | 811 | 812 | 813 | Find Next 814 | g 815 | 1048576 816 | 2147483647 817 | 818 | 819 | 2 820 | 821 | 822 | 823 | Find Previous 824 | G 825 | 1048576 826 | 2147483647 827 | 828 | 829 | 3 830 | 831 | 832 | 833 | Use Selection for Find 834 | e 835 | 1048576 836 | 2147483647 837 | 838 | 839 | 7 840 | 841 | 842 | 843 | Jump to Selection 844 | j 845 | 1048576 846 | 2147483647 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 | Spelling 856 | 857 | 1048576 858 | 2147483647 859 | 860 | 861 | submenuAction: 862 | 863 | 864 | Spelling 865 | 866 | 867 | 868 | Spelling… 869 | : 870 | 1048576 871 | 2147483647 872 | 873 | 874 | 875 | 876 | 877 | Check Spelling 878 | ; 879 | 1048576 880 | 2147483647 881 | 882 | 883 | 884 | 885 | 886 | Check Spelling as You Type 887 | 888 | 1048576 889 | 2147483647 890 | 891 | 892 | 893 | 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | Window 902 | 903 | 1048576 904 | 2147483647 905 | 906 | 907 | submenuAction: 908 | 909 | 910 | 911 | Window 912 | 913 | 914 | 915 | 916 | Minimize 917 | m 918 | 1048576 919 | 2147483647 920 | 921 | 922 | 923 | 924 | 925 | Zoom 926 | 927 | 1048576 928 | 2147483647 929 | 930 | 931 | 932 | 933 | 934 | YES 935 | YES 936 | 937 | 938 | 1048576 939 | 2147483647 940 | 941 | 942 | 943 | 944 | 945 | Bring All to Front 946 | 947 | 1048576 948 | 2147483647 949 | 950 | 951 | 952 | 953 | _NSWindowsMenu 954 | 955 | 956 | 957 | 958 | Help 959 | 960 | 1048576 961 | 2147483647 962 | 963 | 964 | submenuAction: 965 | 966 | 967 | Help 968 | 969 | 970 | 971 | NewApplication Help 972 | ? 973 | 1048576 974 | 2147483647 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | _NSMainMenu 983 | 984 | 985 | SPIDAppController 986 | 987 | 988 | 989 | 990 | 991 | 992 | terminate: 993 | 994 | 995 | 996 | 139 997 | 998 | 999 | 1000 | orderFrontStandardAboutPanel: 1001 | 1002 | 1003 | 1004 | 142 1005 | 1006 | 1007 | 1008 | hideOtherApplications: 1009 | 1010 | 1011 | 1012 | 146 1013 | 1014 | 1015 | 1016 | hide: 1017 | 1018 | 1019 | 1020 | 152 1021 | 1022 | 1023 | 1024 | unhideAllApplications: 1025 | 1026 | 1027 | 1028 | 153 1029 | 1030 | 1031 | 1032 | delegate 1033 | 1034 | 1035 | 1036 | 233 1037 | 1038 | 1039 | 1040 | performMiniaturize: 1041 | 1042 | 1043 | 1044 | 37 1045 | 1046 | 1047 | 1048 | arrangeInFront: 1049 | 1050 | 1051 | 1052 | 39 1053 | 1054 | 1055 | 1056 | print: 1057 | 1058 | 1059 | 1060 | 86 1061 | 1062 | 1063 | 1064 | runPageLayout: 1065 | 1066 | 1067 | 1068 | 87 1069 | 1070 | 1071 | 1072 | showHelp: 1073 | 1074 | 1075 | 1076 | 122 1077 | 1078 | 1079 | 1080 | clearRecentDocuments: 1081 | 1082 | 1083 | 1084 | 127 1085 | 1086 | 1087 | 1088 | cut: 1089 | 1090 | 1091 | 1092 | 175 1093 | 1094 | 1095 | 1096 | paste: 1097 | 1098 | 1099 | 1100 | 176 1101 | 1102 | 1103 | 1104 | redo: 1105 | 1106 | 1107 | 1108 | 178 1109 | 1110 | 1111 | 1112 | selectAll: 1113 | 1114 | 1115 | 1116 | 179 1117 | 1118 | 1119 | 1120 | undo: 1121 | 1122 | 1123 | 1124 | 180 1125 | 1126 | 1127 | 1128 | copy: 1129 | 1130 | 1131 | 1132 | 181 1133 | 1134 | 1135 | 1136 | showGuessPanel: 1137 | 1138 | 1139 | 1140 | 188 1141 | 1142 | 1143 | 1144 | checkSpelling: 1145 | 1146 | 1147 | 1148 | 190 1149 | 1150 | 1151 | 1152 | toggleContinuousSpellChecking: 1153 | 1154 | 1155 | 1156 | 192 1157 | 1158 | 1159 | 1160 | performClose: 1161 | 1162 | 1163 | 1164 | 193 1165 | 1166 | 1167 | 1168 | delete: 1169 | 1170 | 1171 | 1172 | 195 1173 | 1174 | 1175 | 1176 | performZoom: 1177 | 1178 | 1179 | 1180 | 198 1181 | 1182 | 1183 | 1184 | performFindPanelAction: 1185 | 1186 | 1187 | 1188 | 199 1189 | 1190 | 1191 | 1192 | performFindPanelAction: 1193 | 1194 | 1195 | 1196 | 200 1197 | 1198 | 1199 | 1200 | performFindPanelAction: 1201 | 1202 | 1203 | 1204 | 201 1205 | 1206 | 1207 | 1208 | performFindPanelAction: 1209 | 1210 | 1211 | 1212 | 202 1213 | 1214 | 1215 | 1216 | centerSelectionInVisibleArea: 1217 | 1218 | 1219 | 1220 | 203 1221 | 1222 | 1223 | 1224 | pasteAsPlainText: 1225 | 1226 | 1227 | 1228 | 205 1229 | 1230 | 1231 | 1232 | initialFirstResponder 1233 | 1234 | 1235 | 1236 | 289 1237 | 1238 | 1239 | 1240 | toggleTurboFan: 1241 | 1242 | 1243 | 1244 | 221 1245 | 1246 | 1247 | 1248 | toggleProgressIndicator: 1249 | 1250 | 1251 | 1252 | 222 1253 | 1254 | 1255 | 1256 | changeForegroundColor: 1257 | 1258 | 1259 | 1260 | 231 1261 | 1262 | 1263 | 1264 | changeBackgroundColor: 1265 | 1266 | 1267 | 1268 | 232 1269 | 1270 | 1271 | 1272 | toggleDrawBackground: 1273 | 1274 | 1275 | 1276 | 235 1277 | 1278 | 1279 | 1280 | takeThreadedFrom: 1281 | 1282 | 1283 | 1284 | 258 1285 | 1286 | 1287 | 1288 | startDeterminateDemo: 1289 | 1290 | 1291 | 1292 | 263 1293 | 1294 | 1295 | 1296 | _progressIndicator 1297 | 1298 | 1299 | 1300 | 264 1301 | 1302 | 1303 | 1304 | _turboFan 1305 | 1306 | 1307 | 1308 | 265 1309 | 1310 | 1311 | 1312 | _nspiToggleButton 1313 | 1314 | 1315 | 1316 | 269 1317 | 1318 | 1319 | 1320 | _yrkpiToggleButton 1321 | 1322 | 1323 | 1324 | 270 1325 | 1326 | 1327 | 1328 | _threadedAnimationButton 1329 | 1330 | 1331 | 1332 | 271 1333 | 1334 | 1335 | 1336 | _foregroundColorWell 1337 | 1338 | 1339 | 1340 | 272 1341 | 1342 | 1343 | 1344 | _backgroundColorWell 1345 | 1346 | 1347 | 1348 | 273 1349 | 1350 | 1351 | 1352 | _determinateDemoButton 1353 | 1354 | 1355 | 1356 | 274 1357 | 1358 | 1359 | 1360 | toggleDisplayWhenStopped: 1361 | 1362 | 1363 | 1364 | 278 1365 | 1366 | 1367 | 1368 | _displayWhenStoppedButton 1369 | 1370 | 1371 | 1372 | 287 1373 | 1374 | 1375 | 1376 | 1377 | 1378 | 0 1379 | 1380 | 1381 | 1382 | 1383 | 1384 | -2 1385 | 1386 | 1387 | File's Owner 1388 | 1389 | 1390 | -1 1391 | 1392 | 1393 | First Responder 1394 | 1395 | 1396 | -3 1397 | 1398 | 1399 | Application 1400 | 1401 | 1402 | 21 1403 | 1404 | 1405 | 1406 | 1407 | 1408 | Window 1409 | 1410 | 1411 | 2 1412 | 1413 | 1414 | 1415 | 1416 | 1417 | 1418 | 1419 | 1420 | 1421 | 1422 | 1423 | 1424 | 1425 | 1426 | 1427 | 1428 | 1429 | 1430 | 1431 | 1432 | 206 1433 | 1434 | 1435 | 1436 | 1437 | 207 1438 | 1439 | 1440 | 1441 | 1442 | 1443 | 1444 | 1445 | 208 1446 | 1447 | 1448 | 1449 | 1450 | 1451 | 1452 | 1453 | 209 1454 | 1455 | 1456 | 1457 | 1458 | 223 1459 | 1460 | 1461 | 1462 | 1463 | 224 1464 | 1465 | 1466 | 1467 | 1468 | 226 1469 | 1470 | 1471 | 1472 | 1473 | 1474 | 1475 | 1476 | 234 1477 | 1478 | 1479 | 1480 | 1481 | 1482 | 1483 | 1484 | 29 1485 | 1486 | 1487 | 1488 | 1489 | 1490 | 1491 | 1492 | 1493 | 1494 | MainMenu 1495 | 1496 | 1497 | 19 1498 | 1499 | 1500 | 1501 | 1502 | 1503 | 1504 | 1505 | 24 1506 | 1507 | 1508 | 1509 | 1510 | 1511 | 1512 | 1513 | 1514 | 1515 | 1516 | 5 1517 | 1518 | 1519 | 1520 | 1521 | 23 1522 | 1523 | 1524 | 1525 | 1526 | 92 1527 | 1528 | 1529 | 1530 | 1531 | 197 1532 | 1533 | 1534 | 1535 | 1536 | 56 1537 | 1538 | 1539 | 1540 | 1541 | 1542 | 1543 | 1544 | 57 1545 | 1546 | 1547 | 1548 | 1549 | 1550 | 1551 | 1552 | 1553 | 1554 | 1555 | 1556 | 1557 | 1558 | 1559 | 1560 | 1561 | 1562 | 58 1563 | 1564 | 1565 | 1566 | 1567 | 129 1568 | 1569 | 1570 | 1571 | 1572 | 131 1573 | 1574 | 1575 | 1576 | 1577 | 1578 | 1579 | 1580 | 130 1581 | 1582 | 1583 | 1584 | 1585 | 134 1586 | 1587 | 1588 | 1589 | 1590 | 136 1591 | 1592 | 1593 | 1594 | 1595 | 143 1596 | 1597 | 1598 | 1599 | 1600 | 144 1601 | 1602 | 1603 | 1604 | 1605 | 145 1606 | 1607 | 1608 | 1609 | 1610 | 149 1611 | 1612 | 1613 | 1614 | 1615 | 150 1616 | 1617 | 1618 | 1619 | 1620 | 196 1621 | 1622 | 1623 | 1624 | 1625 | 83 1626 | 1627 | 1628 | 1629 | 1630 | 1631 | 1632 | 1633 | 81 1634 | 1635 | 1636 | 1637 | 1638 | 1639 | 1640 | 1641 | 1642 | 1643 | 1644 | 1645 | 1646 | 1647 | 1648 | 1649 | 1650 | 1651 | 72 1652 | 1653 | 1654 | 1655 | 1656 | 73 1657 | 1658 | 1659 | 1660 | 1661 | 74 1662 | 1663 | 1664 | 1665 | 1666 | 75 1667 | 1668 | 1669 | 1670 | 1671 | 77 1672 | 1673 | 1674 | 1675 | 1676 | 78 1677 | 1678 | 1679 | 1680 | 1681 | 79 1682 | 1683 | 1684 | 1685 | 1686 | 80 1687 | 1688 | 1689 | 1690 | 1691 | 82 1692 | 1693 | 1694 | 1695 | 1696 | 112 1697 | 1698 | 1699 | 1700 | 1701 | 124 1702 | 1703 | 1704 | 1705 | 1706 | 1707 | 1708 | 1709 | 125 1710 | 1711 | 1712 | 1713 | 1714 | 1715 | 1716 | 1717 | 126 1718 | 1719 | 1720 | 1721 | 1722 | 103 1723 | 1724 | 1725 | 1726 | 1727 | 1728 | 1729 | 1730 | 106 1731 | 1732 | 1733 | 1734 | 1735 | 1736 | 1737 | 1738 | 111 1739 | 1740 | 1741 | 1742 | 1743 | 163 1744 | 1745 | 1746 | 1747 | 1748 | 1749 | 1750 | 1751 | 169 1752 | 1753 | 1754 | 1755 | 1756 | 1757 | 1758 | 1759 | 1760 | 1761 | 1762 | 1763 | 1764 | 1765 | 1766 | 1767 | 1768 | 1769 | 1770 | 156 1771 | 1772 | 1773 | 1774 | 1775 | 157 1776 | 1777 | 1778 | 1779 | 1780 | 158 1781 | 1782 | 1783 | 1784 | 1785 | 160 1786 | 1787 | 1788 | 1789 | 1790 | 164 1791 | 1792 | 1793 | 1794 | 1795 | 168 1796 | 1797 | 1798 | 1799 | 1800 | 1801 | 1802 | 1803 | 159 1804 | 1805 | 1806 | 1807 | 1808 | 1809 | 1810 | 1811 | 1812 | 1813 | 1814 | 1815 | 154 1816 | 1817 | 1818 | 1819 | 1820 | 155 1821 | 1822 | 1823 | 1824 | 1825 | 161 1826 | 1827 | 1828 | 1829 | 1830 | 162 1831 | 1832 | 1833 | 1834 | 1835 | 167 1836 | 1837 | 1838 | 1839 | 1840 | 171 1841 | 1842 | 1843 | 1844 | 1845 | 172 1846 | 1847 | 1848 | 1849 | 1850 | 173 1851 | 1852 | 1853 | 1854 | 1855 | 174 1856 | 1857 | 1858 | 1859 | 1860 | 184 1861 | 1862 | 1863 | 1864 | 1865 | 1866 | 1867 | 1868 | 185 1869 | 1870 | 1871 | 1872 | 1873 | 1874 | 1875 | 1876 | 1877 | 1878 | 187 1879 | 1880 | 1881 | 1882 | 1883 | 189 1884 | 1885 | 1886 | 1887 | 1888 | 191 1889 | 1890 | 1891 | 1892 | 1893 | 204 1894 | 1895 | 1896 | 1897 | 1898 | 216 1899 | 1900 | 1901 | SPIDAppController 1902 | 1903 | 1904 | 246 1905 | 1906 | 1907 | 1908 | 1909 | 247 1910 | 1911 | 1912 | 1913 | 1914 | 248 1915 | 1916 | 1917 | 1918 | 1919 | 249 1920 | 1921 | 1922 | 1923 | 1924 | 250 1925 | 1926 | 1927 | 1928 | 1929 | 1930 | 1931 | 1932 | 251 1933 | 1934 | 1935 | 1936 | 1937 | 254 1938 | 1939 | 1940 | 1941 | 1942 | 1943 | 1944 | 1945 | 255 1946 | 1947 | 1948 | 1949 | 1950 | 257 1951 | 1952 | 1953 | 1954 | 1955 | 275 1956 | 1957 | 1958 | 1959 | 1960 | 1961 | 1962 | 1963 | 276 1964 | 1965 | 1966 | 1967 | 1968 | 282 1969 | 1970 | 1971 | 1972 | 1973 | 1974 | 1975 | 1976 | 283 1977 | 1978 | 1979 | 1980 | 1981 | 284 1982 | 1983 | 1984 | 1985 | 1986 | 1987 | 1988 | 1989 | 285 1990 | 1991 | 1992 | 1993 | 1994 | 1995 | 1996 | com.apple.InterfaceBuilder.CocoaPlugin 1997 | com.apple.InterfaceBuilder.CocoaPlugin 1998 | com.apple.InterfaceBuilder.CocoaPlugin 1999 | com.apple.InterfaceBuilder.CocoaPlugin 2000 | com.apple.InterfaceBuilder.CocoaPlugin 2001 | com.apple.InterfaceBuilder.CocoaPlugin 2002 | com.apple.InterfaceBuilder.CocoaPlugin 2003 | com.apple.InterfaceBuilder.CocoaPlugin 2004 | com.apple.InterfaceBuilder.CocoaPlugin 2005 | com.apple.InterfaceBuilder.CocoaPlugin 2006 | com.apple.InterfaceBuilder.CocoaPlugin 2007 | com.apple.InterfaceBuilder.CocoaPlugin 2008 | com.apple.InterfaceBuilder.CocoaPlugin 2009 | com.apple.InterfaceBuilder.CocoaPlugin 2010 | com.apple.InterfaceBuilder.CocoaPlugin 2011 | com.apple.InterfaceBuilder.CocoaPlugin 2012 | com.apple.InterfaceBuilder.CocoaPlugin 2013 | com.apple.InterfaceBuilder.CocoaPlugin 2014 | com.apple.InterfaceBuilder.CocoaPlugin 2015 | com.apple.InterfaceBuilder.CocoaPlugin 2016 | com.apple.InterfaceBuilder.CocoaPlugin 2017 | com.apple.InterfaceBuilder.CocoaPlugin 2018 | com.apple.InterfaceBuilder.CocoaPlugin 2019 | com.apple.InterfaceBuilder.CocoaPlugin 2020 | com.apple.InterfaceBuilder.CocoaPlugin 2021 | com.apple.InterfaceBuilder.CocoaPlugin 2022 | com.apple.InterfaceBuilder.CocoaPlugin 2023 | com.apple.InterfaceBuilder.CocoaPlugin 2024 | com.apple.InterfaceBuilder.CocoaPlugin 2025 | com.apple.InterfaceBuilder.CocoaPlugin 2026 | com.apple.InterfaceBuilder.CocoaPlugin 2027 | com.apple.InterfaceBuilder.CocoaPlugin 2028 | com.apple.InterfaceBuilder.CocoaPlugin 2029 | com.apple.InterfaceBuilder.CocoaPlugin 2030 | com.apple.InterfaceBuilder.CocoaPlugin 2031 | com.apple.InterfaceBuilder.CocoaPlugin 2032 | com.apple.InterfaceBuilder.CocoaPlugin 2033 | com.apple.InterfaceBuilder.CocoaPlugin 2034 | com.apple.InterfaceBuilder.CocoaPlugin 2035 | com.apple.InterfaceBuilder.CocoaPlugin 2036 | com.apple.InterfaceBuilder.CocoaPlugin 2037 | com.apple.InterfaceBuilder.CocoaPlugin 2038 | com.apple.InterfaceBuilder.CocoaPlugin 2039 | com.apple.InterfaceBuilder.CocoaPlugin 2040 | com.apple.InterfaceBuilder.CocoaPlugin 2041 | com.apple.InterfaceBuilder.CocoaPlugin 2042 | com.apple.InterfaceBuilder.CocoaPlugin 2043 | com.apple.InterfaceBuilder.CocoaPlugin 2044 | com.apple.InterfaceBuilder.CocoaPlugin 2045 | com.apple.InterfaceBuilder.CocoaPlugin 2046 | com.apple.InterfaceBuilder.CocoaPlugin 2047 | com.apple.InterfaceBuilder.CocoaPlugin 2048 | com.apple.InterfaceBuilder.CocoaPlugin 2049 | {{465, 380}, {377, 161}} 2050 | 2051 | com.apple.InterfaceBuilder.CocoaPlugin 2052 | com.apple.InterfaceBuilder.CocoaPlugin 2053 | com.apple.InterfaceBuilder.CocoaPlugin 2054 | com.apple.InterfaceBuilder.CocoaPlugin 2055 | com.apple.InterfaceBuilder.CocoaPlugin 2056 | com.apple.InterfaceBuilder.CocoaPlugin 2057 | com.apple.InterfaceBuilder.CocoaPlugin 2058 | com.apple.InterfaceBuilder.CocoaPlugin 2059 | com.apple.InterfaceBuilder.CocoaPlugin 2060 | com.apple.InterfaceBuilder.CocoaPlugin 2061 | com.apple.InterfaceBuilder.CocoaPlugin 2062 | com.apple.InterfaceBuilder.CocoaPlugin 2063 | com.apple.InterfaceBuilder.CocoaPlugin 2064 | com.apple.InterfaceBuilder.CocoaPlugin 2065 | com.apple.InterfaceBuilder.CocoaPlugin 2066 | com.apple.InterfaceBuilder.CocoaPlugin 2067 | com.apple.InterfaceBuilder.CocoaPlugin 2068 | com.apple.InterfaceBuilder.CocoaPlugin 2069 | com.apple.InterfaceBuilder.CocoaPlugin 2070 | com.apple.InterfaceBuilder.CocoaPlugin 2071 | com.apple.InterfaceBuilder.CocoaPlugin 2072 | com.apple.InterfaceBuilder.CocoaPlugin 2073 | com.apple.InterfaceBuilder.CocoaPlugin 2074 | com.apple.InterfaceBuilder.CocoaPlugin 2075 | com.apple.InterfaceBuilder.CocoaPlugin 2076 | com.apple.InterfaceBuilder.CocoaPlugin 2077 | com.apple.InterfaceBuilder.CocoaPlugin 2078 | com.apple.InterfaceBuilder.CocoaPlugin 2079 | com.apple.InterfaceBuilder.CocoaPlugin 2080 | com.apple.InterfaceBuilder.CocoaPlugin 2081 | com.apple.InterfaceBuilder.CocoaPlugin 2082 | com.apple.InterfaceBuilder.CocoaPlugin 2083 | com.apple.InterfaceBuilder.CocoaPlugin 2084 | com.apple.InterfaceBuilder.CocoaPlugin 2085 | com.apple.InterfaceBuilder.CocoaPlugin 2086 | com.apple.InterfaceBuilder.CocoaPlugin 2087 | com.apple.InterfaceBuilder.CocoaPlugin 2088 | com.apple.InterfaceBuilder.CocoaPlugin 2089 | com.apple.InterfaceBuilder.CocoaPlugin 2090 | 2091 | 2092 | 2093 | 2094 | 2095 | 289 2096 | 2097 | 2098 | 2099 | 2100 | SPIDAppController 2101 | NSObject 2102 | 2103 | id 2104 | id 2105 | id 2106 | id 2107 | id 2108 | id 2109 | id 2110 | id 2111 | 2112 | 2113 | 2114 | changeBackgroundColor: 2115 | id 2116 | 2117 | 2118 | changeForegroundColor: 2119 | id 2120 | 2121 | 2122 | startDeterminateDemo: 2123 | id 2124 | 2125 | 2126 | takeThreadedFrom: 2127 | id 2128 | 2129 | 2130 | toggleDisplayWhenStopped: 2131 | id 2132 | 2133 | 2134 | toggleDrawBackground: 2135 | id 2136 | 2137 | 2138 | toggleProgressIndicator: 2139 | id 2140 | 2141 | 2142 | toggleTurboFan: 2143 | id 2144 | 2145 | 2146 | 2147 | NSColorWell 2148 | NSButton 2149 | NSButton 2150 | NSColorWell 2151 | NSButton 2152 | NSProgressIndicator 2153 | NSButton 2154 | YRKSpinningProgressIndicator 2155 | NSButton 2156 | 2157 | 2158 | 2159 | _backgroundColorWell 2160 | NSColorWell 2161 | 2162 | 2163 | _determinateDemoButton 2164 | NSButton 2165 | 2166 | 2167 | _displayWhenStoppedButton 2168 | NSButton 2169 | 2170 | 2171 | _foregroundColorWell 2172 | NSColorWell 2173 | 2174 | 2175 | _nspiToggleButton 2176 | NSButton 2177 | 2178 | 2179 | _progressIndicator 2180 | NSProgressIndicator 2181 | 2182 | 2183 | _threadedAnimationButton 2184 | NSButton 2185 | 2186 | 2187 | _turboFan 2188 | YRKSpinningProgressIndicator 2189 | 2190 | 2191 | _yrkpiToggleButton 2192 | NSButton 2193 | 2194 | 2195 | 2196 | IBProjectSource 2197 | ../Classes/SPIDAppController.h 2198 | 2199 | 2200 | 2201 | SPIDAppController 2202 | 2203 | id 2204 | id 2205 | id 2206 | id 2207 | id 2208 | id 2209 | id 2210 | id 2211 | 2212 | 2213 | 2214 | changeBackgroundColor: 2215 | id 2216 | 2217 | 2218 | changeForegroundColor: 2219 | id 2220 | 2221 | 2222 | startDeterminateDemo: 2223 | id 2224 | 2225 | 2226 | takeThreadedFrom: 2227 | id 2228 | 2229 | 2230 | toggleDisplayWhenStopped: 2231 | id 2232 | 2233 | 2234 | toggleDrawBackground: 2235 | id 2236 | 2237 | 2238 | toggleProgressIndicator: 2239 | id 2240 | 2241 | 2242 | toggleTurboFan: 2243 | id 2244 | 2245 | 2246 | 2247 | IBProjectSource 2248 | ../Classes/SPIDAppController.m 2249 | 2250 | 2251 | 2252 | YRKSpinningProgressIndicator 2253 | NSView 2254 | 2255 | IBProjectSource 2256 | ../../Classes/YRKSpinningProgressIndicator.h 2257 | 2258 | 2259 | 2260 | 2261 | 2262 | NSActionCell 2263 | NSCell 2264 | 2265 | IBFrameworkSource 2266 | AppKit.framework/Headers/NSActionCell.h 2267 | 2268 | 2269 | 2270 | NSApplication 2271 | NSResponder 2272 | 2273 | IBFrameworkSource 2274 | AppKit.framework/Headers/NSApplication.h 2275 | 2276 | 2277 | 2278 | NSBox 2279 | NSView 2280 | 2281 | IBFrameworkSource 2282 | AppKit.framework/Headers/NSBox.h 2283 | 2284 | 2285 | 2286 | NSBrowser 2287 | NSControl 2288 | 2289 | IBFrameworkSource 2290 | AppKit.framework/Headers/NSBrowser.h 2291 | 2292 | 2293 | 2294 | NSButton 2295 | NSControl 2296 | 2297 | IBFrameworkSource 2298 | AppKit.framework/Headers/NSButton.h 2299 | 2300 | 2301 | 2302 | NSButtonCell 2303 | NSActionCell 2304 | 2305 | IBFrameworkSource 2306 | AppKit.framework/Headers/NSButtonCell.h 2307 | 2308 | 2309 | 2310 | NSCell 2311 | NSObject 2312 | 2313 | IBFrameworkSource 2314 | AppKit.framework/Headers/NSCell.h 2315 | 2316 | 2317 | 2318 | NSColorWell 2319 | NSControl 2320 | 2321 | IBFrameworkSource 2322 | AppKit.framework/Headers/NSColorWell.h 2323 | 2324 | 2325 | 2326 | NSControl 2327 | NSView 2328 | 2329 | IBFrameworkSource 2330 | AppKit.framework/Headers/NSControl.h 2331 | 2332 | 2333 | 2334 | NSDocument 2335 | NSObject 2336 | 2337 | id 2338 | id 2339 | id 2340 | id 2341 | id 2342 | id 2343 | 2344 | 2345 | 2346 | printDocument: 2347 | id 2348 | 2349 | 2350 | revertDocumentToSaved: 2351 | id 2352 | 2353 | 2354 | runPageLayout: 2355 | id 2356 | 2357 | 2358 | saveDocument: 2359 | id 2360 | 2361 | 2362 | saveDocumentAs: 2363 | id 2364 | 2365 | 2366 | saveDocumentTo: 2367 | id 2368 | 2369 | 2370 | 2371 | IBFrameworkSource 2372 | AppKit.framework/Headers/NSDocument.h 2373 | 2374 | 2375 | 2376 | NSDocumentController 2377 | NSObject 2378 | 2379 | id 2380 | id 2381 | id 2382 | id 2383 | 2384 | 2385 | 2386 | clearRecentDocuments: 2387 | id 2388 | 2389 | 2390 | newDocument: 2391 | id 2392 | 2393 | 2394 | openDocument: 2395 | id 2396 | 2397 | 2398 | saveAllDocuments: 2399 | id 2400 | 2401 | 2402 | 2403 | IBFrameworkSource 2404 | AppKit.framework/Headers/NSDocumentController.h 2405 | 2406 | 2407 | 2408 | NSFormatter 2409 | NSObject 2410 | 2411 | IBFrameworkSource 2412 | Foundation.framework/Headers/NSFormatter.h 2413 | 2414 | 2415 | 2416 | NSMatrix 2417 | NSControl 2418 | 2419 | IBFrameworkSource 2420 | AppKit.framework/Headers/NSMatrix.h 2421 | 2422 | 2423 | 2424 | NSMenu 2425 | NSObject 2426 | 2427 | IBFrameworkSource 2428 | AppKit.framework/Headers/NSMenu.h 2429 | 2430 | 2431 | 2432 | NSMenuItem 2433 | NSObject 2434 | 2435 | IBFrameworkSource 2436 | AppKit.framework/Headers/NSMenuItem.h 2437 | 2438 | 2439 | 2440 | NSMovieView 2441 | NSView 2442 | 2443 | IBFrameworkSource 2444 | AppKit.framework/Headers/NSMovieView.h 2445 | 2446 | 2447 | 2448 | NSPopover 2449 | NSResponder 2450 | 2451 | IBFrameworkSource 2452 | AppKit.framework/Headers/NSPopover.h 2453 | 2454 | 2455 | 2456 | NSProgressIndicator 2457 | NSView 2458 | 2459 | IBFrameworkSource 2460 | AppKit.framework/Headers/NSProgressIndicator.h 2461 | 2462 | 2463 | 2464 | NSResponder 2465 | NSObject 2466 | 2467 | IBFrameworkSource 2468 | AppKit.framework/Headers/NSResponder.h 2469 | 2470 | 2471 | 2472 | NSTableView 2473 | NSControl 2474 | 2475 | IBFrameworkSource 2476 | AppKit.framework/Headers/NSTableView.h 2477 | 2478 | 2479 | 2480 | NSText 2481 | NSView 2482 | 2483 | IBFrameworkSource 2484 | AppKit.framework/Headers/NSText.h 2485 | 2486 | 2487 | 2488 | NSTextField 2489 | NSControl 2490 | 2491 | IBFrameworkSource 2492 | AppKit.framework/Headers/NSTextField.h 2493 | 2494 | 2495 | 2496 | NSTextFieldCell 2497 | NSActionCell 2498 | 2499 | IBFrameworkSource 2500 | AppKit.framework/Headers/NSTextFieldCell.h 2501 | 2502 | 2503 | 2504 | NSView 2505 | NSResponder 2506 | 2507 | IBFrameworkSource 2508 | AppKit.framework/Headers/NSView.h 2509 | 2510 | 2511 | 2512 | NSViewController 2513 | NSResponder 2514 | 2515 | view 2516 | NSView 2517 | 2518 | 2519 | view 2520 | 2521 | view 2522 | NSView 2523 | 2524 | 2525 | 2526 | IBFrameworkSource 2527 | AppKit.framework/Headers/NSViewController.h 2528 | 2529 | 2530 | 2531 | NSWindow 2532 | NSResponder 2533 | 2534 | IBFrameworkSource 2535 | AppKit.framework/Headers/NSWindow.h 2536 | 2537 | 2538 | 2539 | 2540 | 0 2541 | IBCocoaFramework 2542 | NO 2543 | 2544 | com.apple.InterfaceBuilder.CocoaPlugin.macosx 2545 | 2546 | 2547 | 2548 | com.apple.InterfaceBuilder.CocoaPlugin.InterfaceBuilder3 2549 | 2550 | 2551 | YES 2552 | 3 2553 | 2554 | {12, 12} 2555 | {10, 2} 2556 | 2557 | 2558 | 2559 | -------------------------------------------------------------------------------- /Demo/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | com.yeahrightkeller.SPIDemo 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | NSMainNibFile 24 | MainMenu 25 | NSPrincipalClass 26 | NSApplication 27 | 28 | 29 | -------------------------------------------------------------------------------- /Demo/SPIDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 76345A7E0F47DE4000C1B478 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 76345A7A0F47DE4000C1B478 /* MainMenu.xib */; }; 11 | 76345A7F0F47DE4000C1B478 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 76345A7C0F47DE4000C1B478 /* InfoPlist.strings */; }; 12 | 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 13 | D8FEFEA31936F40100418044 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D8FEFE9F1936F40100418044 /* main.m */; }; 14 | D8FEFEA41936F40100418044 /* SPIDAppController.m in Sources */ = {isa = PBXBuildFile; fileRef = D8FEFEA11936F40100418044 /* SPIDAppController.m */; }; 15 | D8FEFEA71936F42000418044 /* YRKSpinningProgressIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = D8FEFEA61936F42000418044 /* YRKSpinningProgressIndicator.m */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXFileReference section */ 19 | 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; 20 | 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; 21 | 29B97324FDCFA39411CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 22 | 29B97325FDCFA39411CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; 23 | 35C80A7313D14CF8003D17E4 /* debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = debug.xcconfig; path = Configs/debug.xcconfig; sourceTree = ""; }; 24 | 35C80A7413D14CF8003D17E4 /* release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = release.xcconfig; path = Configs/release.xcconfig; sourceTree = ""; }; 25 | 76345A7B0F47DE4000C1B478 /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = Resources/English.lproj/MainMenu.xib; sourceTree = ""; }; 26 | 76345A7D0F47DE4000C1B478 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = Resources/English.lproj/InfoPlist.strings; sourceTree = ""; }; 27 | 76345A950F47DEB400C1B478 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Resources/Info.plist; sourceTree = ""; }; 28 | 8D1107320486CEB800E47090 /* SPIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SPIDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 29 | D8FEFE9F1936F40100418044 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Classes/main.m; sourceTree = ""; }; 30 | D8FEFEA01936F40100418044 /* SPIDAppController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SPIDAppController.h; path = Classes/SPIDAppController.h; sourceTree = ""; }; 31 | D8FEFEA11936F40100418044 /* SPIDAppController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SPIDAppController.m; path = Classes/SPIDAppController.m; sourceTree = ""; }; 32 | D8FEFEA51936F42000418044 /* YRKSpinningProgressIndicator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = YRKSpinningProgressIndicator.h; path = ../Classes/YRKSpinningProgressIndicator.h; sourceTree = ""; }; 33 | D8FEFEA61936F42000418044 /* YRKSpinningProgressIndicator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = YRKSpinningProgressIndicator.m; path = ../Classes/YRKSpinningProgressIndicator.m; sourceTree = ""; }; 34 | /* End PBXFileReference section */ 35 | 36 | /* Begin PBXFrameworksBuildPhase section */ 37 | 8D11072E0486CEB800E47090 /* Frameworks */ = { 38 | isa = PBXFrameworksBuildPhase; 39 | buildActionMask = 2147483647; 40 | files = ( 41 | 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */, 42 | ); 43 | runOnlyForDeploymentPostprocessing = 0; 44 | }; 45 | /* End PBXFrameworksBuildPhase section */ 46 | 47 | /* Begin PBXGroup section */ 48 | 080E96DDFE201D6D7F000001 /* Classes */ = { 49 | isa = PBXGroup; 50 | children = ( 51 | D8FEFE9F1936F40100418044 /* main.m */, 52 | D8FEFEA01936F40100418044 /* SPIDAppController.h */, 53 | D8FEFEA11936F40100418044 /* SPIDAppController.m */, 54 | D8FEFEA51936F42000418044 /* YRKSpinningProgressIndicator.h */, 55 | D8FEFEA61936F42000418044 /* YRKSpinningProgressIndicator.m */, 56 | ); 57 | name = Classes; 58 | sourceTree = ""; 59 | }; 60 | 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = { 61 | isa = PBXGroup; 62 | children = ( 63 | 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */, 64 | ); 65 | name = "Linked Frameworks"; 66 | sourceTree = ""; 67 | }; 68 | 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */ = { 69 | isa = PBXGroup; 70 | children = ( 71 | 29B97324FDCFA39411CA2CEA /* AppKit.framework */, 72 | 13E42FB307B3F0F600E4EEF1 /* CoreData.framework */, 73 | 29B97325FDCFA39411CA2CEA /* Foundation.framework */, 74 | ); 75 | name = "Other Frameworks"; 76 | sourceTree = ""; 77 | }; 78 | 19C28FACFE9D520D11CA2CBB /* Products */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 8D1107320486CEB800E47090 /* SPIDemo.app */, 82 | ); 83 | name = Products; 84 | sourceTree = ""; 85 | }; 86 | 29B97314FDCFA39411CA2CEA /* TurboFan */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 080E96DDFE201D6D7F000001 /* Classes */, 90 | 29B97317FDCFA39411CA2CEA /* Resources */, 91 | 35C80A7113D14CD9003D17E4 /* Configs */, 92 | 29B97323FDCFA39411CA2CEA /* Frameworks */, 93 | 19C28FACFE9D520D11CA2CBB /* Products */, 94 | ); 95 | indentWidth = 4; 96 | name = TurboFan; 97 | sourceTree = ""; 98 | tabWidth = 4; 99 | }; 100 | 29B97317FDCFA39411CA2CEA /* Resources */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | 76345A950F47DEB400C1B478 /* Info.plist */, 104 | 76345A7A0F47DE4000C1B478 /* MainMenu.xib */, 105 | 76345A7C0F47DE4000C1B478 /* InfoPlist.strings */, 106 | ); 107 | name = Resources; 108 | sourceTree = ""; 109 | }; 110 | 29B97323FDCFA39411CA2CEA /* Frameworks */ = { 111 | isa = PBXGroup; 112 | children = ( 113 | 1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */, 114 | 1058C7A2FEA54F0111CA2CBB /* Other Frameworks */, 115 | ); 116 | name = Frameworks; 117 | sourceTree = ""; 118 | }; 119 | 35C80A7113D14CD9003D17E4 /* Configs */ = { 120 | isa = PBXGroup; 121 | children = ( 122 | 35C80A7313D14CF8003D17E4 /* debug.xcconfig */, 123 | 35C80A7413D14CF8003D17E4 /* release.xcconfig */, 124 | ); 125 | name = Configs; 126 | sourceTree = ""; 127 | }; 128 | /* End PBXGroup section */ 129 | 130 | /* Begin PBXNativeTarget section */ 131 | 8D1107260486CEB800E47090 /* SPIDemo */ = { 132 | isa = PBXNativeTarget; 133 | buildConfigurationList = C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "SPIDemo" */; 134 | buildPhases = ( 135 | 8D11072C0486CEB800E47090 /* Sources */, 136 | 8D11072E0486CEB800E47090 /* Frameworks */, 137 | 8D1107290486CEB800E47090 /* Resources */, 138 | ); 139 | buildRules = ( 140 | ); 141 | dependencies = ( 142 | ); 143 | name = SPIDemo; 144 | productInstallPath = "$(HOME)/Applications"; 145 | productName = TurboFan; 146 | productReference = 8D1107320486CEB800E47090 /* SPIDemo.app */; 147 | productType = "com.apple.product-type.application"; 148 | }; 149 | /* End PBXNativeTarget section */ 150 | 151 | /* Begin PBXProject section */ 152 | 29B97313FDCFA39411CA2CEA /* Project object */ = { 153 | isa = PBXProject; 154 | attributes = { 155 | LastUpgradeCheck = 0610; 156 | }; 157 | buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "SPIDemo" */; 158 | compatibilityVersion = "Xcode 3.2"; 159 | developmentRegion = English; 160 | hasScannedForEncodings = 1; 161 | knownRegions = ( 162 | en, 163 | English, 164 | ); 165 | mainGroup = 29B97314FDCFA39411CA2CEA /* TurboFan */; 166 | projectDirPath = ""; 167 | projectRoot = ""; 168 | targets = ( 169 | 8D1107260486CEB800E47090 /* SPIDemo */, 170 | ); 171 | }; 172 | /* End PBXProject section */ 173 | 174 | /* Begin PBXResourcesBuildPhase section */ 175 | 8D1107290486CEB800E47090 /* Resources */ = { 176 | isa = PBXResourcesBuildPhase; 177 | buildActionMask = 2147483647; 178 | files = ( 179 | 76345A7E0F47DE4000C1B478 /* MainMenu.xib in Resources */, 180 | 76345A7F0F47DE4000C1B478 /* InfoPlist.strings in Resources */, 181 | ); 182 | runOnlyForDeploymentPostprocessing = 0; 183 | }; 184 | /* End PBXResourcesBuildPhase section */ 185 | 186 | /* Begin PBXSourcesBuildPhase section */ 187 | 8D11072C0486CEB800E47090 /* Sources */ = { 188 | isa = PBXSourcesBuildPhase; 189 | buildActionMask = 2147483647; 190 | files = ( 191 | D8FEFEA31936F40100418044 /* main.m in Sources */, 192 | D8FEFEA71936F42000418044 /* YRKSpinningProgressIndicator.m in Sources */, 193 | D8FEFEA41936F40100418044 /* SPIDAppController.m in Sources */, 194 | ); 195 | runOnlyForDeploymentPostprocessing = 0; 196 | }; 197 | /* End PBXSourcesBuildPhase section */ 198 | 199 | /* Begin PBXVariantGroup section */ 200 | 76345A7A0F47DE4000C1B478 /* MainMenu.xib */ = { 201 | isa = PBXVariantGroup; 202 | children = ( 203 | 76345A7B0F47DE4000C1B478 /* English */, 204 | ); 205 | name = MainMenu.xib; 206 | sourceTree = ""; 207 | }; 208 | 76345A7C0F47DE4000C1B478 /* InfoPlist.strings */ = { 209 | isa = PBXVariantGroup; 210 | children = ( 211 | 76345A7D0F47DE4000C1B478 /* English */, 212 | ); 213 | name = InfoPlist.strings; 214 | sourceTree = ""; 215 | }; 216 | /* End PBXVariantGroup section */ 217 | 218 | /* Begin XCBuildConfiguration section */ 219 | C01FCF4B08A954540054247B /* Debug */ = { 220 | isa = XCBuildConfiguration; 221 | buildSettings = { 222 | GCC_ENABLE_FIX_AND_CONTINUE = YES; 223 | INFOPLIST_FILE = Resources/Info.plist; 224 | MACOSX_DEPLOYMENT_TARGET = 10.7; 225 | PRODUCT_NAME = SPIDemo; 226 | }; 227 | name = Debug; 228 | }; 229 | C01FCF4C08A954540054247B /* Release */ = { 230 | isa = XCBuildConfiguration; 231 | buildSettings = { 232 | INFOPLIST_FILE = Resources/Info.plist; 233 | MACOSX_DEPLOYMENT_TARGET = 10.7; 234 | PRODUCT_NAME = SPIDemo; 235 | }; 236 | name = Release; 237 | }; 238 | C01FCF4F08A954540054247B /* Debug */ = { 239 | isa = XCBuildConfiguration; 240 | baseConfigurationReference = 35C80A7313D14CF8003D17E4 /* debug.xcconfig */; 241 | buildSettings = { 242 | }; 243 | name = Debug; 244 | }; 245 | C01FCF5008A954540054247B /* Release */ = { 246 | isa = XCBuildConfiguration; 247 | baseConfigurationReference = 35C80A7413D14CF8003D17E4 /* release.xcconfig */; 248 | buildSettings = { 249 | }; 250 | name = Release; 251 | }; 252 | /* End XCBuildConfiguration section */ 253 | 254 | /* Begin XCConfigurationList section */ 255 | C01FCF4A08A954540054247B /* Build configuration list for PBXNativeTarget "SPIDemo" */ = { 256 | isa = XCConfigurationList; 257 | buildConfigurations = ( 258 | C01FCF4B08A954540054247B /* Debug */, 259 | C01FCF4C08A954540054247B /* Release */, 260 | ); 261 | defaultConfigurationIsVisible = 0; 262 | defaultConfigurationName = Release; 263 | }; 264 | C01FCF4E08A954540054247B /* Build configuration list for PBXProject "SPIDemo" */ = { 265 | isa = XCConfigurationList; 266 | buildConfigurations = ( 267 | C01FCF4F08A954540054247B /* Debug */, 268 | C01FCF5008A954540054247B /* Release */, 269 | ); 270 | defaultConfigurationIsVisible = 0; 271 | defaultConfigurationName = Release; 272 | }; 273 | /* End XCConfigurationList section */ 274 | }; 275 | rootObject = 29B97313FDCFA39411CA2CEA /* Project object */; 276 | } 277 | -------------------------------------------------------------------------------- /Demo/SPIDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Demo/SPIDemo.xcodeproj/project.xcworkspace/xcuserdata/Nathan.xcuserdatad/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges 6 | 7 | SnapshotAutomaticallyBeforeSignificantChanges 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Demo/SPIDemo.xcodeproj/xcuserdata/Nathan.xcuserdatad/xcschemes/SPIDemo.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 51 | 52 | 58 | 59 | 60 | 61 | 62 | 63 | 69 | 70 | 76 | 77 | 78 | 79 | 81 | 82 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /Demo/SPIDemo.xcodeproj/xcuserdata/Nathan.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | SPIDemo.xcscheme 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | SuppressBuildableAutocreation 14 | 15 | 8D1107260486CEB800E47090 16 | 17 | primary 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # YRKSpinningProgressIndicator 2 | 3 | by Kelan Champagne (http://yeahrightkeller.com) 4 | 5 | Please feel free to send me questions or comments. 6 | 7 | 8 | ## Overview 9 | 10 | YRKSpinningProgressIndicator is a clone of the "Spinning style" 11 | NSProgressIndicator that can be set to an arbitrary size and color. The 12 | background color can also be set, or it can be transparent. You can even 13 | change the color in real-time while it's animating. SPIDemo is an app to demo 14 | its use. 15 | 16 | 17 | ## Version History 18 | 19 | * v1.4 2014-05-29 novawave fork: clean-up for submission as cocoapod, pull falkobuttler's changes for ARC support 20 | * v1.3 2010-09-06 Pulled fixes, name improvements from mikeabdulla and 21 | uncomplex. 22 | NOTE: This version is not backwards-compatible with 23 | previous versions due to the name changes. 24 | * v1.2 2009-12-21 Added determinate mode and threaded animation, mostly via 25 | email from Rowan Beentje (from SequelPro). 26 | * v1.1 2009-02-14 Fixes from Eric Roccasecca. 27 | * v1.0 2008-07-08 Initial Release. 28 | 29 | 30 | ## Features 31 | 32 | * Can be set to arbitrary size and color. 33 | * Can even be changed while animating. 34 | * Background color can be set arbitrarily or be transparent. 35 | * Has determinate mode that is a pie-chart of the progress. 36 | 37 | 38 | ## Code Architecture 39 | 40 | * Requires ARC. 41 | * Implemented as a subclass of NSView. 42 | * Animation is done with an NSTimer, or on a separate thread (when 43 | setUsesThreadedAnimation:YES). You can even swap between the two while the 44 | animation is running. 45 | 46 | 47 | ## Contributing 48 | 49 | Please feel free to fork this project, or email any patches to me at 50 | kelan@yeahrightkeller.com. 51 | 52 | 53 | ## License (BSD) 54 | 55 | Copyright (c) 2009, Kelan Champagne (http://yeahrightkeller.com) 56 | 57 | All rights reserved. 58 | 59 | Redistribution and use in source and binary forms, with or without 60 | modification, are permitted provided that the following conditions are met: 61 | 62 | * Redistributions of source code must retain the above copyright 63 | notice, this list of conditions and the following disclaimer. 64 | * Redistributions in binary form must reproduce the above copyright 65 | notice, this list of conditions and the following disclaimer in the 66 | documentation and/or other materials provided with the distribution. 67 | * Neither the name of the Kelan Champagne nor the 68 | names of its contributors may be used to endorse or promote products 69 | derived from this software without specific prior written permission. 70 | 71 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 72 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 73 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 74 | ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE 75 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 76 | CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 77 | SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 78 | INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 79 | CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 80 | ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 81 | POSSIBILITY OF SUCH DAMAGE. 82 | 83 | Also, I'd appreciate it if you would let me know if you find this code useful. 84 | 85 | -------------------------------------------------------------------------------- /YRKSpinningProgressIndicator.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | 3 | s.name = "YRKSpinningProgressIndicator" 4 | s.version = "1.4" 5 | s.summary = "A resizable, recolorable clone of the spinning NSProgressIndicator." 6 | s.homepage = "http://github.com/kelan/YRKSpinningProgressIndicator" 7 | 8 | s.description = <<-DESC 9 | YRKSpinningProgressIndicator is a clone of the "Spinning style" NSProgressIndicator that can be set to an arbitrary size and color. The background color can also be set, or it can be transparent. You can even change the color in real-time while it's animating. SPIDemo is an app to demo its use. 10 | DESC 11 | 12 | s.license = { :type => 'BSD', :file => 'BSD-LICENSE.txt' } 13 | s.author = { "Kelan Champagne" => "kelan@yeahrightkeller.com" } 14 | s.platform = :osx, "10.7" 15 | s.source = { :git => "https://github.com/kelan/YRKSpinningProgressIndicator.git", :tag => "1.4" } 16 | s.source_files = "Classes", "Classes/*.{h,m}" 17 | s.requires_arc = true 18 | 19 | end 20 | --------------------------------------------------------------------------------