Fixed: An exception in the Go game if you mouse down on the board but then drag to the captured-pieces area and release the mouse.
     5 //  Created by Jens Alfke on 3/7/08.
 
     6 //  Copyright __MyCompanyName__ 2008. All rights reserved.
 
     9 #import "iPhoneAppDelegate.h"
 
    10 #import "BoardUIView.h"
 
    12 #import "QuartzUtils.h"
 
    16 @implementation GGB_iPhoneAppDelegate
 
    19 @synthesize window=_window;
 
    20 @synthesize contentView=_contentView;
 
    21 @synthesize headline=_headline;
 
    24 - (void)applicationDidFinishLaunching:(UIApplication *)application 
 
    26     for( NSString *family in [UIFont familyNames] )
 
    27         NSLog(@"%@: (%@)", family, [[UIFont fontNamesForFamilyName: family] componentsJoinedByString: @", "]);
 
    30     self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
 
    31     _window.layer.backgroundColor = GetCGPatternNamed(@"Background.png");
 
    33     // Set up content view
 
    34     CGRect rHeadline,rContent;
 
    35     CGRectDivide([[UIScreen mainScreen] applicationFrame],
 
    36                  &rHeadline, &rContent, 35, CGRectMinYEdge);
 
    38     self.contentView = [[[BoardUIView alloc] initWithFrame: rContent] autorelease];
 
    39     [_window addSubview: _contentView];
 
    41     self.headline = [[[UILabel alloc] initWithFrame: rHeadline] autorelease];
 
    42     _headline.backgroundColor = nil;
 
    43     _headline.opaque = NO;
 
    44     _headline.textAlignment = UITextAlignmentCenter;
 
    45     _headline.font = [UIFont boldSystemFontOfSize: 20];
 
    46     _headline.minimumFontSize = 14;
 
    47     _headline.adjustsFontSizeToFit = YES;
 
    48     [_window addSubview: _headline];
 
    51     [self startGameNamed: @"KlondikeGame"];
 
    54     [_window makeKeyAndVisible];
 
    60     [_contentView release];
 
    67 - (void) startGameNamed: (NSString*)gameClassName
 
    69     Game *game = _contentView.game;
 
    70     [game removeObserver: self  forKeyPath: @"currentPlayer"];
 
    71     [game removeObserver: self forKeyPath: @"winner"];
 
    73     if( gameClassName == nil )
 
    74         gameClassName = [[game class] className];
 
    76     [_contentView startGameNamed: gameClassName];
 
    78     game = _contentView.game;
 
    79     [game addObserver: self 
 
    80            forKeyPath: @"currentPlayer"
 
    81               options: NSKeyValueObservingOptionInitial
 
    83     [game addObserver: self
 
    90 - (void)observeValueForKeyPath:(NSString *)keyPath 
 
    92                         change:(NSDictionary *)change
 
    93                        context:(void *)context
 
    95     Game *game = _contentView.game;
 
    96     if( object == game ) {
 
    97         Player *p = game.winner;
 
   100             PlaySound(@"Sosumi");
 
   103             p = game.currentPlayer;
 
   104             msg = @"Your turn, %@";
 
   106         _headline.text = [NSString stringWithFormat: msg, p.name];
 
   110             alert = [[UIAlertView alloc] initWithTitle: msg
 
   111                                                message: @"Congratulations!"
 
   114                                           cancelButton:nil otherButtons:nil];
 
   122 - (void)modalView:(UIModalView *)modalView didDismissWithButtonIndex:(NSInteger)buttonIndex;
 
   125     [self startGameNamed: nil];