//
//  SetupViewController.m
//  ZeroRec/Komadori
//
//  Created by AIG-Soft on 11/02/24.
//  Copyright 2011 AIG-Soft. All rights reserved.
//

#import "AppDelegate.h"
#import "SetupViewController.h"
#import "PickerView.h"
#import "Setup.h"
#import "libs.h"
#import "click.h"
#import "FileControl2.h"
#import "Log.h"				// これはUSE_LOGにかかわらず読み込むこと
#import "main.h"
#ifdef	USE_COLORSELECT
#import	"ColorSelect.h"
#endif
#ifdef	USE_TIMER
#import "TimerView.h"
#endif
#ifdef	USE_SETUPOUTPUT
#import "ListupView.h"
#endif
#ifdef	USE_COUNT
#import "CounterView.h"
#endif
#ifdef	USE_LOG
#import	"GeneratePdf.h"
#endif
#if defined(USE_ALARM)
#import "AlarmSource.h"
#endif

@interface SetupViewController()
<
PickerViewDelegate
#ifdef USE_TIMER
,TimerViewDelegate
#endif
#ifdef USE_COLORSELECT
,ColorSelectDelegate
#endif
>
{
	AppDelegate *app;
	Setup *setup;
}

@end

@implementation SetupViewController

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

#pragma mark -
#pragma mark View lifecycle

-(void)viewDidAppear:(BOOL)animated
{
	printSelf();
	[super viewDidAppear:animated];
	// これ以降クリック音を鳴らす(かもしれない)
	clickResume();
}

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

	// iOS7で、viewの下にあるUIScrollViewを内包するUI要素(UITableView/UIScrollView/UIWebViewなど)のスクロール開始位置が勝手にずらされるのを禁止する
	// IBの設定でNaviをnoneしている場合は不要だけど、setupVCはUITableVCを直接継承しているのでIB上でNaviをつけていても無意味
//	self.automaticallyAdjustsScrollViewInsets=NO;

	app=getAppDelegate();
	setup=app.setup;
	
	// この中はviewがまだ読まれてない状態なのでview要素への設定・参照は全て無効
	
	// 各Viewはメモリ節約のため利用時に読み込む
#ifdef	USE_SETUPOUTPUT
	mail		=nil;
#endif
#if defined(USE_ALARM)
	[setup.rotationControl readSettings:GRAPHFILE]; // 主にSETUP出力用
#endif
	// Navigationの設定
	// setupSaveButtonを通すためNavigation標準の戻るボタンを消す
	UIBarButtonItem *tempBarItem	=[[UIBarButtonItem alloc]
									  initWithTitle:NSLocalizedString(@"SAVE",@"保存")
									  style:UIBarButtonItemStyleDone
									  target:self
									  action:@selector(setupSaveButton:)];
	self.navigationItem.leftBarButtonItem=tempBarItem;

#if defined(USE_LOG) || defined(USE_SETUPOUTPUT)
	tempBarItem=	[[UIBarButtonItem alloc]
#ifdef USE_LOG
					 initWithTitle:NSLocalizedString(@"LOG" ,@"ログ")
#else
					 initWithTitle:NSLocalizedString(@"LIST",@"設定出力")
#endif
					 style:UIBarButtonItemStyleDone
					 target:self
					 action:@selector(openListupView:)]; // action名は:まで入るので注意！
	self.navigationItem.rightBarButtonItem=tempBarItem;
#endif	// USE_LOG || USE_SETUPOUTPUT
	//
#ifdef USE_NSHOT
	cellAlarmPost.textLabel.text	=NSLocalStr(@"NSHOTPOST");
	cellFalarm1file.textLabel.text	=NSLocalStr(ALARMFILE);
	[cellFalarm1file.textLabel sizeToFit];
