//
//  SetupViewController.m
//  X-BASIC'
//
//  Created by AIG-Soft on 2012/8/13
//  Copyright 2012-2015 AIG-Soft. All rights reserved.
//

#import "AppDelegate.h"
#import "SetupViewController.h"
#import	"RootViewController.h"
#import "Setup.h"
#import "libs.h"
#import "click.h"
#import "main.h"
#import "UIActivityIndicatorView+show.h"
#import "NSString+substringWithRange2.h"

@interface SetupViewController()
{
	AppDelegate *app;
	Setup		*setup;
	//
	id 			retTarget;
	SEL 		retAction;
}
@end

@implementation SetupViewController

//--------------------------------------------
// 初期化処理
//--------------------------------------------

/// viewDidLoad前に呼び出されることもあるので注意
-(void)open:(id)target retSelector:(SEL)selector
{
	printSelf();

	retTarget=target;
	retAction=selector;
}

//----------------------------------------------------
// 基本画面のTableView制御
//----------------------------------------------------

#pragma mark -
#pragma mark View lifecycle

- (void)viewDidLoad
{
	printSelf();
	//
	clickStop(); // ビューが表示され終わるまでクリック音を止める；これをしないと、セグメントとスイッチへの設定時にクリック音がなってしまう
	//
    [super viewDidLoad];

	app=getAppDelegate();
	setup=app.setup;

	frame0=self.view.frame; // popoverのサイズを設定するために保存:iPhone用のそれを使う
//	frame0.size=self.view.frame.size; // 自分のサイズを保存
	
	// 各Viewはメモリ節約のため利用時に読み込む
	self.pickerview	=nil;
	
	// Navigationの設定
	self.title=NSLocalStr(@"SETUP");
	UIBarButtonItem *tempBarItem=[[UIBarButtonItem alloc]
								  initWithTitle:NSLocalizedString(@"SAVE",@"保存")
								  style:UIBarButtonItemStyleDone
								  target:retTarget
								  action:retAction];
	self.navigationItem.leftBarButtonItem=tempBarItem;
	self.fclosePopover=NO; // 画面は開いてない
	
	//
	NSArray *basic  =@[cellMaxStringLength,cellVariableAutoDeclear,cellForcedSHIFTJISMode,cellEnableSprite,cellEnableX68,cellEnableOlder,cellErrorCodeFopen];
	NSArray *general=@[cellListFont];
	//
	// sectionsと同じ順にすること
	objects	=@[basic,general];
	//
	// セクション名の設定
	// ここの定義順を変えるときは、.hのSection＊も変更すること
	// objectsと同じ順にすること
	// これがセクションを区切るkey名になるので、同じ物があると同じ分の幅が取られる
	sections = @[NSLocalStr(@"BASIC"),NSLocalStr(@"GENERAL")];
	dataSource=[[NSDictionary alloc]initWithObjects:objects forKeys:sections];
	//
	// 表示項目用
	cols=[[NSMutableArray alloc]init];
	
	// 空白のセルを消す
	UIView *view = [[UIView alloc] initWithFrame:CGRectZero];
	view.backgroundColor = [UIColor clearColor];
	[self.tableView setTableFooterView:view];
}

-(void)viewWillAppear:(BOOL)animated
{
	[super viewWillAppear:animated];

	self.preferredContentSize=frame0.size; // サイズを戻す(これが重要)

	// 設定内容再現
	segForcedSHIFTJISMode.selectedSegmentIndex=setup.fsjis;
	segErrorCodeFopen.selectedSegmentIndex=setup.ferrorCodeFopen;
	swVariableAutoDeclear.on=setup.fundefVarInt;
	swEnableSprite.on		=setup.fsprite;
	swEnableX68.on			=setup.fX68;
	swEnableOlder.on		=setup.fOlder;
}

-(void)viewDidAppear:(BOOL)animated
// ビューが表示された
{
	printSelf();
	[super viewDidAppear:animated];
	// これ以降クリック音を鳴らす(かもしれない)
	clickResume();
	self.fclosePopover=NO; // 画面を表示したの印
}

-(void)viewDidDisappear:(BOOL)animated
// ビューが消えた
{
	[super viewDidDisappear:animated];
	self.fclosePopover=YES; // もう画面は閉じたの印
}

