// // MenuTableViewController.m // DUREX Vendor Control // // Created by Imanol Barba on 5/23/14. // Copyright (c) 2014 Emmoco. All rights reserved. // #import "MenuTableViewController.h" @interface MenuTableViewController () { IBOutlet UIActivityIndicatorView *_activityIndicator; NSTimer *_writeTimer; } @property (nonatomic,strong) const NSMutableArray *menuElements; @property (nonatomic,strong) const NSMutableArray *menuStructure; @property (nonatomic,strong) const NSMutableArray *menuHeaders; @property (nonatomic,strong) const NSMutableArray *maintenanceElements; @property (nonatomic,strong) const NSMutableArray *maintenanceStructure; @property (nonatomic,strong) const NSMutableArray *maintenanceHeaders; @property (nonatomic,strong) const NSMutableArray *saleListElements; @property (nonatomic,strong) const NSMutableArray *saleListStructure; @property (nonatomic,strong) const NSMutableArray *saleListHeaders; @property (nonatomic,strong) const NSMutableArray *saleElements; @property (nonatomic,strong) const NSMutableArray *saleStructure; @property (nonatomic,strong) const NSMutableArray *saleHeaders; @property (nonatomic,strong) const NSMutableArray *configElements; @property (nonatomic,strong) const NSMutableArray *configStructure; @property (nonatomic,strong) const NSMutableArray *configHeaders; @property (nonatomic,strong) const NSArray *cellIdentifiers; @property (nonatomic,strong) CommunicationProtocol* protocol; @property uint8_t currentNavLevel; @property NSString *currentCellIdentifier; @property const NSMutableArray *currentElements; @property const NSMutableArray *currentStructure; @property const NSMutableArray *currentHeaders; @end @implementation MenuTableViewController - (id)initWithStyle:(UITableViewStyle)style { self = [super initWithStyle:style]; if (self) { // Custom initialization } return self; } - (void) initializeMenuEntries { [self setMenuElements:[[NSMutableArray alloc] initWithObjects:MENU_ELEMENTS, nil]]; [self setMenuStructure:[[NSMutableArray alloc] initWithObjects:MENU_CELLS_PER_SECTION, nil]]; if([[self menuStructure] count] > 1) { [self setMenuHeaders:[[NSMutableArray alloc] initWithObjects:MENU_HEADERS, nil]]; } else { [self setMenuHeaders:nil]; } [self setConfigElements:[[NSMutableArray alloc] initWithObjects:CONFIGURATION_ELEMENTS, nil]]; [self setConfigStructure:[[NSMutableArray alloc] initWithObjects:CONFIGURATION_CELLS_PER_SECTION, nil]]; if([[self configStructure] count] > 1) { [self setConfigHeaders:[[NSMutableArray alloc] initWithObjects:CONFIGURATION_HEADERS, nil]]; } else { [self setConfigHeaders:nil]; } [self setCellIdentifiers:[[NSArray alloc] initWithObjects:CELL_IDENTIFIERS, nil]]; } - (Boolean) generateMaintenanceLevel { //Initialize sensor status [self setSensorStatus:[[Sensors alloc]init]]; NSString *sensorData = [_protocol readSensorData]; if(sensorData == nil) { NSLog(@"[MenuTableViewController.m]: Error reading sensor data"); return FALSE; } [[self sensorStatus] setResponseValue:sensorData]; [self setMaintenanceElements:[[NSMutableArray alloc] initWithObjects:MAINTENANCE_ELEMENTS, nil]]; [self setMaintenanceStructure:[[NSMutableArray alloc] initWithObjects:MAINTENANCE_CELLS_PER_SECTION, nil]]; if([[self maintenanceStructure] count] > 1) { [self setMaintenanceHeaders:[[NSMutableArray alloc] initWithObjects:MAINTENANCE_HEADERS, nil]]; } else { [self setMaintenanceHeaders:nil]; } return TRUE; } - (Boolean) generateSaleListNavLevel { //Initialize sales log [self setSalesLog:[[SalesLog alloc]init]]; //LAUNCH DATE RANGE SELECTOR NSString *salesData = [_protocol readSalesLog: nil : nil]; if(salesData == nil) { NSLog(@"[MenuTableViewController.m]: Error reading sales log"); return FALSE; } [[self salesLog] setResponseValue:salesData]; NSMutableArray *dateArray = [[NSMutableArray alloc] init]; for(int i = 0; i < [[[self salesLog] sales]count]; i++) { Sale *currentSale = [[[self salesLog] sales]objectAtIndex:i]; NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit; NSDateComponents *components = [calendar components:units fromDate:[currentSale saleTime]]; [dateArray insertObject:[NSString stringWithFormat:@"[%d%d%d%d%d]%02d/%02d/%d %02d:%02d",[components day],[components month],[components year],[components hour],[components minute],[components day],[components month],[components year],[components hour],[components minute]] atIndex:i]; } [self setSaleListElements:[[NSMutableArray alloc] initWithArray:dateArray]]; [self setSaleListStructure:[[NSMutableArray alloc] initWithObjects:[NSNumber numberWithInt:[dateArray count]], nil]]; [self setSaleListHeaders:nil]; return TRUE; } - (Boolean) generateSaleNavLevel : (NSInteger) numSale { [self setSaleElements:[[NSMutableArray alloc] initWithObjects:SALE_ELEMENTS, nil]]; [self setSaleStructure:[[NSMutableArray alloc] initWithObjects:SALE_CELLS_PER_SECTION, nil]]; if([[self saleStructure] count] > 1) { [self setSaleHeaders:[[NSMutableArray alloc] initWithObjects:SALE_HEADERS, nil]]; } else { [self setSaleHeaders:nil]; } [self setCurrentSale:[[[self salesLog]sales]objectAtIndex:numSale]]; return TRUE; } - (void) changeNavLevel: (uint8_t) level : (BOOL) push { NSLog(@"[MenuTableViewController.m]: navLevel is %d",level); if(push) { [[self parentLayout] push: [NSNumber numberWithUnsignedChar:self.currentNavLevel]]; } [self setCurrentNavLevel:level]; [self setCurrentCellIdentifier:[[self cellIdentifiers] objectAtIndex:[self currentNavLevel]]]; if([self currentNavLevel] == MENU) { [self setMachineMACAddr:[[[EMConnectionManager sharedManager] connectedDevice] name]]; [[self navigationItem] setTitle:[self machineMACAddr]]; [self setCurrentElements:[self menuElements]]; [self setCurrentStructure:[self menuStructure]]; [self setCurrentHeaders:[self menuHeaders]]; } else if([self currentNavLevel] == MAINTENANCE) { [[self navigationItem] setTitle:NSLocalizedString(@"Maintenance", nil)]; [self setCurrentElements:[self maintenanceElements]]; [self setCurrentStructure:[self maintenanceStructure]]; [self setCurrentHeaders:[self maintenanceHeaders]]; } else if([self currentNavLevel] == SALE_LIST) { [[self navigationItem] setTitle:NSLocalizedString(@"Sales log", nil)]; [self setCurrentElements:[self saleListElements]]; [self setCurrentStructure:[self saleListStructure]]; [self setCurrentHeaders:[self saleListHeaders]]; } else if([self currentNavLevel] == SALE) { NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit; NSDateComponents *components = [calendar components:units fromDate:[[self currentSale] saleTime]]; [[self navigationItem] setTitle:[NSString stringWithFormat:@"%@ %02d/%02d/%d %02d:%02d",NSLocalizedString(@"Sale on", nil),[components day],[components month],[components year],[components hour],[components minute]]]; [self setCurrentElements:[self saleElements]]; [self setCurrentStructure:[self saleStructure]]; [self setCurrentHeaders:[self saleHeaders]]; } else if([self currentNavLevel] == BASIC_CONFIGURATION) { [[self navigationItem] setTitle:NSLocalizedString(@"Basic Configuration", nil)]; [self setCurrentElements:[self configElements]]; [self setCurrentStructure:[self configStructure]]; [self setCurrentHeaders:[self configHeaders]]; } //AND SO ON... NSLog(@"MenuTableViewController.m]: New elements: %@",[self currentElements]); NSLog(@"MenuTableViewController.m]: New structure: %@",[self currentStructure]); NSLog(@"MenuTableViewController.m]: New headers: %@",[self currentHeaders]); NSLog(@"MenuTableViewController.m]: New cell identifier: %@",[self currentCellIdentifier]); [self reloadTable:UITableViewRowAnimationAutomatic]; } - (void) reloadTable: (UITableViewRowAnimation) animation { [[self tableView] reloadData]; NSRange range = NSMakeRange(0, [self numberOfSectionsInTableView:[self tableView]]); NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:range]; [[self tableView] reloadSections:sections withRowAnimation:animation]; } - (void) navBack { NSNumber *prevLevel = [[self parentLayout] pop]; self.currentNavLevel = prevLevel.intValue; [self changeNavLevel: prevLevel.intValue : FALSE]; } - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { NSString *title = @""; if([self currentHeaders] != nil) { title = [[self currentHeaders] objectAtIndex:section]; } return title; } - (void) backButtonPressed: (id) sender { NSLog(@"[MenuTableViewController.m]: Navigation Stack has %ld remaining levels",(long)[[self parentLayout] count]); if([[self parentLayout] count] > 0) { NSLog(@"[MenuTableViewController.m]: Falling to previous navigation level"); [self navBack]; } else { NSLog(@"[MenuTableViewController.m]: No more navigation levels in stack, falling to previous view"); [self.navigationController popViewControllerAnimated:YES]; } } - (void) sendMaintenanceReport : (NSString*) status : (NSString*) date : (NSString*) machineid { NSString *content = [NSString stringWithFormat:@"status=%@&date=%@&machineid=%@",status,date,machineid]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:REPORT_SERVER_URL]]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:[content dataUsingEncoding:NSUTF8StringEncoding]]; // generates an autoreleased NSURLConnection [NSURLConnection connectionWithRequest:request delegate:self]; } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { // Append the new data to receivedData. // receivedData is an instance variable declared elsewhere. NSLog(@"[MenuTableViewController.m]: Received response from report server: %@",[NSString stringWithUTF8String:[data bytes]]); [self.view makeToast:NSLocalizedString(@"Report sent successfully", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Success!", nil) image:[UIImage imageNamed:@"icon_checkmark"]]; } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"[MenuTableViewController.m]: Error connecting to server: %@ %@",[error localizedDescription],[[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]); [self.view makeToast:NSLocalizedString(@"Connection to server failed", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Error", nil) image:[UIImage imageNamed:@"icon_delete"]]; } - (void)viewDidLoad { [super viewDidLoad]; [_activityIndicator setHidden:YES]; //Set navigation bar UIImage *backImage = [UIImage imageNamed:@"back_arrow.png"]; UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom]; backButton.frame = CGRectMake(0, 0, backImage.size.width/2, backImage.size.height/2); [backButton setImage:backImage forState:UIControlStateNormal]; [backButton addTarget:self action:@selector(backButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; self.navigationItem.hidesBackButton = YES; self.navigationItem.leftBarButtonItem = backBarButtonItem; //Emmoco protocol initialization _protocol = [CommunicationProtocol sharedProtocol]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveNotification:) name:kEMConnectionDidReceiveIndicatorNotificationName object:nil]; [[EMConnectionManager sharedManager] addObserver:self forKeyPath:@"connectionState" options:0 context:NULL]; //Initialize parentLayout stack [self setParentLayout:[[Stack alloc]init]]; //Set navigation level [self initializeMenuEntries]; self.currentNavLevel = 255; [self changeNavLevel:MENU:FALSE]; } -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; //DUREX protocol if(![_protocol establishConnection]) { UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Communication error" message:@"Error while trying to connect to the device" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; UIViewController *previous = [[[self navigationController] viewControllers] objectAtIndex:[[[self navigationController] viewControllers] count]-2]; [[self navigationController] popToViewController:previous animated:YES]; } } -(void)didReceiveNotification:(NSNotification*) notification { } -(void)dealloc { [[EMConnectionManager sharedManager] removeObserver:self forKeyPath:@"connectionState"]; [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (object == [EMConnectionManager sharedManager]) { if ([keyPath isEqualToString:@"connectionState"]) { if ([[EMConnectionManager sharedManager] connectionState] == EMConnectionStateDisrupted) { [[self navigationController] popToRootViewControllerAnimated:YES]; } } } } #pragma mark - Table view delegate - (void) addTags : (NSMutableArray*) rows : (NSInteger) tag { for(int i = 0; i < [rows count]; i++) { NSMutableString *name = [NSMutableString stringWithString:[rows objectAtIndex:i]]; [name insertString:[NSString stringWithFormat:@"[%d]",tag] atIndex:1]; [rows replaceObjectAtIndex:i withObject:name]; } } - (void) toggleDropList : (NSIndexPath*) index { Boolean folded = FALSE; NSString *elementName = [[self currentElements] objectAtIndex:index.row]; NSMutableString *newElementName = [[NSMutableString alloc] init]; if([elementName characterAtIndex:0] == '>') { [newElementName setString:@"v"]; [newElementName appendString:[elementName substringFromIndex:1]]; folded = TRUE; } else { [newElementName setString:@">"]; [newElementName appendString:[elementName substringFromIndex:1]]; } [[self currentElements] replaceObjectAtIndex:index.row withObject:newElementName]; NSMutableString *cellName = [NSMutableString stringWithString:[elementName substringFromIndex:1]]; NSInteger lastPos = [cellName rangeOfString:@"]"].location; NSInteger cellTag = [[cellName substringWithRange:NSMakeRange(1,lastPos)] intValue]; [cellName setString:[cellName substringFromIndex:lastPos+1]]; //Cells in MENU if([self currentNavLevel] == MAINTENANCE) { if([cellName isEqualToString:@"Channels Present"] || [cellName isEqualToString:@"Product Present in Channel"] || [cellName isEqualToString:@"Channel Engine Status"]) { NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_CHANNELS, nil]; [newRows setArray:[newRows subarrayWithRange:NSMakeRange(0, [[self sensorStatus] numChannels])]]; if(folded) { [self addTags: newRows : cellTag]; [self addRowsAtIndexPath: newRows : index]; } else { [self removeRowsAtIndexPath: [newRows count] : index]; } } else if([cellName isEqualToString:@"Money Collected"]) { NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_MONEY_IN, nil]; if(folded) { [self addTags: newRows : cellTag]; [self addRowsAtIndexPath: newRows : index]; } else { [self removeRowsAtIndexPath: [newRows count] : index]; } } else if([cellName isEqualToString:@"Money Returned"]) { NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_MONEY_OUT, nil]; if(folded) { [self addTags: newRows : cellTag]; [self addRowsAtIndexPath: newRows : index]; } else { [self removeRowsAtIndexPath: [newRows count] : index]; } } else if([cellName isEqualToString:@"Products Sold"]) { NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_PRODUCTS, nil]; if(folded) { [self addTags: newRows : cellTag]; [self addRowsAtIndexPath: newRows : index]; } else { [self removeRowsAtIndexPath: [newRows count] : index]; } } else if([cellName isEqualToString:@"Change Available"]) { NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_CHANGE, nil]; if(folded) { [self addTags: newRows : cellTag]; [self addRowsAtIndexPath: newRows : index]; } else { [self removeRowsAtIndexPath: [newRows count] : index]; } } } else if([self currentNavLevel] == SALE) { if([cellName isEqualToString:@"Money Paid"]) { NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:SALE_MONEY_PAID, nil]; if(folded) { [self addTags: newRows : cellTag]; [self addRowsAtIndexPath: newRows : index]; } else { [self removeRowsAtIndexPath: [newRows count] : index]; } } else if([cellName isEqualToString:@"Money Returned"]) { NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:SALE_MONEY_RETURNED, nil]; if(folded) { [self addTags: newRows : cellTag]; [self addRowsAtIndexPath: newRows : index]; } else { [self removeRowsAtIndexPath: [newRows count] : index]; } } } [self reloadTable:UITableViewRowAnimationNone]; } - (void) addRowsAtIndexPath : (NSArray*) rows : (NSIndexPath*) indexPath { NSIndexSet *indexSet = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange([indexPath row] + 1, [rows count])]; [[self currentElements] insertObjects:rows atIndexes:indexSet]; [[self currentStructure] replaceObjectAtIndex:[indexPath section] withObject:[NSNumber numberWithInt:([[[self currentStructure] objectAtIndex:[indexPath section]] intValue] + [rows count])]]; } - (void) removeRowsAtIndexPath : (NSUInteger) numRows : (NSIndexPath*) indexPath { NSIndexSet *indexSet = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange([indexPath row] + 1, numRows)]; [[self currentElements] removeObjectsAtIndexes:indexSet]; [[self currentStructure] replaceObjectAtIndex:[indexPath section] withObject:[NSNumber numberWithInt:([[[self currentStructure] objectAtIndex:[indexPath section]] intValue] - numRows)]]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [[[self currentStructure] objectAtIndex:section] intValue]; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"Section: %ld Row: %ld",(long)[indexPath section],(long)[indexPath row]); [tableView deselectRowAtIndexPath:indexPath animated:YES]; UITableViewCell *cell = [[self tableView] cellForRowAtIndexPath:indexPath]; NSString *cellName = [[cell textLabel]text]; //Cells in MENU if([self currentNavLevel] == MENU) { if([cellName isEqualToString:NSLocalizedString(@"Maintenance", nil)]) { NSLog(@"[MenuTableViewController.m]: Changing to navLevel: MAINTENANCE"); if([self generateMaintenanceLevel]) { [NSThread sleepForTimeInterval:1]; [self changeNavLevel:MAINTENANCE:TRUE]; } else { NSLog(@"[MenuTableViewController.m]: Error while changing to navLevel: MAINTENANCE"); } } else if([cellName isEqualToString:NSLocalizedString(@"Basic Configuration", nil)]) { NSLog(@"[MenuTableViewController.m]: Changing to navLevel: BASIC_CONFIGURATION"); [self changeNavLevel:BASIC_CONFIGURATION:TRUE]; } else if([cellName isEqualToString:NSLocalizedString(@"Sending a Report", nil)]) { } } //Cells in MAINTENANCE else if([self currentNavLevel] == MAINTENANCE) { if([cellName isEqualToString:NSLocalizedString(@"Channels Present", nil)] || [cellName isEqualToString:NSLocalizedString(@"Product Present in Channel", nil)] || [cellName isEqualToString:NSLocalizedString(@"Channel Engine Status", nil)] || [cellName isEqualToString:NSLocalizedString(@"Money Collected", nil)] || [cellName isEqualToString:NSLocalizedString(@"Money Returned", nil)] || [cellName isEqualToString:NSLocalizedString(@"Products Sold", nil)] || [cellName isEqualToString:NSLocalizedString(@"Change Available", nil)]) { [self toggleDropList:indexPath]; } else if([cellName isEqualToString:NSLocalizedString(@"Sales log", nil)]) { [NSThread sleepForTimeInterval:1]; NSLog(@"[MenuTableViewController.m]: Changing to navLevel: SALE_LIST"); if([self generateSaleListNavLevel]) { [self changeNavLevel:SALE_LIST:TRUE]; } else { NSLog(@"[MenuTableViewController.m]: Error while changing to navLevel: SALE_LIST"); } } else if([cellName isEqualToString:NSLocalizedString(@"Send report", nil)]) { NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; NSDateComponents *components = [calendar components:units fromDate:[NSDate date]]; NSString *date = [NSString stringWithFormat:@"%02d/%02d/%d %02d:%02d:%02d",[components day],[components month],[components year],[components hour],[components minute],[components second]]; [self sendMaintenanceReport: [[self sensorStatus] response] : date: [self machineMACAddr]]; } } //Cells in BASIC_CONFIGURATION else if([self currentNavLevel] == BASIC_CONFIGURATION) { //Update Date & Time command if([cellName isEqualToString:NSLocalizedString(@"Update Date & Time", nil)]) { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { self.datePickerViewController = [[DatePickerViewController alloc] initWithNibName:@"DatePickerViewController_iPad" bundle:nil]; self.datePickerViewController.delegate = self; [self.datePickerViewController showInView:self.navigationController.view animated:YES]; } else { self.datePickerViewController = [[DatePickerViewController alloc] initWithNibName:@"DatePickerViewController" bundle:nil]; self.datePickerViewController.delegate = self; [self.datePickerViewController showInView:self.navigationController.view animated:YES]; } } //Update Product Price command else if([cellName isEqualToString:NSLocalizedString(@"Update product price", nil)]) { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { self.priceChangerViewController = [[PriceChangerViewController alloc] initWithNibName:@"PriceChangerViewController_iPad" bundle:nil]; self.priceChangerViewController.delegate = self; [self.priceChangerViewController showInView:self.navigationController.view animated:YES]; } else { self.priceChangerViewController = [[PriceChangerViewController alloc] initWithNibName:@"PriceChangerViewController" bundle:nil]; self.priceChangerViewController.delegate = self; [self.priceChangerViewController showInView:self.navigationController.view animated:YES]; } } //Update Product Name command else if([cellName isEqualToString:NSLocalizedString(@"Update product name", nil)]) { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { self.nameChangerViewController = [[NameChangerViewController alloc] initWithNibName:@"NameChangerViewController_iPad" bundle:nil]; self.nameChangerViewController.delegate = self; [self.nameChangerViewController showInView:self.navigationController.view animated:YES]; } else { self.nameChangerViewController = [[NameChangerViewController alloc] initWithNibName:@"NameChangerViewController" bundle:nil]; self.nameChangerViewController.delegate = self; [self.nameChangerViewController showInView:self.navigationController.view animated:YES]; } } } else if([self currentNavLevel] == SALE_LIST) { if([self generateSaleNavLevel: [indexPath row]]) { [self changeNavLevel:SALE:TRUE]; } } else if([self currentNavLevel] == SALE) { if([cellName isEqualToString:NSLocalizedString(@"Money Paid", nil)] || [cellName isEqualToString:NSLocalizedString(@"Money Returned", nil)]) { [self toggleDropList:indexPath]; } } } #pragma mark - Table view data source -(NSInteger)tableView: (UITableView *)tableView indentationLevelForRowAtIndexPath: (NSIndexPath *)indexPath { NSInteger indent = 0; if([[[self currentElements] objectAtIndex:indexPath.row] characterAtIndex:0] == '*') { indent++; } return indent; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [[self currentStructure] count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { Boolean needsIndent = FALSE; Boolean foldedList = FALSE; Boolean unfoldedList = FALSE; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[self currentCellIdentifier] forIndexPath:indexPath]; //INSTANTIATE CELL IF NEEDED if (cell == nil) { NSLog(@"[MenuTableViewController.m]: Initializing cell"); if([self currentNavLevel] == MAINTENANCE) { NSLog(@"[MenuTableViewController.m]: Dispatching Maintenance-type cell"); cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:[self currentCellIdentifier]]; } else { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[self currentCellIdentifier]]; } } //CALCULATE TRUE ROW TO RETRIEVE NAME uint8_t offset = 0; if([indexPath section] ) { for (int i = 0; i < [indexPath section]; i++) { offset += [[[self currentStructure] objectAtIndex:i] unsignedCharValue]; } } //RETRIEVE NAME NSMutableString *cellText = [NSMutableString stringWithString:[[self currentElements] objectAtIndex:[indexPath row]+offset]]; //SET INDENT [cell setIndentationWidth:10]; //PARSE AND REMOVE CELL MODIFIER if([cellText characterAtIndex:0] == '>') { foldedList = TRUE; [cellText setString:[cellText substringFromIndex:1]]; } else if([cellText characterAtIndex:0] == 'v') { unfoldedList = TRUE; [cellText setString:[cellText substringFromIndex:1]]; } else if([cellText characterAtIndex:0] == '*') { needsIndent = TRUE; [cellText setString:[cellText substringFromIndex:1]]; } //PARSE AND REMOVE TAG NSInteger lastPos = [cellText rangeOfString:@"]"].location; NSInteger cellTag = [[cellText substringWithRange:NSMakeRange(1,lastPos)] intValue]; [cell setTag:cellTag]; [cellText setString:[cellText substringFromIndex:lastPos+1]]; //SET FINAL TEXT [[cell textLabel] setText:NSLocalizedString(cellText,nil)]; //MAINTENANCE CELLS if([self currentNavLevel] == MAINTENANCE) { [[[cell contentView] viewWithTag:CELL_CARAT_TAG] removeFromSuperview]; [[cell detailTextLabel] setText:@""]; [cell setAccessoryView:nil]; [cell setAccessoryType:UITableViewCellAccessoryNone]; if(foldedList) { NSInteger cellHeight = cell.contentView.frame.size.height; UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,cellHeight/2 - (11/2),11,11)]; imageView.image = [UIImage imageNamed:@"carat.png"]; imageView.tag = CELL_CARAT_TAG; [cell.contentView addSubview:imageView]; } else if(unfoldedList) { NSInteger cellHeight = cell.contentView.frame.size.height; UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,cellHeight/2 - (11/2),11,11)]; imageView.image = [UIImage imageNamed:@"carat-open.png"]; imageView.tag = CELL_CARAT_TAG; [cell.contentView addSubview:imageView]; } if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Channels Present",nil)]) { [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%d",[[self sensorStatus] numChannels]]]; [cell setAccessoryView:nil]; } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Product Present in Channel",nil)]) { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]]; for(int i = 0; i < [[self sensorStatus] numChannels]; i++) { if([[[[self sensorStatus] channelProductAvailability] objectAtIndex:i] intValue] != 1) { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]]; break; } } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Channel Engine Status",nil)]) { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]]; for(int i = 0; i < [[self sensorStatus] numChannels]; i++) { if([[[[self sensorStatus] channelStatus] objectAtIndex:i] intValue] != 1) { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]]; break; } } } else if([[NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"%@ (\\d+)",NSLocalizedString(@"Channel",nil)] options:0 error:NULL] numberOfMatchesInString:[[cell textLabel] text] options:0 range:(NSMakeRange(0,[[[cell textLabel] text] length]))] != 0) { NSUInteger index = [[[[cell textLabel] text] substringFromIndex:([NSLocalizedString(@"Channel",nil) length] + 1)] intValue] - 1; if([cell tag] == 2001) // Products Present in Channel tag { if([[[[self sensorStatus] channelProductAvailability] objectAtIndex:index] intValue] == 1) { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]]; } else { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]]; } } else if([cell tag] == 2002) // Channel engine status tag { if([[[[self sensorStatus] channelStatus] objectAtIndex:index] intValue] == 1) { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]]; } else { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]]; } } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Door Sensor",nil)]) { if([[self sensorStatus] doorOpen]) { [[cell detailTextLabel] setText:NSLocalizedString(@"OPEN",nil)]; [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]]; } else { [[cell detailTextLabel] setText:NSLocalizedString(@"CLOSED",nil)]; [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Coil Sensor",nil)]) { if([[self sensorStatus] coilOpen]) { [[cell detailTextLabel] setText:NSLocalizedString(@"OPEN",nil)]; [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]]; } else { [[cell detailTextLabel] setText:NSLocalizedString(@"CLOSED",nil)]; [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Money Collected",nil)]) { double numCollected = 0; numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:0] intValue] * 20; numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:1] intValue] * 10; numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:2] intValue] * 5; numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:3] intValue] * 2; numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:4] intValue] * 1; numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:5] intValue] * 0.50; [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%.2f",numCollected]]; } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Money Returned",nil)]) { double numReturned = 0; numReturned += [[[[self sensorStatus] moneyReturned] objectAtIndex:0] intValue] * 2; numReturned += [[[[self sensorStatus] moneyReturned] objectAtIndex:1] intValue] * 1; numReturned += [[[[self sensorStatus] moneyReturned] objectAtIndex:2] intValue] * 0.50; [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%.2f",numReturned]]; } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Products Sold",nil)]) { NSInteger numSold = 0; for(int i = 0; i < MAX_PRODUCTS; i++) { numSold += [[[[self sensorStatus] productsSold] objectAtIndex:i] intValue]; } [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%d",numSold]]; } else if([[NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"%@ (\\d+)",NSLocalizedString(@"Product",nil)] options:0 error:NULL] numberOfMatchesInString:[[cell textLabel] text] options:0 range:(NSMakeRange(0,[[[cell textLabel] text] length]))] != 0) { NSUInteger index = [[[[cell textLabel] text] substringFromIndex:([NSLocalizedString(@"Product",nil) length] + 1)] intValue] - 1; if([cell tag] == 2007) { [[cell detailTextLabel] setText:[[[[self sensorStatus] productsSold] objectAtIndex:index] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Change Available",nil)]) { [[cell detailTextLabel] setText:@""]; [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]]; for(int i = 0; i < CHANGE_NUM_UNITS; i++) { if([[[[self sensorStatus] changeAvailable] objectAtIndex:i] intValue] != 1) { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]]; break; } } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"20€ Notes",nil)]) { if([cell tag] == 2005) { [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:0] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"10€ Notes",nil)]) { if([cell tag] == 2005) { [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:1] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"5€ Notes",nil)]) { if([cell tag] == 2005) { [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:2] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"2€ Coins",nil)]) { if([cell tag] == 2005) { [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:3] stringValue]]; } else if([cell tag] == 2006) { [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyReturned] objectAtIndex:0] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"1€ Coins",nil)]) { if([cell tag] == 2005) { [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:4] stringValue]]; } else if([cell tag] == 2006) { [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyReturned] objectAtIndex:1] stringValue]]; } else if([cell tag] == 2008) { if([[[[self sensorStatus] changeAvailable] objectAtIndex:0] intValue] == 1) { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]]; } else { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]]; } } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"50c Coins",nil)]) { if([cell tag] == 2005) { [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:5] stringValue]]; } else if([cell tag] == 2006) { [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyReturned] objectAtIndex:2] stringValue]]; } else if([cell tag] == 2008) { if([[[[self sensorStatus] changeAvailable] objectAtIndex:1] intValue] == 1) { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]]; } else { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]]; } } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Sales log",nil)] || [[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Incident report",nil)] || [[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Send report",nil)]) { [[cell detailTextLabel] setText:@""]; [cell setAccessoryView:nil]; [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; } } else if([self currentNavLevel] == SALE) { [[[cell contentView] viewWithTag:CELL_CARAT_TAG] removeFromSuperview]; [[cell detailTextLabel] setText:@""]; [cell setAccessoryView:nil]; [cell setAccessoryType:UITableViewCellAccessoryNone]; if(foldedList) { NSInteger cellHeight = cell.contentView.frame.size.height; UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,cellHeight/2 - (11/2),11,11)]; imageView.image = [UIImage imageNamed:@"carat.png"]; imageView.tag = CELL_CARAT_TAG; [cell.contentView addSubview:imageView]; } else if(unfoldedList) { NSInteger cellHeight = cell.contentView.frame.size.height; UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,cellHeight/2 - (11/2),11,11)]; imageView.image = [UIImage imageNamed:@"carat-open.png"]; imageView.tag = CELL_CARAT_TAG; [cell.contentView addSubview:imageView]; } if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Money Paid",nil)]) { double numCollected = 0; numCollected += [[[[self currentSale] moneyPaid] objectAtIndex:0] intValue] * 20; numCollected += [[[[self currentSale] moneyPaid] objectAtIndex:1] intValue] * 10; numCollected += [[[[self currentSale] moneyPaid] objectAtIndex:2] intValue] * 5; numCollected += [[[[self currentSale] moneyPaid] objectAtIndex:3] intValue] * 2; numCollected += [[[[self currentSale] moneyPaid] objectAtIndex:4] intValue] * 1; numCollected += [[[[self currentSale] moneyPaid] objectAtIndex:5] intValue] * 0.50; [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%.2f",numCollected]]; [cell setAccessoryView:nil]; } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Channel",nil)]) { [[cell detailTextLabel] setText:[[self currentSale] channel]]; [cell setAccessoryView:nil]; } if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Product Code",nil)]) { [[cell detailTextLabel] setText:[[self currentSale] productCode]]; [cell setAccessoryView:nil]; } if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Product Price",nil)]) { [[cell detailTextLabel] setText:[[self currentSale] normalPrice]]; [cell setAccessoryView:nil]; } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Money Returned",nil)]) { double numReturned = 0; numReturned += [[[[self currentSale] moneyReturned] objectAtIndex:0] intValue] * 2; numReturned += [[[[self currentSale] moneyReturned] objectAtIndex:1] intValue] * 1; numReturned += [[[[self currentSale] moneyReturned] objectAtIndex:2] intValue] * 0.50; [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%.2f",numReturned]]; [cell setAccessoryView:nil]; } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"20€ Notes",nil)]) { if([cell tag] == 3000) { [[cell detailTextLabel] setText:[[[[self currentSale] moneyPaid] objectAtIndex:0] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"10€ Notes",nil)]) { if([cell tag] == 3000) { [[cell detailTextLabel] setText:[[[[self currentSale] moneyPaid] objectAtIndex:1] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"5€ Notes",nil)]) { if([cell tag] == 3000) { [[cell detailTextLabel] setText:[[[[self currentSale] moneyPaid] objectAtIndex:2] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"2€ Coins",nil)]) { if([cell tag] == 3000) { [[cell detailTextLabel] setText:[[[[self currentSale] moneyPaid] objectAtIndex:3] stringValue]]; } else if([cell tag] == 3004) { [[cell detailTextLabel] setText:[[[[self currentSale] moneyReturned] objectAtIndex:0] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"1€ Coins",nil)]) { if([cell tag] == 3000) { [[cell detailTextLabel] setText:[[[[self currentSale] moneyPaid] objectAtIndex:4] stringValue]]; } else if([cell tag] == 3004) { [[cell detailTextLabel] setText:[[[[self currentSale] moneyReturned] objectAtIndex:1] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"50c Coins",nil)]) { if([cell tag] == 3000) { [[cell detailTextLabel] setText:[[[[self currentSale] moneyPaid]objectAtIndex:5] stringValue]]; } else if([cell tag] == 3004) { [[cell detailTextLabel] setText:[[[[self currentSale] moneyReturned] objectAtIndex:2] stringValue]]; } } } return cell; } - (void)passDateViewController:(DatePickerViewController *)controller didFinishEnteringItem:(NSDate *)date { NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; NSDateComponents *components = [calendar components:units fromDate:date]; NSLog(@"[MenuTableViewController.m]: %@", components); [_protocol updateTime: components]; } - (void)passPriceViewController:(PriceChangerViewController *)controller didFinishEnteringItem:(NSArray *)data { NSLog(@"[MenuTableViewController.m]: %@", data); //Channel,Code,Price int channel = [[data objectAtIndex:0] intValue]; int code = [[data objectAtIndex:1] intValue]; NSArray *price = [[data objectAtIndex:2] componentsSeparatedByString:@","]; [_protocol updatePrice:channel :code :[[price objectAtIndex:0] intValue] :[[price objectAtIndex:1] intValue]]; } - (void)passNameViewController:(PriceChangerViewController *)controller didFinishEnteringItem:(NSArray *)data { NSLog(@"[MenuTableViewController.m]: %@", data); //Channel,Code,Name int channel = [[data objectAtIndex:0] intValue]; int code = [[data objectAtIndex:1] intValue]; NSString *name = [data objectAtIndex:2]; [_protocol updateProductName:channel :code :name]; } @end