#endif
	//
	// セクション名の設定
	// ここの定義順を変えるときは、.hのSection＊も変更すること
	// objectsと同じ順にすること
	sections = @[
				NSLocalizedString(@"GENERAL"	,@"全体設定"),
		#ifdef	USE_CONSTANT
				NSLocalizedString(SET_CONSTANT	,@"常時録画"),	// ここはZeroRecとKomadoriで変化する
		#endif
		#if defined(USE_ALARM)||defined(USE_NSHOT)
				NSLocalizedString(SET_ALARM		,@"アラーム"),	// ここはZeroRecとKomadoriで変化する
		#endif
		#ifdef	USE_ETC
				NSLocalizedString(@"ETC"		,@"その他"),
		#endif
				];

	nslog(@"各セクションの項目の作成");
	// 各セクションの項目の作成
	// カメラなし    : iPod3/iPad/iPhone3GSより前	（実機では）サポートしない
	// フラッシュ無し : iPod4/iPhone3GS ただし、Autoへの設定は認められている
	// 前面カメラのみ : iPhone3GS;フラッシュもない
	// カメラ無しのフラッシュありは「ない」
	// 選択不能な項目はここで排除すること（UISegmentのActionはソフト的な更新時にも呼び出されてしまうため)
	UITableViewCell *cellCameraDevice2,*cellCameraFlashMode2;
	cellCameraDevice2	=cellCameraDevice;
	cellCameraFlashMode2=cellCameraFlashMode;
	if (isJIKKI()) {
		// 実機のみ有効；デバッグ中はシミュレーター上で動かすこともあるため
		if (CheckCameraDevice(UIImagePickerControllerCameraDeviceFront)!=UIImagePickerControllerCameraDeviceFront) {
			// 前面カメラが無効の時
			// フラッシュ共々設定を無効にする
			nslog(@"前面カメラ＆フラッシュ無効");
			cellCameraFlashMode2=cellCameraDevice2=nil;
		}
		if (CheckCameraFlashMode(UIImagePickerControllerCameraFlashModeOn)!=UIImagePickerControllerCameraFlashModeOn) {
			// フラッシュがOnできないときはフラッシュ設定を無効にする
			nslog(@"フラッシュ無効");
			cellCameraFlashMode2=nil;
		}
	}
	//
	NSArray *general	=[NSArray arrayWithObjects:
#ifdef USE_TIMER
						  cellTimer,
#endif
#ifdef USE_EXITDELAY
						  cellExitDelay,
#endif
#ifdef USE_BLUETOOTH
						  cellBTConnection,
#endif
						  cellCameraDevice2,cellCameraFlashMode2,nil];	// ここは、cellCameraDevice2,cellCameraFlashMode2ともにnilになることがあるので@[〜]式は使えない
	
	//
#ifdef USE_CONSTANT
	NSArray *constant	=@[cellConstantQuality,cellConstantInterval];
#endif
	//
#if defined(USE_ALARM)
	NSArray *alarm		=@[
							cellAlarmQuality,cellAlarmInterval,
							cellAlarmPost,cellAlarmYokushi,cellFalarmRetigger,cellAlarmLimit,cellAlarmSource,
						#ifdef ZEROREC
							cellFalarm1file,
						#endif
						  ];
#endif
#if defined(USE_NSHOT)
	NSArray *alarm		=@[cellAlarmQuality,cellAlarmInterval,cellAlarmPost,cellFalarm1file];
#endif
	//
#ifdef USE_ETC
	NSArray *etc		=@[
		#ifdef USE_COLORSELECT
						  cellAtrb,
		#endif
						  cellPlaybackSpeed,cellMaxPics,
		#ifdef USE_COUNT
						  cellCounter,
		#endif
						  ];
#endif	// USE_ETC
	//
	// sectionsと同じ順にすること
	objects	=@[general,
		#ifdef USE_CONSTANT
			  constant,
		#endif
		#if defined(USE_ALARM)||defined(USE_NSHOT)
			  alarm,
		#endif
		#ifdef USE_ETC
			  etc,
		#endif
			  ];
	//
	dataSource=[[NSDictionary alloc]initWithObjects:objects forKeys:sections];
	// setupの表示反映
	[self displaySetup];
	// general,constant,etcはここで開放される
}


// 保存して閉じる
-(void)setupSaveButton:(id)sender
{
	printSelf();
	// 設定値保存
	[setup saveSetup];
	// setup変更ログ記録
	setLog(LOG_NAME_SETUP);
	clickSound(); // クリック音
	[self.navigationController popViewControllerAnimated:YES];
}

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

#pragma mark -
#pragma mark Table view data source

// セクション数を返す
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    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];
}

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

//----------------------------------------------------
// setup/録画枚数/ログの文字列化
//----------------------------------------------------

#ifdef USE_SETUPOUTPUT