//-----------------------------------------------------
// switch/segment
//-----------------------------------------------------

// 各スイッチON/OFF
-(IBAction)updateSwitch:(id)sender
{
	UISwitch *sw=(UISwitch *)sender;
	nslog(@"updateSwitch=%d:%d",(int)sw.tag,sw.on);
	clickSound();
	switch (sw.tag) {
		default: // 警告回避のため
		case SW_Variable_auto_declear:
			setup.fundefVarInt=sw.on;
			break;
		case SW_Enable_Sprite:
			setup.fsprite=sw.on;
			break;
		case SW_Enable_X68:
			setup.fX68=sw.on;
			break;
		case SW_Enable_Older:
			setup.fOlder=sw.on;
			break;
	}
}

-(IBAction)updateSegment:(id)sender
{
	UISegmentedControl *seg=(UISegmentedControl *)sender;
	nslog(@"updateSegment=%d:%d",(int)seg.tag,(int)seg.selectedSegmentIndex);
	clickSound();
	switch (seg.tag) {
		default: // 警告回避のため
		case SEG_Forced_SHIFTJIS_mode:
			setup.fsjis=seg.selectedSegmentIndex;
			break;
		case SEG_Error_Code_Fopen:
			setup.ferrorCodeFopen=seg.selectedSegmentIndex;
			break;
	}
}

//-----------------------------------------------------
// テーブル処理
//-----------------------------------------------------

