freerdp/client/iOS/Controllers/AdvancedBookmarkEditorContr...

408 lines
12 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