-(NSString *)getTitleFormCell:(UIView *)baseView
{
//	nslog(@"baseView.subviews=%@",baseView.subviews);
	for (UIView *vw in baseView.subviews) {
		if ([vw isMemberOfClass:[UILabel class]]) {
			UILabel *lbl=(UILabel *)vw;
//			nslog(@"ラベル内text=%@/.tag=%d",lbl.text,lbl.tag);
			if (lbl.tag!=0) {
				// BT接続のみアイコン画像+文字列なので文字列のみに変換
				return NSLocalStr(@"BT_CONNECT");
			}
			return lbl.text;
		}
		if (vw.subviews.count>0) {
			// 再帰呼び出し
			NSString *text=[self getTitleFormCell:vw];
			if (text!=nil) return text;
		}
	}
//	nslog(@"みつからない");
	return nil;
}

// 全設定内容文字列化
-(NSString *)makeSetupText:(UITextView *)textView
{
	NSMutableString *mstr=[[NSMutableString alloc]init];
//	nslog(@"objects=%@",objects);
	NSEnumerator *emu=[objects objectEnumerator];
	NSString *mes,*spc;
	for (NSString *title in sections) {	// sectionsはNSStringの配列
		[mstr appendFormat:@"- %@ -\n",title];
		nslog(@"%@",mstr);
		NSArray *cellary=[emu nextObject]; // objects[i]=general,alarm,constant
		for (UITableViewCell *cell in cellary) {
			// タイトルと実内容の間を空けるスペーサーの作成
//			nslog(@"cell.text=%@",cell.textLabel.text);
			mes=cell.textLabel.text;
			if (mes==nil) {
//				nslog(@"textLabelがない");
				// cell内にswicth/segmentを配置している場合、textLabelに入れたはずの文字列は別途UILabelが作成され格納されているので、ここではnilが返ってきてしまう。
				// そのため、セル内のUILabelを調べて、そこからtextを得るようにする
				mes=[self getTitleFormCell:cell];
			}
			switch (cell.tag) {
				// タイトルが長いので特別処理
				case SETUP_BLUETOOTHSHUTTER:
				case SETUP_PLAYBACKSPEED:
					// 英語時のみ
					if ([[NSLocalStr(@"JP") substringToIndex:1]isEqualToString:@"J"]) {
				case SETUP_ATRBPOSITION:
				case SETUP_MAXPICS:
					[mstr appendFormat:@"%@%@\n",SPC2,mes];
					mes=@"";
				// 通常処理
					}
				default:
					spc=leftString2(mes,NO,textView);
					[mstr appendFormat:@"%@%@",SPC2,spc];
					[setup makeSetupString1:cell.tag mstr:mstr];

#ifdef USE_COLORSELECT
					if (cell.tag==SETUP_ATRBPOSITION) {
						// 色(SETUP_ATRBCOLOR)は位置設定の下にあるのでここで追加(cell.tagでは現れない)
						// RGB比を大体で表示
						// setupViewController makeSetupText:参照のこと
	#if 1
//						spc=leftString2(@"COLOR2",YES,textView);
						[mstr appendFormat:@"%@%@%d\n",SPC2,spc,(int)setup.atrbColor];
	#else	// 旧型；成分表示分が行先頭からになってしまう
						NSUInteger r,g,b;
						b=getColorPercent(setup.atrbColor,&r,&g);
						spc=leftString2(@"COLOR2",YES,textView);
						[mstr appendFormat:@"%@%@%d(%d,%d,%d%%)\n",SPC2,spc,(int)setup.atrbColor,(int)r,(int)g,(int)b];
	#endif
					}
#endif
					
					break;
#if defined(USE_ALARM)
				case SETUP_ALARMSOURCE:
					[setup makeAlarmSource:mstr		textView:textView];
					break;
#endif
#ifdef USE_COUNT
				case SETUP_COUNTER:
					[setup makePicturesCount:mstr	textView:textView];
					break;
#endif
			} // switch
		} // for (cell)		
	} // for (title)
	return mstr;
}