#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
// セクション数を返す
{
    // Return the number of sections.
    return [sections count];
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
// セクションごとの名前を返す
{
	return sections[section];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
// セクションごとの行数を返す
{
	id key=sections[section];
	return [dataSource[key]count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
	id key=sections[indexPath.section]; // セクション名がキーとなる
	return dataSource[key][indexPath.row];
}

#if 0 // テスト用
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
// セクション名をインデックスとして表示する
{
	return sections;
}
#endif


// セル内にアクセサリとしてつけたボタンが選択された
// アクセサリとしてつけたボタンは外部に現れないので、IBでは接続できない
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
	nslog(@"セル選択=%@",indexPath);
	
	// ここにない項目は、直接ターゲットで処理される
	// close側で使うため、選択位置を保存
	// 本当はindexPathをまるごと保存すれば楽だが、メモリーを使う上にエラーが出るので整数化して記録
	idx_row		=indexPath.row;
	idx_section	=indexPath.section;
	switch (idx_section) {
		case SectionBASIC:
			switch (idx_row) {
				case RowMaxStringLength:
				{ // switch内の変数宣言のため
					[self setMaxStrlens];
					self.pickerview = [[PickerView alloc]init];
					[self.pickerview initPickerView:self retSelector:@selector(closePickerView:)
										 title:cellMaxStringLength.label.text
										  cols:cols
									 selectRow:(NSUInteger)length2Kou((int)setup.sz_str)
					 ];
					self.pickerview.preferredContentSize=self.pickerview.view.frame.size; // poppverのサイズ合わせ(なくても良さそうだけど念のため)
					// 子画面呼び出し
					clickSound();
					[self.navigationController pushViewController:self.pickerview animated:YES];
				} // switch内の変数宣言のため
					break;
			}
			break;
		case SectionGeneral:
			switch (idx_row) {
				case RowFont:
				{
					// ちょっと時間がかかるので回しておく
					UIActivityIndicatorView *indicator=[UIActivityIndicatorView show:self.tableView style:UIActivityIndicatorViewStyleWhiteLarge fbackground:YES];
					//
					self.fontSelect = [[FontSelect alloc]initWithNibName:@"PickerView" bundle:[NSBundle mainBundle]]; // fontSelectはPickerViewを使って開く
					[_fontSelect initFontSelect:self selector:@selector(closeFontSelect:) name:setup.fontName title:NSLocalStr(@"FONT")];
					[_fontSelect setNextButtonAction:NSLocalStr(@"FONTSIZE")];
					[_fontSelect nextButtonHidden:NO];

					// サンプル文字の設定;文章の先頭1文字
					[_fontSelect setSample:[app.rootViewController.editorView.editor.text substringToIndex2:1]];
					//
					[indicator dismiss];
				}
					// 子画面呼び出し
					clickSound(); // クリック音
					_fontSelect.preferredContentSize=_fontSelect.view.frame.size; // poppverのサイズ合わせ(これが重要)
					[self.navigationController pushViewController:_fontSelect animated:YES];
					break;
			}
			break;
	}
}

//-----------------------------------------------------
// 最大文字列長設定用
//-----------------------------------------------------

static const int maxStrlens[]={16,32,64,128,256,512,1024,0}; // 0=end of table

// 最大文字列長用項目作成
-(void)setMaxStrlens
{
	[cols removeAllObjects]; // 毎回一から再作成
	//
	@autoreleasepool {
		NSUInteger i=0;
		while (maxStrlens[i]!=0) {
			// V3.00で、表示は、文字列ワークサイズではなく文字列長(バイト)に変更
			NSString *szStr=[NSString stringWithFormat:@"%d%@",maxStrlens[i]-1,NSLocalStr(@"BYTES")];
			[cols addObject:szStr];
			nslog(@"szStr=%@",szStr);
			i++;
		}
	}
}

// 長さから要素番号を得る
// len = setup.st_strであり、文字列長+1である
int length2Kou(int len)
{
	int i=0;
	while (maxStrlens[i]!=0) {
		if (len==maxStrlens[i]) break; // 要素番号
		i++;
	}
	return (i);
}

//----------------------------------------------------
// 閉じ処理
//-----------------------------------------------------

// pickerviewを閉じる(1段目）
-(void)closePickerView:(id)sender
{
	printSelf();
	
	// 選択値を読み出す(pickerを開放してしまうので、その前に)
	switch (idx_section) {
		case SectionBASIC:
			switch (idx_row) {
				case RowMaxStringLength:
					nslog(@"RowMaxStringLength:selectRow=%d",(int)self.pickerview.selectRow);
					setup.sz_str=maxStrlens[self.pickerview.selectRow];
					break;
			}
			break;
		//
#if 0	// closeFontSelect:を呼ぶようにしているのでここには来ない
		case SectionGeneral:
			switch (idx_row) {
				case RowFont:
					nslog(@"RowFont=%d",pickerview.selectRow);
					break;
			}
			break;
#endif
	}
	
	// 画面を閉じる
	clickSound(); // クリック音
	[self.navigationController popToViewController:self animated:YES];
	
	nslog(@"closePickerView end");
}

// fontSelectを閉じる
-(void)closeFontSelect:(id)sender
{
	printSelf();
	//
	// 選択値を読み出す(pickerを開放してしまうので、その前に)
	setup.fontName	=[_fontSelect no2FontName:_fontSelect.nameNo];
	
	// 画面を閉じる
	clickSound(); // クリック音
	[self.navigationController popToViewController:self animated:YES];

	nslog(@"closeFontSelect end");
}

//-----------------------------------------------------
// 画面回転
//-----------------------------------------------------

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
// 回転検出：回転前
{
	printSelfs(@"Orientation=%d",(int)interfaceOrientation);
	understandOrientation(interfaceOrientation); // 画面方向を記録
	// interfaceOrientationは新しい方向
	switch (interfaceOrientation) {
		default:
		case UIInterfaceOrientationPortrait:
		case UIInterfaceOrientationPortraitUpsideDown:
			nslog(@"縦方向");
			break;
		case UIInterfaceOrientationLandscapeLeft:
		case UIInterfaceOrientationLandscapeRight:
			nslog(@"横方向");
			break;
	}
}

// 画面を回転して良いかどうか
-(BOOL)shouldAutorotate
{
	printSelf();
	return shouldAutorotateByMain();
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
	printSelf();
	return (supportedInterfaceOrientationsByMain());
}

//-----------------------------------------------------
// メモリ系
//-----------------------------------------------------

#pragma mark -
#pragma mark Memory management

#ifdef DEBUG
- (void)didReceiveMemoryWarning
{
	printSelf();
	[super didReceiveMemoryWarning];
    
    // Relinquish ownership any cached data, images, etc. that aren't in use.
}

#endif

- (void)dealloc
{
	printSelf();
	self.fclosePopover=NO;
}

@end

