diff -r f8d5ac50e307 -r bc125bea5849 project_files/HedgewarsMobile/Classes/SingleTeamViewController.m --- a/project_files/HedgewarsMobile/Classes/SingleTeamViewController.m Tue Jul 20 03:14:43 2010 +0200 +++ b/project_files/HedgewarsMobile/Classes/SingleTeamViewController.m Tue Jul 20 05:37:58 2010 +0200 @@ -16,86 +16,34 @@ #import "CommodityFunctions.h" #import "UIImageExtra.h" -#define TEAMNAME_TAG 1234 +#define TEAMNAME_TAG 78789 @implementation SingleTeamViewController -@synthesize teamDictionary, normalHogSprite, secondaryItems, textFieldBeingEdited, teamName; - +@synthesize teamDictionary, normalHogSprite, secondaryItems, teamName; -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { return rotationManager(interfaceOrientation); } - #pragma mark - -#pragma mark textfield methods --(void) cancel:(id) sender { - if (textFieldBeingEdited != nil) - [self.textFieldBeingEdited resignFirstResponder]; -} - +#pragma mark editableCellViewDelegate methods // set the new value --(BOOL) save:(id) sender { - NSInteger index = textFieldBeingEdited.tag; - - if (textFieldBeingEdited != nil) { - if (TEAMNAME_TAG == index) { - if ([textFieldBeingEdited.text length] == 0) - textFieldBeingEdited.text = self.title; - [self.teamDictionary setObject:textFieldBeingEdited.text forKey:@"teamname"]; - self.title = textFieldBeingEdited.text; - } else { - if ([textFieldBeingEdited.text length] == 0) - textFieldBeingEdited.text = [NSString stringWithFormat:@"hedgehog %d",index]; - - //replace the old value with the new one - NSMutableDictionary *hog = [[teamDictionary objectForKey:@"hedgehogs"] objectAtIndex:index]; - [hog setObject:textFieldBeingEdited.text forKey:@"hogname"]; - } - +-(void) saveTextFieldValue:(NSString *)textString withTag:(NSInteger) tagValue { + if (TEAMNAME_TAG == tagValue) { + // delete old file + [[NSFileManager defaultManager] removeItemAtPath:[NSString stringWithFormat:@"%@/%@.plist",TEAMS_DIRECTORY(),self.teamName] error:NULL]; + // update filename + self.teamName = textString; + // save new file + [self writeFile]; + } else { + // replace the old value with the new one + NSMutableDictionary *hog = [[teamDictionary objectForKey:@"hedgehogs"] objectAtIndex:tagValue]; + [hog setObject:textString 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 { @@ -121,23 +69,23 @@ // 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; + + self.title = NSLocalizedString(@"Edit team settings",@""); } -(void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; - // load data about the team and write if there has been a change + // load data about the team and write if there has been a change from other childControllers if (isWriteNeeded) [self writeFile]; - NSString *teamFile = [[NSString alloc] initWithFormat:@"%@/%@.plist",TEAMS_DIRECTORY(),self.title]; + NSString *teamFile = [[NSString alloc] initWithFormat:@"%@/%@.plist",TEAMS_DIRECTORY(),self.teamName]; NSMutableDictionary *teamDict = [[NSMutableDictionary alloc] initWithContentsOfFile:teamFile]; self.teamDictionary = teamDict; [teamDict release]; [teamFile release]; - - self.teamName = self.title; - + [self.tableView reloadData]; } @@ -145,13 +93,8 @@ -(void) viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; - // end the editing of the current field - if (textFieldBeingEdited != nil) { - [self save:nil]; - } - if (isWriteNeeded) - [self writeFile]; + [self writeFile]; } #pragma mark - @@ -161,22 +104,12 @@ } -(void) writeFile { - NSString *teamFile = [[NSString alloc] initWithFormat:@"%@/%@.plist",TEAMS_DIRECTORY(),self.title]; + NSString *teamFile = [[NSString alloc] initWithFormat:@"%@/%@.plist",TEAMS_DIRECTORY(),self.teamName]; + [self.teamDictionary writeToFile:teamFile atomically:YES]; + [teamFile release]; - 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); + DLog(@"%@",teamDictionary); isWriteNeeded = NO; - [teamFile release]; } #pragma mark - @@ -203,6 +136,25 @@ return rows; } +-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { + NSString *sectionTitle = nil; + switch (section) { + case 0: + sectionTitle = NSLocalizedString(@"Team Name", @""); + break; + case 1: + sectionTitle = NSLocalizedString(@"Names and Hats", @""); + break; + case 2: + sectionTitle = NSLocalizedString(@"Team Preferences", @""); + break; + default: + DLog(@"Nope"); + break; + } + return sectionTitle; +} + -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier0 = @"Cell0"; static NSString *CellIdentifier1 = @"Cell1"; @@ -210,79 +162,48 @@ NSArray *hogArray; UITableViewCell *cell = nil; + EditableCellView *editableCell = nil; NSInteger row = [indexPath row]; UIImage *accessoryImage; switch ([indexPath section]) { case 0: - cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier0]; - if (cell == nil) { - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault + editableCell = (EditableCellView *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier0]; + if (editableCell == nil) { + editableCell = [[[EditableCellView 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]; + editableCell.delegate = self; + editableCell.tag = TEAMNAME_TAG; } - 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; - } - } + editableCell.imageView.image = nil; + editableCell.accessoryType = UITableViewCellAccessoryNone; + editableCell.textField.text = self.teamName; + + cell = editableCell; break; case 1: - cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier1]; - if (cell == nil) { - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault + editableCell = (EditableCellView *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier1]; + if (editableCell == nil) { + editableCell = [[[EditableCellView 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]; + editableCell.delegate = self; + editableCell.tag = [indexPath row]; } hogArray = [self.teamDictionary objectForKey:@"hedgehogs"]; + // draw the hat on top of the hog 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)]; + editableCell.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; + editableCell.textField.text = [[hogArray objectAtIndex:row] objectForKey:@"hogname"]; + editableCell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; + + cell = editableCell; break; case 2: cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2]; @@ -339,7 +260,6 @@ NSInteger row = [indexPath row]; NSInteger section = [indexPath section]; UITableViewController *nextController = nil; - UITableViewCell *cell; if (2 == section) { switch (row) { @@ -380,20 +300,15 @@ [self.navigationController pushViewController:nextController animated:YES]; [nextController release]; } else { - cell = [aTableView cellForRowAtIndexPath:indexPath]; - for (UIView *oneView in cell.contentView.subviews) { - if ([oneView isMemberOfClass:[UITextField class]]) { - textFieldBeingEdited = (UITextField *)oneView; - [textFieldBeingEdited becomeFirstResponder]; - } - } + EditableCellView *cell = (EditableCellView *)[aTableView cellForRowAtIndexPath:indexPath]; + [cell replyKeyboard]; [aTableView deselectRowAtIndexPath:indexPath animated:NO]; } } // action to perform when you want to change a hog hat --(void) tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath { +-(void) tableView:(UITableView *)aTableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath { if (nil == hogHatViewController) { hogHatViewController = [[HogHatViewController alloc] initWithStyle:UITableViewStyleGrouped]; } @@ -402,6 +317,10 @@ hogHatViewController.teamDictionary = self.teamDictionary; hogHatViewController.selectedHog = [indexPath row]; + // if we are editing the field undo any change before proceeding + EditableCellView *cell = (EditableCellView *)[aTableView cellForRowAtIndexPath:indexPath]; + [cell cancel:nil]; + [self.navigationController pushViewController:hogHatViewController animated:YES]; } @@ -409,9 +328,7 @@ #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) @@ -424,11 +341,11 @@ flagsViewController = nil; if (levelViewController.view.superview == nil) levelViewController = nil; + MSG_MEMCLEAN(); } -(void) viewDidUnload { self.teamDictionary = nil; - self.textFieldBeingEdited = nil; self.teamName = nil; self.normalHogSprite = nil; self.secondaryItems = nil; @@ -443,7 +360,6 @@ -(void) dealloc { [teamDictionary release]; - [textFieldBeingEdited release]; [teamName release]; [normalHogSprite release]; [secondaryItems release];