// 全情報文字列化
-(NSString *)makeSetupAndLogText:(UITextView *)textView
{
	printSelf();
	NSMutableString *str=[[NSMutableString alloc]init];
	//
	NSString *str1=[self makeSetupText:textView];
//	nslog(@"str1=%p:%@",str1,str1);
	//
#ifdef USE_LOG
	nslog(@"ログ文字列作成");
	NSString *str3=strLogAll();
//	nslog(@"str3=%p:%@",str3,str3);
	//
	nslog(@"文字列結合");
	[str appendFormat:NSLocalStr(@"SETUPLOG") ,str1,str3];
#else
	[str appendFormat:NSLocalStr(@"SETUPLOG2"),str1];
#endif
//	nslog(@"str=%p",str);
	//
	return str;
}

//----------------------------------------------------

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
	nslog(@"メイル処理終了:result=%d",result);
	// どの様な状態から帰ってきたとしても、画面から消す
	switch (result)
	{
		case MFMailComposeResultCancelled:
			nslog(@"MFMailComposeResultCancelled");
			break;
		case MFMailComposeResultSaved:
			nslog(@"MFMailComposeResultSaved");
			break;
		case MFMailComposeResultSent:
			nslog(@"MFMailComposeResultSent");
			break;
		case MFMailComposeResultFailed:
			nslog(@"MFMailComposeResultFailed:error=%@",error);
			break;
		default:
			nslog(@"状態不明");
			break;
	}
	[controller dismissViewControllerAnimated:YES completion:NULL];
	controller=nil;
//	mail=nil;
}

// 設定の全リスト及びログをe-mailで送信する
-(void)eMailSend:(id)sender
{
	printSelf();
	
	// 今回はメイル用クラスを使う(UINavigationControllerの子クラス)
#if 0	// これは多重送信のチェックではなく、その機種にメイル送信機能があるかどうかなので不要
	if (![MFMailComposeViewController canSendMail]) {
		// メイル送信ができないとき
		Alert1(NSLocalStr(@"MAILERR_TITLE"),NSLocalStr(@"MAILERR_MESSAGE"),nil);
		return;
	}
#endif
	mail=[[MFMailComposeViewController alloc]init];
	mail.mailComposeDelegate=self; // 普通のdelegeteではないので注意
	// 件名
	[mail setSubject:
#ifdef USE_LOG
					NSLocalStr(@"SUBJECT")
#else
	#ifdef USE_COUNT
					NSLocalStr(@"SUBJECT_NOLOG")
	#else
					NSLocalStr(@"SUBJECT_SETTINGONLY")
	#endif
#endif
	 ];
	// メイラーは、subjectが.titleに設定される
	// .titleに別途設定してもだめ。
	
	if (setup.fpdf) {
		// PDFで添付するとき
		// PDF時はここが呼び出される前に(listupView内で)添付ファイルが作られている
		// 一旦ファイルに出力してから再度NSDataに直すという無駄なことをしている(処理を統合するのが面倒だったので)
		nslog(@"添付ファイル=%@",(NSString *)sender);
		[mail setMessageBody:NSLocalStr(@"BODY") isHTML:NO]; // 本文
		NSString *pdfname=makeFullPathForSaveData(PDF_SETUPLOG) ;
		NSData *data=[[NSData alloc]initWithContentsOfFile:pdfname];
		[mail addAttachmentData:data mimeType:@"application/pdf" fileName:PDF_SETUPLOG]; // 添付
#ifndef DEBUG
		fileDelete(pdfname); // 作ったファイルを消す
#endif // デバッグ中は残しておく
	} else {
		// テキストで本文に入れるとき
		NSString *str=[self makeSetupAndLogText:nil]; // 文字列として作成(nslogでの表示はこの中で)
		// しかし、半角スペースはメイル上で何故か（HTMLのように)1文字にまとめられてしまう。
		// 日本語版は全角スペースなので大丈夫だが、英語版の場合は半角スペースを使うためこの問題が起きる
		// これを回避するため、PDF出力を設けた
		[mail setMessageBody:str isHTML:NO];
	}
	[self presentViewController:mail animated:YES completion:nil];
//	[self.navigationController pushViewController:mail animated:YES]; // これはダメ(落ちる)
}

//-----------------------------------------------------

// 設定の全リスト/ログを表示する
-(void)openListupView:(id)sender
{
	printSelf();
	
	ListupView	*listupView = [[ListupView alloc]init];
	[listupView initListupView:self selector:@selector(eMailSend:) fpdf:setup.fpdf];
	
	clickSound(); // クリック音
	[self.navigationController pushViewController:listupView animated:YES];
}

