diff -r ccf4854df294 -r 02875b1145b7 project_files/HedgewarsMobile/Classes/SingleTeamViewController.m --- a/project_files/HedgewarsMobile/Classes/SingleTeamViewController.m Wed Jun 23 21:49:19 2010 +0200 +++ b/project_files/HedgewarsMobile/Classes/SingleTeamViewController.m Wed Jun 23 22:03:56 2010 +0200 @@ -0,0 +1,453 @@ +// +// SingleTeamViewController.m +// HedgewarsMobile +// +// Created by Vittorio on 02/04/10. +// Copyright 2010 __MyCompanyName__. All rights reserved. +// + +#import "SingleTeamViewController.h" +#import "HogHatViewController.h" +#import "GravesViewController.h" +#import "VoicesViewController.h" +#import "FortsViewController.h" +#import "FlagsViewController.h" +#import "LevelViewController.h" +#import "CommodityFunctions.h" +#import "UIImageExtra.h" + +#define TEAMNAME_TAG 1234 + +@implementation SingleTeamViewController +@synthesize teamDictionary, normalHogSprite, secondaryItems, textFieldBeingEdited, teamName; + + +-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { + return rotationManager(interfaceOrientation); +} + + +#pragma mark - +#pragma mark textfield methods +-(void) cancel:(id) sender { + if (textFieldBeingEdited != nil) + [self.textFieldBeingEdited resignFirstResponder]; +} + +// set the new value +-(BOOL) save:(id) sender { + NSInteger index = textFieldBeingEdited.tag; + + if (textFieldBeingEdited != nil) { + if (TEAMNAME_TAG == index) { + [self.teamDictionary setObject:textFieldBeingEdited.text forKey:@"teamname"]; + } else { + //replace the old value with the new one + NSMutableDictionary *hog = [[teamDictionary objectForKey:@"hedgehogs"] objectAtIndex:index]; + [hog setObject:textFieldBeingEdited.text forKey:@"hogname"]; + } + + isWriteNeeded = YES; + [self.textFieldBeingEdited resignFirstResponder]; + return YES; + } + return NO; +} + +// the textfield is being modified, update the navigation controller +-(void) textFieldDidBeginEditing:(UITextField *)aTextField{ + self.textFieldBeingEdited = aTextField; + + UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Cancel",@"from the hog name table") + style:UIBarButtonItemStylePlain + target:self + action:@selector(cancel:)]; + self.navigationItem.leftBarButtonItem = cancelButton; + [cancelButton release]; + + UIBarButtonItem *saveButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"Save",@"from the hog name table") + style:UIBarButtonItemStyleDone + target:self + action:@selector(save:)]; + self.navigationItem.rightBarButtonItem = saveButton; + [saveButton release]; +} + +// the textfield has been modified, check for empty strings and restore original navigation bar +-(void) textFieldDidEndEditing:(UITextField *)aTextField{ + if ([textFieldBeingEdited.text length] == 0) + textFieldBeingEdited.text = [NSString stringWithFormat:@"hedgehog %d",textFieldBeingEdited.tag]; + + self.textFieldBeingEdited = nil; + self.navigationItem.rightBarButtonItem = self.navigationItem.backBarButtonItem; + self.navigationItem.leftBarButtonItem = nil; +} + +// limit the size of the field to 64 characters like in original frontend +-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { + int limit = 64; + return !([textField.text length] > limit && [string length] > range.length); +} + + +#pragma mark - +#pragma mark View lifecycle +-(void) viewDidLoad { + [super viewDidLoad]; + + // labels for the entries + NSArray *array = [[NSArray alloc] initWithObjects: + NSLocalizedString(@"Grave",@""), + NSLocalizedString(@"Voice",@""), + NSLocalizedString(@"Fort",@""), + NSLocalizedString(@"Flag",@""), + NSLocalizedString(@"Level",@""),nil]; + self.secondaryItems = array; + [array release]; + + // load the base hog image, drawing will occure in cellForRow... + NSString *normalHogFile = [[NSString alloc] initWithFormat:@"%@/Hedgehog.png",GRAPHICS_DIRECTORY()]; + UIImage *hogSprite = [[UIImage alloc] initWithContentsOfFile:normalHogFile andCutAt:CGRectMake(96, 0, 32, 32)]; + [normalHogFile release]; + self.normalHogSprite = hogSprite; + [hogSprite release]; + + // listen if any childController modifies the plist and write it if needed + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setWriteNeeded) name:@"setWriteNeedTeams" object:nil]; + isWriteNeeded = NO; +} + +-(void) viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + + // load data about the team and write if there has been a change + if (isWriteNeeded) + [self writeFile]; + + NSString *teamFile = [[NSString alloc] initWithFormat:@"%@/%@.plist",TEAMS_DIRECTORY(),self.title]; + NSMutableDictionary *teamDict = [[NSMutableDictionary alloc] initWithContentsOfFile:teamFile]; + self.teamDictionary = teamDict; + [teamDict release]; + [teamFile release]; + + self.teamName = self.title; + + [self.tableView reloadData]; +} + +// write on file if there has been a change +-(void) viewWillDisappear:(BOOL)animated { + [super viewWillDisappear:animated]; + + // end the editing of the current field + if (textFieldBeingEdited != nil) { + [self save:nil]; + } + + if (isWriteNeeded) + [self writeFile]; +} + +#pragma mark - +// needed by other classes to warn about a user change +-(void) setWriteNeeded { + isWriteNeeded = YES; +} + +-(void) writeFile { + NSString *teamFile = [[NSString alloc] initWithFormat:@"%@/%@.plist",TEAMS_DIRECTORY(),self.title]; + + NSString *newTeamName = [self.teamDictionary objectForKey:@"teamname"]; + if (![newTeamName isEqualToString:self.teamName]) { + //delete old + [[NSFileManager defaultManager] removeItemAtPath:teamFile error:NULL]; + [teamFile release]; + self.title = newTeamName; + self.teamName = newTeamName; + teamFile = [[NSString alloc] initWithFormat:@"%@/%@.plist",TEAMS_DIRECTORY(),newTeamName]; + } + + [self.teamDictionary writeToFile:teamFile atomically:YES]; + NSLog(@"writing: %@",teamDictionary); + isWriteNeeded = NO; + [teamFile release]; +} + +#pragma mark - +#pragma mark Table view data source +-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { + return 3; +} + +-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + NSInteger rows = 0; + switch (section) { + case 0: // team name + rows = 1; + break; + case 1: // team members + rows = MAX_HOGS; + break; + case 2: // team details + rows = [self.secondaryItems count]; + break; + default: + break; + } + return rows; +} + +-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + static NSString *CellIdentifier0 = @"Cell0"; + static NSString *CellIdentifier1 = @"Cell1"; + static NSString *CellIdentifier2 = @"Cell2"; + + NSArray *hogArray; + UITableViewCell *cell = nil; + NSInteger row = [indexPath row]; + UIImage *accessoryImage; + + switch ([indexPath section]) { + case 0: + cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier0]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault + reuseIdentifier:CellIdentifier0] autorelease]; + // create a uitextfield for each row, expand it to take the maximum size + UITextField *aTextField = [[UITextField alloc] + initWithFrame:CGRectMake(5, 12, (cell.frame.size.width + cell.frame.size.width/3) - 42, 25)]; + aTextField.clearsOnBeginEditing = NO; + aTextField.returnKeyType = UIReturnKeyDone; + aTextField.adjustsFontSizeToFitWidth = YES; + aTextField.delegate = self; + aTextField.tag = [indexPath row]; + aTextField.font = [UIFont boldSystemFontOfSize:[UIFont systemFontSize] + 2]; + aTextField.clearButtonMode = UITextFieldViewModeWhileEditing; + [aTextField addTarget:self action:@selector(save:) forControlEvents:UIControlEventEditingDidEndOnExit]; + [cell.contentView addSubview:aTextField]; + [aTextField release]; + } + + cell.imageView.image = nil; + cell.accessoryType = UITableViewCellAccessoryNone; + for (UIView *oneView in cell.contentView.subviews) { + if ([oneView isMemberOfClass:[UITextField class]]) { + // we find the uitextfied and we'll use its tag to understand which one is being edited + UITextField *textFieldFound = (UITextField *)oneView; + textFieldFound.text = [self.teamDictionary objectForKey:@"teamname"]; + textFieldFound.tag = TEAMNAME_TAG; + } + } + break; + case 1: + cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier1]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault + reuseIdentifier:CellIdentifier1] autorelease]; + + // create a uitextfield for each row, expand it to take the maximum size + UITextField *aTextField = [[UITextField alloc] + initWithFrame:CGRectMake(42, 12, (cell.frame.size.width + cell.frame.size.width/3) - 42, 25)]; + aTextField.clearsOnBeginEditing = NO; + aTextField.returnKeyType = UIReturnKeyDone; + aTextField.adjustsFontSizeToFitWidth = YES; + aTextField.delegate = self; + aTextField.tag = [indexPath row]; + aTextField.font = [UIFont boldSystemFontOfSize:[UIFont systemFontSize] + 2]; + aTextField.clearButtonMode = UITextFieldViewModeWhileEditing; + [aTextField addTarget:self action:@selector(save:) forControlEvents:UIControlEventEditingDidEndOnExit]; + [cell.contentView addSubview:aTextField]; + [aTextField release]; + } + + hogArray = [self.teamDictionary objectForKey:@"hedgehogs"]; + + NSString *hatFile = [[NSString alloc] initWithFormat:@"%@/%@.png", HATS_DIRECTORY(), [[hogArray objectAtIndex:row] objectForKey:@"hat"]]; + UIImage *hatSprite = [[UIImage alloc] initWithContentsOfFile: hatFile andCutAt:CGRectMake(0, 0, 32, 32)]; + [hatFile release]; + cell.imageView.image = [self.normalHogSprite mergeWith:hatSprite atPoint:CGPointMake(0, -5)]; + [hatSprite release]; + + for (UIView *oneView in cell.contentView.subviews) { + if ([oneView isMemberOfClass:[UITextField class]]) { + // we find the uitextfied and we'll use its tag to understand which one is being edited + UITextField *textFieldFound = (UITextField *)oneView; + textFieldFound.text = [[hogArray objectAtIndex:row] objectForKey:@"hogname"]; + } + } + + cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; + break; + case 2: + cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2]; + if (cell == nil) { + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault + reuseIdentifier:CellIdentifier2] autorelease]; + } + + cell.textLabel.text = [self.secondaryItems objectAtIndex:row]; + cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; + switch (row) { + case 0: // grave + accessoryImage = [[UIImage alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@/%@.png", + GRAVES_DIRECTORY(),[teamDictionary objectForKey:@"grave"]] + andCutAt:CGRectMake(0,0,32,32)]; + cell.imageView.image = accessoryImage; + [accessoryImage release]; + break; + case 2: // fort + accessoryImage = [[UIImage alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@/%@L.png", + FORTS_DIRECTORY(),[teamDictionary objectForKey:@"fort"]]]; + cell.imageView.image = [accessoryImage scaleToSize:CGSizeMake(42, 42)]; + [accessoryImage release]; + break; + + case 3: // flags + accessoryImage = [[UIImage alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@/%@.png", + FLAGS_DIRECTORY(),[teamDictionary objectForKey:@"flag"]]]; + cell.imageView.image = accessoryImage; + [accessoryImage release]; + break; + case 4: // level + accessoryImage = [[UIImage alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@/%d.png", + BOTLEVELS_DIRECTORY(),[[[[teamDictionary objectForKey:@"hedgehogs"] + objectAtIndex:0] objectForKey:@"level"] + intValue]]]; + cell.imageView.image = accessoryImage; + [accessoryImage release]; + break; + default: + cell.imageView.image = nil; + break; + } + break; + } + + return cell; +} + + +#pragma mark - +#pragma mark Table view delegate +-(void) tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + NSInteger row = [indexPath row]; + NSInteger section = [indexPath section]; + UITableViewController *nextController = nil; + UITableViewCell *cell; + + if (2 == section) { + switch (row) { + case 0: // grave + if (nil == gravesViewController) + gravesViewController = [[GravesViewController alloc] initWithStyle:UITableViewStyleGrouped]; + + nextController = gravesViewController; + break; + case 1: // voice + if (nil == voicesViewController) + voicesViewController = [[VoicesViewController alloc] initWithStyle:UITableViewStyleGrouped]; + + nextController = voicesViewController; + break; + case 2: // fort + if (nil == fortsViewController) + fortsViewController = [[FortsViewController alloc] initWithStyle:UITableViewStyleGrouped]; + + nextController = fortsViewController; + break; + case 3: // flag + if (nil == flagsViewController) + flagsViewController = [[FlagsViewController alloc] initWithStyle:UITableViewStyleGrouped]; + + nextController = flagsViewController; + break; + case 4: // level + if (nil == levelViewController) + levelViewController = [[LevelViewController alloc] initWithStyle:UITableViewStyleGrouped]; + + nextController = levelViewController; + break; + } + + nextController.title = [secondaryItems objectAtIndex:row]; + [nextController setTeamDictionary:teamDictionary]; + [self.navigationController pushViewController:nextController animated:YES]; + } else { + cell = [aTableView cellForRowAtIndexPath:indexPath]; + for (UIView *oneView in cell.contentView.subviews) { + if ([oneView isMemberOfClass:[UITextField class]]) { + textFieldBeingEdited = (UITextField *)oneView; + [textFieldBeingEdited becomeFirstResponder]; + } + } + [aTableView deselectRowAtIndexPath:indexPath animated:NO]; + } + +} + +// action to perform when you want to change a hog hat +-(void) tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath { + if (nil == hogHatViewController) { + hogHatViewController = [[HogHatViewController alloc] initWithStyle:UITableViewStyleGrouped]; + } + + // cache the dictionary file of the team, so that other controllers can modify it + hogHatViewController.teamDictionary = self.teamDictionary; + hogHatViewController.selectedHog = [indexPath row]; + + [self.navigationController pushViewController:hogHatViewController animated:YES]; +} + + +#pragma mark - +#pragma mark Memory management +-(void) didReceiveMemoryWarning { + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + // Relinquish ownership any cached data, images, etc that aren't in use. + if (hogHatViewController.view.superview == nil) + hogHatViewController = nil; + if (gravesViewController.view.superview == nil) + gravesViewController = nil; + if (voicesViewController.view.superview == nil) + voicesViewController = nil; + if (fortsViewController.view.superview == nil) + fortsViewController = nil; + if (flagsViewController.view.superview == nil) + flagsViewController = nil; + if (levelViewController.view.superview == nil) + levelViewController = nil; +} + +-(void) viewDidUnload { + self.teamDictionary = nil; + self.textFieldBeingEdited = nil; + self.teamName = nil; + self.normalHogSprite = nil; + self.secondaryItems = nil; + hogHatViewController = nil; + flagsViewController = nil; + fortsViewController = nil; + gravesViewController = nil; + levelViewController = nil; + [super viewDidUnload]; + MSG_DIDUNLOAD(); +} + +-(void) dealloc { + [teamDictionary release]; + [textFieldBeingEdited release]; + [teamName release]; + [normalHogSprite release]; + [secondaryItems release]; + [hogHatViewController release]; + [fortsViewController release]; + [gravesViewController release]; + [flagsViewController release]; + [levelViewController release]; + [super dealloc]; +} + + +@end +