FreeRDP/client/iOS/Controllers/AdvancedBookmarkEditorController.m
2013-12-04 11:44:22 +01:00

350 lines
13 KiB
Objective-C

/*
Controller to edit advanced bookmark settings
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 "AdvancedBookmarkEditorController.h"
#import "Bookmark.h"
#import "Utils.h"
#import "EditorSelectionController.h"
#import "ScreenSelectionController.h"
#import "PerformanceEditorController.h"
#import "BookmarkGatewaySettingsController.h"
@interface AdvancedBookmarkEditorController ()
@end
#define SECTION_ADVANCED_SETTINGS 0
#define SECTION_COUNT 1
@implementation AdvancedBookmarkEditorController
- (id)initWithBookmark:(ComputerBookmark*)bookmark
{
if ((self = [super initWithStyle:UITableViewStyleGrouped]))
{
// set additional settings state according to bookmark data
_bookmark = [bookmark retain];
_params = [bookmark params];
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self setTitle:NSLocalizedString(@"Advanced Settings", @"Advanced Settings title")];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
// we need to reload the table view data here to have up-to-date data for the
// advanced settings accessory items (like for resolution/color mode settings)
[[self tableView] reloadData];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return YES;
}
#pragma mark -
#pragma mark Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return SECTION_COUNT;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
switch (section)
{
case SECTION_ADVANCED_SETTINGS: // advanced settings
return 9;
default:
break;
}
return 0;
}
// set section headers
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
switch(section)
{
case SECTION_ADVANCED_SETTINGS:
return NSLocalizedString(@"Advanced", @"'Advanced': advanced settings header");
}
return @"unknown";
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// determine the required cell type
NSString* cellType = nil;
switch([indexPath section])
{
case SECTION_ADVANCED_SETTINGS: // advanced settings
{
switch([indexPath row])
{
case 0: // Enable/Disable TSG Settings
cellType = TableCellIdentifierYesNo;
break;
case 1: // TS Gateway Settings
cellType = TableCellIdentifierSubEditor;
break;
case 2: // 3G Settings
cellType = TableCellIdentifierYesNo;
break;
case 3: // 3G screen/color depth
cellType = TableCellIdentifierSelection;
break;
case 4: // 3G performance settings
cellType = TableCellIdentifierSubEditor;
break;
case 5: // security mode
cellType = TableCellIdentifierSelection;
break;
case 6: // remote program
case 7: // work dir
cellType = TableCellIdentifierText;
break;
case 8: // console mode
cellType = TableCellIdentifierYesNo;
break;
default:
break;
}
break;
}
}
NSAssert(cellType != nil, @"Couldn't determine cell type");
// get the table view cell
UITableViewCell *cell = [self tableViewCellFromIdentifier:cellType];
NSAssert(cell, @"Invalid cell");
// set cell values
switch([indexPath section])
{
// advanced settings
case SECTION_ADVANCED_SETTINGS:
[self initAdvancedSettings:indexPath cell:cell];
break;
default:
break;
}
return cell;
}
// updates advanced settings in the UI
- (void)initAdvancedSettings:(NSIndexPath*)indexPath cell:(UITableViewCell*)cell
{
BOOL enable_3G_settings = [_params boolForKey:@"enable_3g_settings"];
switch(indexPath.row)
{
case 0:
{
EditFlagTableViewCell* flagCell = (EditFlagTableViewCell*)cell;
[[flagCell label] setText:NSLocalizedString(@"Enable TS Gateway", @"'Enable TS Gateway': Bookmark enable TSG settings")];
[[flagCell toggle] setTag:GET_TAG_FROM_PATH(indexPath)];
[[flagCell toggle] setOn:[_params boolForKey:@"enable_tsg_settings"]];
[[flagCell toggle] addTarget:self action:@selector(toggleSettingValue:) forControlEvents:UIControlEventValueChanged];
break;
}
case 1:
{
BOOL enable_tsg_settings = [_params boolForKey:@"enable_tsg_settings"];
EditSubEditTableViewCell* editCell = (EditSubEditTableViewCell*)cell;
[[editCell label] setText:NSLocalizedString(@"TS Gateway Settings", @"'TS Gateway Settings': Bookmark TS Gateway Settings")];
[[editCell label] setEnabled:enable_tsg_settings];
[editCell setSelectionStyle:enable_tsg_settings ? UITableViewCellSelectionStyleBlue : UITableViewCellSelectionStyleNone];
break;
}
case 2:
{
EditFlagTableViewCell* flagCell = (EditFlagTableViewCell*)cell;
[[flagCell label] setText:NSLocalizedString(@"3G Settings", @"'3G Settings': Bookmark enable 3G settings")];
[[flagCell toggle] setTag:GET_TAG_FROM_PATH(indexPath)];
[[flagCell toggle] setOn:[_params boolForKey:@"enable_3g_settings"]];
[[flagCell toggle] addTarget:self action:@selector(toggleSettingValue:) forControlEvents:UIControlEventValueChanged];
break;
}
case 3:
{
EditSelectionTableViewCell* selCell = (EditSelectionTableViewCell*)cell;
[[selCell label] setText:NSLocalizedString(@"3G Screen", @"'3G Screen': Bookmark 3G Screen settings")];
NSString* resolution = ScreenResolutionDescription([_params intForKeyPath:@"settings_3g.screen_resolution_type"], [_params intForKeyPath:@"settings_3g.width"], [_params intForKeyPath:@"settings_3g.height"]);
int colorBits = [_params intForKeyPath:@"settings_3g.colors"];
[[selCell selection] setText:[NSString stringWithFormat:@"%@@%d", resolution, colorBits]];
[[selCell label] setEnabled:enable_3G_settings];
[[selCell selection] setEnabled:enable_3G_settings];
[selCell setSelectionStyle:enable_3G_settings ? UITableViewCellSelectionStyleBlue : UITableViewCellSelectionStyleNone];
break;
}
case 4:
{
EditSubEditTableViewCell* editCell = (EditSubEditTableViewCell*)cell;
[[editCell label] setText:NSLocalizedString(@"3G Performance", @"'3G Performance': Bookmark 3G Performance Settings")];
[[editCell label] setEnabled:enable_3G_settings];
[editCell setSelectionStyle:enable_3G_settings ? UITableViewCellSelectionStyleBlue : UITableViewCellSelectionStyleNone];
break;
}
case 5:
{
EditSelectionTableViewCell* selCell = (EditSelectionTableViewCell*)cell;
[[selCell label] setText:NSLocalizedString(@"Security", @"'Security': Bookmark protocl security settings")];
[[selCell selection] setText:ProtocolSecurityDescription([_params intForKey:@"security"])];
break;
}
case 6:
{
EditTextTableViewCell* textCell = (EditTextTableViewCell*)cell;
[[textCell label] setText:NSLocalizedString(@"Remote Program", @"'Remote Program': Bookmark remote program settings")];
[[textCell textfield] setText:[_params StringForKey:@"remote_program"]];
[[textCell textfield] setTag:GET_TAG_FROM_PATH(indexPath)];
[[textCell textfield] setPlaceholder:NSLocalizedString(@"not set", @"not set placeholder")];
[self adjustEditTextTableViewCell:textCell];
break;
}
case 7:
{
EditTextTableViewCell* textCell = (EditTextTableViewCell*)cell;
[[textCell label] setText:NSLocalizedString(@"Working Directory", @"'Working Directory': Bookmark working directory settings")];
[[textCell textfield] setText:[_params StringForKey:@"working_dir"]];
[[textCell textfield] setTag:GET_TAG_FROM_PATH(indexPath)];
[[textCell textfield] setPlaceholder:NSLocalizedString(@"not set", @"not set placeholder")];
[self adjustEditTextTableViewCell:textCell];
break;
}
case 8:
{
EditFlagTableViewCell* flagCell = (EditFlagTableViewCell*)cell;
[[flagCell label] setText:NSLocalizedString(@"Console Mode", @"'Console Mode': Bookmark console mode settings")];
[[flagCell toggle] setTag:GET_TAG_FROM_PATH(indexPath)];
[[flagCell toggle] setOn:[_params boolForKey:@"console"]];
[[flagCell toggle] addTarget:self action:@selector(toggleSettingValue:) forControlEvents:UIControlEventValueChanged];
break;
}
default:
NSLog(@"Invalid row index in settings table!");
break;
}
}
#pragma mark -
#pragma mark Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UIViewController* viewCtrl = nil;
// determine view
switch ([indexPath row])
{
case 1:
if ([_params boolForKey:@"enable_tsg_settings"])
viewCtrl = [[[BookmarkGatewaySettingsController alloc] initWithBookmark:_bookmark] autorelease];
break;
case 3:
if ([_params boolForKey:@"enable_3g_settings"])
viewCtrl = [[[ScreenSelectionController alloc] initWithConnectionParams:_params keyPath:@"settings_3g"] autorelease];
break;
case 4:
if ([_params boolForKey:@"enable_3g_settings"])
viewCtrl = [[[PerformanceEditorController alloc] initWithConnectionParams:_params keyPath:@"settings_3g"] autorelease];
break;
case 5:
viewCtrl = [[[EditorSelectionController alloc] initWithConnectionParams:_params entries:[NSArray arrayWithObject:@"security"] selections:[NSArray arrayWithObject:SelectionForSecuritySetting()]] autorelease];
break;
default:
break;
}
// display view
if(viewCtrl)
[[self navigationController] pushViewController:viewCtrl animated:YES];
}
#pragma mark -
#pragma mark Text Field delegate
- (BOOL)textFieldShouldReturn:(UITextField*)textField
{
[textField resignFirstResponder];
return NO;
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
switch(textField.tag)
{
// update remote program/work dir settings
case GET_TAG(SECTION_ADVANCED_SETTINGS, 6):
{
[_params setValue:[textField text] forKey:@"remote_program"];
break;
}
case GET_TAG(SECTION_ADVANCED_SETTINGS, 7):
{
[_params setValue:[textField text] forKey:@"working_dir"];
break;
}
default:
break;
}
return YES;
}
#pragma mark - Action handlers
- (void)toggleSettingValue:(id)sender
{
UISwitch* valueSwitch = (UISwitch*)sender;
switch(valueSwitch.tag)
{
case GET_TAG(SECTION_ADVANCED_SETTINGS, 0):
{
[_params setBool:[valueSwitch isOn] forKey:@"enable_tsg_settings"];
NSArray* indexPaths = [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:1 inSection:SECTION_ADVANCED_SETTINGS], [NSIndexPath indexPathForRow:2 inSection:SECTION_ADVANCED_SETTINGS], nil];
[[self tableView] reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
break;
}
case GET_TAG(SECTION_ADVANCED_SETTINGS, 2):
{
[_params setBool:[valueSwitch isOn] forKey:@"enable_3g_settings"];
NSArray* indexPaths = [NSArray arrayWithObjects:[NSIndexPath indexPathForRow:3 inSection:SECTION_ADVANCED_SETTINGS], [NSIndexPath indexPathForRow:2 inSection:SECTION_ADVANCED_SETTINGS], nil];
[[self tableView] reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
break;
}
case GET_TAG(SECTION_ADVANCED_SETTINGS, 8):
[_params setBool:[valueSwitch isOn] forKey:@"console"];
break;
default:
break;
}
}
@end