#endif	// USE_SETUPOUTPUT

//-----------------------------------------------------
// Picker処理1:NSTimerInterval用
//-----------------------------------------------------

// pickerを閉じる
-(void)AtPickerViewClose:(PickerView *)pickerView
{
	printSelf();
	
	// 選択値を読み出す
	nslog(@"val[%d]=%f(row=%d)",(int)valueNo,tblValues[pickerView.selectRow],(int)pickerView.selectRow);
	[setup setTmValues:tblValues[pickerView.selectRow] valno:valueNo];
	
	// 値の保存はSETUPメインを閉じるときに行う
}

-(void)openPickerView:(NSString *)title param:(NSTimeInterval *)tbl count:(NSUInteger)cnt valno:(NSUInteger)no fchange:(NSUInteger)fchange fmin:(BOOL)fminute
{
	printSelf();
	nslog(@"%@;cnt=%d",title,(int)cnt);
	
	tblValues=tbl;	// テーブルを登録する
	valueNo=no;
	
	PickerView *pickerView = [[PickerView alloc]init];
	pickerView.delegate=self;
	[pickerView initPickerView:title param:tbl count:cnt fmin:fminute valno:no fchange:fchange];
	
	clickSound(); // クリック音
	[self.navigationController pushViewController:pickerView animated:YES];
}

-(void)openPickerView:(NSString *)title param:(NSTimeInterval *)tbl count:(NSUInteger)cnt valno:(NSUInteger)no fchange:(NSUInteger)fchange
{
	[self openPickerView:title param:tbl count:cnt valno:no fchange:fchange fmin:NO];
}

-(void)openPickerView:(NSString *)title param:(NSTimeInterval *)tbl count:(NSUInteger)cnt valno:(NSUInteger)no
{
	[self openPickerView:title param:tbl count:cnt valno:no fchange:FMT_NONE];
}

//-----------------------------------------------------
// colorSelect処理
//-----------------------------------------------------

#ifdef USE_COLORSELECT
// ColorSelectを閉じる
-(void)AtColorSelectClose:(ColorSelect *)colorSelect
{
	printSelf();

	// 設定値を得る
	setup.atrbColor		=colorSelect.color;
	setup.atrbPosition	=colorSelect.position;
	nslog(@"setup.atrbColor=%u",setup.atrbColor);
	nslog(@"setup.atrbPosition=%u",setup.atrbPosition);

	// 値の保存はSETUPメインを閉じるときに行う
}

-(void)openColorSelect
{
	printSelf();
	
	ColorSelect	*colorSelect = [[ColorSelect alloc]initWithNibName:@"PickerView" bundle:[NSBundle mainBundle]];
	colorSelect.delegate=self;
	[colorSelect initColorSelect:setup.atrbPosition color:setup.atrbColor];
	
	// 子画面呼び出し
	clickSound(); // クリック音
	[self.navigationController pushViewController:colorSelect animated:YES];
}
#endif

//-----------------------------------------------------
// Timer処理
//-----------------------------------------------------

#ifdef USE_TIMER
// Timerを閉じる
-(void)AtTimerViewClose:(TimerView *)timerView
{
	printSelf();
	setup.recStartHour	=getHour([timerView.pickerViewRecStart	selectedRowInComponent:COLUM_HOUR]);
	setup.recStartMin	=getMin( [timerView.pickerViewRecStart	selectedRowInComponent:COLUM_MIN ]);
	setup.recEndHour	=getHour([timerView.pickerViewRecEnd	selectedRowInComponent:COLUM_HOUR]);
	setup.recEndMin		=getMin( [timerView.pickerViewRecEnd	selectedRowInComponent:COLUM_MIN ]);
	// 開始＝終了の時は24時間設定
	nslog(@"start=%02d.%02d/end=%02d.%02d",(int)setup.recStartHour,(int)setup.recStartMin,(int)setup.recEndHour,(int)setup.recEndMin);
}

// 可変項目は呼び出し前に設定しておくこと
-(void)openTimerView:(NSString *)title
{
	printSelf();
	TimerView *timerView = [[TimerView alloc]init];
	[timerView initTimerView:title];
	timerView.delegate=self;
	
	clickSound(); // クリック音
	[self.navigationController pushViewController:timerView animated:YES];
}
#endif	// USE_TIMER

