Blob Blame History Raw
/*
 controller for screen settings selection
 
 Copyright 2013 Thincast Technologies GmbH, Author: Martin Fleisz
 
 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. 
 If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

#import "ScreenSelectionController.h"
#import "Utils.h"
#import "OrderedDictionary.h"
#import "ConnectionParams.h"

@interface ScreenSelectionController (Private)
-(NSString*)keyPathForKey:(NSString*)key;
@end

@implementation ScreenSelectionController

- (id)initWithConnectionParams:(ConnectionParams*)params
{
    return [self initWithConnectionParams:params keyPath:nil];
}

- (id)initWithConnectionParams:(ConnectionParams*)params keyPath:(NSString*)keyPath
{
    self = [super initWithStyle:UITableViewStyleGrouped];
    if (self)
    {
        _params = [params retain];
        _keyPath = (keyPath != nil ? [keyPath retain] : nil);
 
        _color_options = (OrderedDictionary*)[SelectionForColorSetting() retain];
        _resolution_modes = [ResolutionModes() retain];
        
        // init current selections
        NSUInteger idx = [_color_options indexForValue:[NSNumber numberWithInt:[_params intForKeyPath:[self keyPathForKey:@"colors"]]]];
        _selection_color = (idx != NSNotFound) ? idx : 0;

        idx = [_resolution_modes indexOfObject:ScreenResolutionDescription([_params intForKeyPath:[self keyPathForKey:@"screen_resolution_type"]],
                                    [_params intForKeyPath:[self keyPathForKey:@"width"]],
                                    [_params intForKeyPath:[self keyPathForKey:@"height"]])];
        _selection_resolution = (idx != NSNotFound) ? idx : 0;
    }
    return self;    
}

- (void)dealloc
{
    [super dealloc];
    [_params autorelease];
    [_keyPath autorelease];
    [_color_options autorelease];
    [_resolution_modes autorelease];
}

-(NSString*)keyPathForKey:(NSString*)key
{
    if (_keyPath)
        return [_keyPath stringByAppendingFormat:@".%@", key];
    return key;
}

#pragma mark - View lifecycle

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return YES;
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 2;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    if (section == 0)
        return [_color_options count];
    return [_resolution_modes count] + 2; // +2 for custom width/height input fields
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = nil;
    switch ([indexPath section])
    {
        case 0:
            cell = [self tableViewCellFromIdentifier:TableCellIdentifierMultiChoice];
            [[cell textLabel] setText:[_color_options keyAtIndex:[indexPath row]]];        
            break;
            
        case 1:
            if ([indexPath row] < [_resolution_modes count])
            {
                cell = [self tableViewCellFromIdentifier:TableCellIdentifierMultiChoice];   
                [[cell textLabel] setText:[_resolution_modes objectAtIndex:[indexPath row]]];        
            }
            else
                cell = [self tableViewCellFromIdentifier:TableCellIdentifierText];
            break;
            
        default:
            break;
    }
    
    if ([indexPath section] == 1)
    {
        BOOL enabled = ([_params intForKeyPath:[self keyPathForKey:@"screen_resolution_type"]] == TSXScreenOptionCustom);
        if ([indexPath row] == [_resolution_modes count])
        {
            int value = [_params intForKeyPath:[self keyPathForKey:@"width"]];
            EditTextTableViewCell* textCell = (EditTextTableViewCell*)cell;
            [[textCell label] setText:NSLocalizedString(@"Width", @"Custom Screen Width")];
            [[textCell textfield] setText:[NSString stringWithFormat:@"%d", value ? value : 800]];
            [[textCell textfield] setKeyboardType:UIKeyboardTypeNumberPad];
            [[textCell label] setEnabled:enabled];
            [[textCell textfield] setEnabled:enabled];
            [[textCell textfield] setTag:1];
        }
        else if ([indexPath row] == ([_resolution_modes count] + 1))
        {
            int value = [_params intForKeyPath:[self keyPathForKey:@"height"]];
            EditTextTableViewCell* textCell = (EditTextTableViewCell*)cell;
            [[textCell label] setText:NSLocalizedString(@"Height", @"Custom Screen Height")];
            [[textCell textfield] setText:[NSString stringWithFormat:@"%d", value ? value : 600]];
            [[textCell textfield] setKeyboardType:UIKeyboardTypeNumberPad];
            [[textCell label] setEnabled:enabled];
            [[textCell textfield] setEnabled:enabled];
            [[textCell textfield] setTag:2];
        }
    }
	
	// set default checkmark
	if([indexPath row] == ([indexPath section] == 0 ? _selection_color : _selection_resolution))
		[cell setAccessoryType:UITableViewCellAccessoryCheckmark];
	else
		[cell setAccessoryType:UITableViewCellAccessoryNone];
	
    return cell;
}

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // custom widht/height cells are not selectable
    if ([indexPath section] == 1 && [indexPath row] >= [_resolution_modes count])
        return;
    
	// has selection change?
    int cur_selection = ([indexPath section] == 0 ? _selection_color : _selection_resolution);
	if([indexPath row] != cur_selection)
	{
		[tableView deselectRowAtIndexPath:indexPath animated:NO];
		
		NSIndexPath* oldIndexPath = [NSIndexPath indexPathForRow:cur_selection inSection:[indexPath section]];
        
		// clear old checkmark
		UITableViewCell* old_sel_cell = [tableView cellForRowAtIndexPath:oldIndexPath];
		old_sel_cell.accessoryType = UITableViewCellAccessoryNone;
        
		// set new checkmark
		UITableViewCell* new_sel_cell = [tableView cellForRowAtIndexPath:indexPath];
		new_sel_cell.accessoryType = UITableViewCellAccessoryCheckmark;
        
        if ([indexPath section] == 0)
        {
            // get value from color dictionary
            int sel_value = [[_color_options valueForKey:[_color_options keyAtIndex:[indexPath row]]] intValue];
            
            // update selection index and params value
            [_params setInt:sel_value forKeyPath:[self keyPathForKey:@"colors"]];
            _selection_color = [indexPath row];
        }
        else
        {
            // update selection index and params value
            int width, height;
            TSXScreenOptions mode;
            ScanScreenResolution([_resolution_modes objectAtIndex:[indexPath row]], &width, &height, &mode);
            [_params setInt:mode forKeyPath:[self keyPathForKey:@"screen_resolution_type"]];
            if (mode != TSXScreenOptionCustom)
            {
                [_params setInt:width forKeyPath:[self keyPathForKey:@"width"]];
                [_params setInt:height forKeyPath:[self keyPathForKey:@"height"]];                
            }
            _selection_resolution = [indexPath row];

            // refresh width/height edit fields if custom selection changed
            NSArray* indexPaths = [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:[_resolution_modes count] inSection:1], 
                                                            [NSIndexPath indexPathForRow:([_resolution_modes count] + 1) inSection:1], nil];
            [[self tableView] reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
        }
    }    
}

#pragma mark -
#pragma mark Text Field delegate

- (BOOL)textFieldShouldReturn:(UITextField*)textField
{
	[textField resignFirstResponder];
	return NO;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
   
	switch([textField tag])
	{            
            // update resolution settings (and check for invalid input)
		case 1:
            if ([[textField text] intValue] < 640) [textField setText:@"640"];
			[_params setInt:[[textField text] intValue] forKeyPath:[self keyPathForKey:@"width"]];
			break;
            
		case 2:
            if ([[textField text] intValue] < 480) [textField setText:@"480"];
			[_params setInt:[[textField text] intValue] forKeyPath:[self keyPathForKey:@"height"]];
			break;
                        
		default:
			break;
	}
	return YES;
}

@end