//-----------------------------------------------------
// 録画枚数処理
//-----------------------------------------------------

#ifdef USE_COUNT

// 可変項目は呼び出し前に設定しておくこと
-(void)openCounterView:(NSString *)title
{
	printSelf();
	CounterView *counterView = [[CounterView alloc]init];
	[counterView initCounterView:title];
	
	clickSound(); // クリック音
	[self.navigationController pushViewController:counterView animated:YES];
}
#endif	// USE_COUNT

//-----------------------------------------------------
// アラーム源処理
//-----------------------------------------------------

#if defined(USE_ALARM)

// 可変項目は呼び出し前に設定しておくこと
-(void)openAlarmSourceView:(NSString *)title
{
	printSelf();
	AlarmSource *alarmSource = [[AlarmSource alloc]init];
	[alarmSource initAlarmSource:title];
	
	clickSound(); // クリック音
	[self.navigationController pushViewController:alarmSource animated:YES];
}

#endif	// USE_ALARM

//-----------------------------------------------------
// picker/Timer共通テーブル処理
//-----------------------------------------------------

// セル内にアクセサリとしてつけたボタンが選択された
// アクセサリとしてつけたボタンは外部に現れないので、IBでは接続できない
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
	nslog(@"セル選択=%@",indexPath);
	// ここにない項目は、直接ターゲットで処理される
	switch (indexPath.section) {
		case SectionGeneralSelect:
			switch (indexPath.row) {
			#ifdef USE_EXITDELAY
				case RowExitDelay:
					[self openPickerView:NSLocalizedString(@"EXITDELAY",@"録画開始遅延")
								   param:tblExitDelay count:countTblExitDelay() valno:TMExitDelay fchange:FMT_NONE fmin:YES];
					break;
			#endif
			#ifdef	USE_TIMER
				case RowTimer:
					[self openTimerView:NSLocalizedString(@"TIMER",@"タイマー")];
					break;
			#endif
			}
			break;

#ifdef USE_CONSTANT
		case SectionConstantSelect:
			switch (indexPath.row) {
				case RowConstantInterval:
					[self openPickerView:NSLocalizedString(CONSTANTINTERVAL,@"常時録画間隔")
								   param:tblConstantInterval count:countTblConstantInterval() valno:TMConstantInterval];
					break;
			}
			break;
#endif
#if defined(USE_ALARM)||defined(USE_NSHOT)
		case SectionAlarmSelect:
			nslog(@"SectionAlarmSelect:indexPath.row=%d",(int)indexPath.row);
			switch (indexPath.row) {
				case RowAlarmInterval:
					nslog(@"RowAlarmInterval");
					[self openPickerView:NSLocalizedString(ALARMINTERVAL,@"アラーム録画間隔")
								   param:tblAlarmInterval
								   count:countTblAlarmInterval()
								   valno:TMAlarmInterval];
					break;
				case RowAlarmPost:
					nslog(@"RowAlarmPost");
					[self openPickerView:NSLocalizedString(ALARMPOST	,@"アラームポスト時間")
								   param:tblAlarmPost
								   count:countTblAlarmPost()
								   valno:TMAlarmPost
#ifdef USE_NSHOT
								 fchange:FMT_NSHOT
#endif
					 ];
					break;
#if defined(USE_ALARM)
				case RowAlarmYokushi:
					[self openPickerView:NSLocalizedString(@"ALARMYOKUSHI",@"アラーム抑止時間")
								   param:tblAlarmYokushi
								   count:countTblAlarmYokushi()
								   valno:TMAlarmYokushi];
					break;
				case RowAlarmLimit:
					[self openPickerView:NSLocalizedString(@"ALARMLIMIT",@"アラーム制限時間")
								   param:tblAlarmLimit
								   count:countTblAlarmLimit()
								   valno:TMAlarmLimit
								 fchange:FMT_NONE
									fmin:YES];
					break;
				case RowAlarmSource:
					[self openAlarmSourceView:NSLocalizedString(@"ALARMSOURCE",@"アラーム源")];
					break;
#endif
			}
			break;
#endif
#ifdef USE_ETC
		case SectionEtc:
			switch (indexPath.row) {
	#ifdef USE_COLORSELECT
				case RowAtrb:
					[self openColorSelect];
					break;
	#endif
				case RowPlaybackSpeed:
					[self openPickerView:NSLocalizedString(@"PLAYBACKSPEED",@"再生速度")
								   param:tblPlaybackSpeed
								   count:countTblPlaybackSpeed()
								   valno:TMPlaybackSpeed
								 fchange:FMT_PLAYBACKSPEED];
					break;
				case RowMaxPics:
					[self openPickerView:NSLocalStr(@"MAXPICS")
								   param:tblMaxPics
								   count:countTblMaxPics()
								   valno:TMMaxPics
								 fchange:FMT_MAXPICS];
					break;
	#ifdef USE_COUNT
				case RowCounter:
					[self openCounterView:NSLocalStr(@"COUNTER")];
					break;
	#endif
			}
			break;
#endif	// USE_ETC
	}
}

//-----------------------------------------------------
// Picker系以外での設定
//-----------------------------------------------------

// setup変更
// プログラム内部のスイッチからのみ
- (IBAction)updateSwitch:(UISwitch *)sw
{
	printSelfs(@"tag=%d",(int)sw.tag);
	nslog(@".on=%d",sw.on);
	switch (sw.tag) {
#if defined(USE_ALARM)
		case SW_FALARMRETRIGGER:
			setup.falarmRetrigger=sw.on;
			break;
#endif
#if defined(USE_ALARM)||defined(USE_NSHOT)
		case SW_FALARM1FILE:
			setup.falarm1file=sw.on;
			break;
#endif
#ifdef	USE_BLUETOOTH
		case SW_FBLUETOOTHSHUTTER:
			setup.fbluetoothShutter=sw.on;
			break;
#endif
	}
	clickSound();
}

-(IBAction)updateSegment:(UISegmentedControl *)seg
{
	printSelfs(@"tag=%d",(int)seg.tag);
	nslog(@"select=%d",(int)seg.selectedSegmentIndex);
	switch (seg.tag) {
#if defined(USE_ALARM)||defined(USE_NSHOT)
		case SEG_ALARM_QUALITY:
			setup.alarmQuality=seg.selectedSegmentIndex;
			break;
#endif
#ifdef	USE_CONSTANT
		case SEG_CONSTANT_QUALITY:
			setup.constantQuality=seg.selectedSegmentIndex;
			break;
#endif
		case SEG_CAMERADEVICE:
			setup.cameraDevice=seg.selectedSegmentIndex;
			break;
		case SEG_CAMERAFLASHMODE:
			setup.cameraFlashMode=seg.selectedSegmentIndex-1; // -1/0/1だから
			break;
	}
	clickSound();
}

//-----------------------------------------------------

// SETUPを表示に反映
-(void)displaySetup
{
	printSelf();
	// switch／segmentに反映
#ifdef	USE_BLUETOOTH
	swFbluetoothShutter.on	=setup.fbluetoothShutter;
#endif
#if defined(USE_ALARM)
	swFalarmRetigger.on		=setup.falarmRetrigger;
#endif
#if defined(USE_ALARM)||defined(USE_NSHOT)
	segAlarmQuality.selectedSegmentIndex
							=setup.alarmQuality;
	swFalarm1file.on		=setup.falarm1file;
#endif
#ifdef	USE_CONSTANT
	segConstantQuality.selectedSegmentIndex	=setup.constantQuality;
#endif
	segCameraDevice.selectedSegmentIndex	=setup.cameraDevice;
	segCameraFlashMode.selectedSegmentIndex	=setup.cameraFlashMode+1; // -1/0/1だから
	// Picker/Timer : カーソル合わせはView表示時に行う
	// AlarmSource  : View表示時に設定する
}	

//----------------------------------------------
// 画面を回転して良いかどうか
//----------------------------------------------
// iOS6.0

-(BOOL)shouldAutorotate
{
	return shouldAutorotateByMain();
}

- (NSUInteger)supportedInterfaceOrientations
{
	return (supportedInterfaceOrientationsByMain());
}

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

#pragma mark -
#pragma mark Memory management

#ifdef DEBUG
- (void)didReceiveMemoryWarning
{
	printSelf();
	[super didReceiveMemoryWarning];
}

#endif

@end

