//
//  FontSelect.m
//  X-BASIC'
//
//  Created by AIG-Soft on 2012/08/23.
//  Copyright 2012-2015 AIG-Soft. All rights reserved.
//

#import "AppDelegate.h"
#import "FontSelect.h"
#import "FontSizeSelect.h"
#import "click.h"
#import "libs.h"

@interface FontSelect()
{
	AppDelegate *app;
	Setup		*setup;
}
@property (nonatomic,strong) UIButton	*nextButton0;
@end

@implementation FontSelect

-(void)viewDidLoad
{
	printSelf();

	nslog(@"nextButton=%@",self.nextButton);

	app=getAppDelegate();
	setup=app.setup;
	
	// デリゲートとソース設定;nib部なのでここに置く
	self.pickerView.delegate  =self;
	self.pickerView.dataSource=self;
	
	[super viewDidLoad];
}

-(void)viewWillAppear:(BOOL)animated
{
	printSelf();
	
	[super viewWillAppear:animated];
	
	// カーソル位置設定;ここでしないとうまくいかない
	nslog(@"カーソル位置設定");
//	[self.pickerView selectRow:_nameNo+2 inComponent:0 animated:NO]; // 戻ってきた時にカーソル上2つが消えてしまうので、一旦＋２で表示させて戻す(バグ回避)
	[self.pickerView selectRow:_nameNo   inComponent:0 animated:NO];
	//
	[self dispFontSize:fontSize];
	[super lblInfoHidden:NO];
	
	self.preferredContentSize=frame0.size; // poppverのサイズを戻す(これが重要)
	nslog(@"nextButton=%@",self.nextButton);
	[super setNextButtonTitle:_nextTitle];
	[super nextButtonHidden:NO];
}

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

-(void)setNextButtonAction:(NSString *)title
{
	printSelfs(@"%@",title);
	self.nextTitle=title;
	[super setNextButtonAction:self nextSelector:@selector(openFontSizeSelect:)];
}

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

// リスト表示に使える＝行番号とテキストがずれないフォント
// iOS7での調査結果（!shinshu.basでの手動調査なので、すべてのソースで問題ないかはわからない）
static char *enableFontList[]={
	"American Typewriter",
	"Avenir",
	"Baskerville",
	"Bodoni 72",
	"Bradley Hand",
	"Cochin",
	"Courier",
	"DIN ",
	"Farah",
	"Georgia",
	"Gill Sans",
	"Helvetica",
	"Iowan Old Style",
	"IPA",
	"Marker Felt",
	"Menlo",
	"mikachan_o",
	"Palatino",
	"Papyrus",
	"Savoye LET",
	"Sinhala Sangam",
	"Snell Roundhand",
	"Source Code Pro",
	"Tamil Sangam MN",
	"Trebuchet MS",
	"Verdana",
};
#define MAX_enableFontList	(sizeof(enableFontList)/sizeof(char *))

- (void)initFontSelect:(id)target selector:(SEL)aSel name:(NSString *)name_ title:(NSString *)title
{
	printSelf();
	nslog(@"name=%@(%d)",name_,(int)_nameNo);
	
	frame0=self.view.frame; // popoverのサイズを設定するために保存:iPhone用のそれを使う
	
	// ボタン設定
	_nextTitle=nil;
	super.title=title; // titleプロパティへの代入
	UIBarButtonItem *tempBarItem=[[UIBarButtonItem alloc]initWithTitle:NSLocalStr(@"SAVE")
																 style:UIBarButtonItemStyleDone
																target:target
																action:aSel];
	super.navigationItem.leftBarButtonItem=tempBarItem;
	UIColor *backColor=self.pickerView.backgroundColor; // pickerとlabelの色は微妙に違うので合わせる;
	nslog(@"backColor=%@",backColor);
	
	// フォント名選択用要素作成
	nameWidth=0.0;
	nameArray=[[NSMutableArray alloc]init];
	lblArray=[[NSMutableArray alloc]init];
	NSArray *dispNames=[[NSArray alloc]initWithArray:[[UIFont familyNames]sortedArrayUsingComparator:
													  ^(NSString *str1,NSString *str2) {
														  // ローカライズ状態でソート付き
														  return [NSLocalStr(str1) compare:NSLocalStr(str2)];
													  }
													  ]];
	//
	NSUInteger i=0,j;
	NSEnumerator *em = [dispNames objectEnumerator];
	NSString *name1;
	while (name1=[em nextObject]) {
		// 使えるフォント群だけを抽出する
		char *name0=nsStringTocString(name1);
		// nslog(@"name0=%s,name1=%@",name0,name1);
		for (j=0;j<MAX_enableFontList;j++) {
			// 一旦retに代入しないと、なぜか正しい結果にならない。多分最適化によるバグ。
			int ret=memcmp(name0,enableFontList[j],strlen(enableFontList[j]));
			// nslog(@"name0=%s,比較=%s,len=%lu:ret=%d",name0,enableFontList[j],strlen(enableFontList[j]),ret);
			if (ret==0) {
				// 有効フォントである
				nslog(@"有効フォント:%@",name1);
				break;
			}
		}
		if (j==MAX_enableFontList) {
			nslog(@"...リスト表示に向かない");
			continue; // リスト表示に向かない、というかずれるフォントは外しておく
		}
		if ([name1 isEqualToString:name_]) {
			_nameNo=i; // name_から内部番号を得る
			fontName=name1;
			//			nslog(@"fontName=%@(%d)",fontName,_nameNo);
		}
		//
		//		nslog(@"name1=%@",name1);
		[nameArray addObject:name1]; // 生のフォント名記録
		//
#define FNTSZ	18	// 24にするとはみ出てしまう
		UILabel *lbl=[[UILabel alloc]init]; // UIViewのサブクラスでないといけないので、NSStringではなくUILabelを使う
		lbl.text=[NSString stringWithFormat:@"  %@  ",NSLocalStr(name1)]; // ローカライズ出来るときはする+左右に少し空きを作る
		lbl.font=[UIFont fontWithName:name1 size:FNTSZ]; // フォントの設定
		//		nslog(@"font=%@",lbl.font);
		CGRect frame={{0,0},sizeWithFont(lbl.text,lbl.font,YES)};
		if (frame.size.width>nameWidth) nameWidth=frame.size.width; // 表示幅の取得
		lbl.adjustsFontSizeToFitWidth=YES; // フォントサイズ調整可
		lbl.frame			=frame;
		lbl.textAlignment	=NSTextAlignmentCenter; // 中央寄せ
		lbl.backgroundColor	=backColor; // pickerとlabelの色は微妙に違うので合わせる
		[lblArray addObject:lbl];
		// 実際の開放はlblArrayのrelease時まで遅延されるのでOK
		i++;
	}
	//	nslog(@"フォント名=%@",lblArray);
	//	nslog(@"nameWidth=%f",nameWidth);
	
	fontSize=setup.fontSize;
	//	nslog(@"fontSize=%f",fontSize);
	//
	self.sampleText=NSLocalStr(@"SAMPLE"); // サンプル
}

-(void)setSample:(NSString *)text
{
	printSelfs(@"%@",text);
	if (self.sampleText!=nil) self.sampleText=nil; // 開放
	self.sampleText=text;
}

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

// 列数を返す
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
	return(1);
}

// 指定行の項目数を返す
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
	return ([lblArray count]);
}

// 列幅を返す
-(CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component
{
	return (nameWidth);
}

#if 0
// 指定行項目の文字列を返す
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
	return [NSString stringWithFormat:@"%d.%d",component,row];
}
#else
// 指定行項目のUIViewオブジェクトを返す
// こちらのほうが優先される
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
	UILabel *lbl=lblArray[row];
	// iOS7上では一旦別のUILabelにコピーしないと選択中項目の表示が抜けてしまう
	// iOS7上でSDK6までアプリを動かす場合も同様になる
	UILabel *label = [[UILabel alloc] initWithFrame:lbl.frame];
	label.backgroundColor = [UIColor clearColor];
	label.font = lbl.font;
	label.text = lbl.text;
	return label;
}
#endif


// setup選択番号から生フォント名を返す
-(NSString *)no2FontName:(NSInteger)no
{
	return nameArray[no];
}

-(void)dispFontSize:(CGFloat)size
{
	[super setLblInfoText:[NSString stringWithFormat:@"%@ : "FMT_FONT,NSLocalStr(@"SIZE"),size]];
	nslog(@"dispFontSize=%@",lblInfo.text);
}

// 指定サイズが表示幅に入るかどうかを調べ、入らないなら入るサイズに変更する
-(CGFloat)checkMaxFontSize:(CGFloat)size_
{
	CGSize fsize;
	UIFont *sfont;
	while (sfont=[UIFont fontWithName:fontName size:size_],
		   fsize=getFontSize(sfont),
		   sfont.lineHeight>Height_viewDisp ||
		   fsize.width>Width_viewDisp) {
		// 表示枠を超えるので設定不可
		nslog(@"表示枠を超える→超えないサイズを探す");
		size_-=8; // 8ずつ下げてみる
	}
	// 入るので問題ない
	return size_;
}

// 選択時に呼び出される
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
	nslog(@"選択:(%d,%d)",(int)row,(int)component);
	_nameNo=row;
	fontName=[self no2FontName:row];
	// ここに来るときはフォントが変更されているので、フォントサイズをデフォルトに戻って再設定
	fontSize=[self checkMaxFontSize:defFontSize()];
	[self dispFontSize:fontSize];
#if 0
	// ここにこれを入れると、選択直後に表示が変わる
	[pickerView reloadAllComponents]; // 項目の全読み込み直し
#endif
}

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

// fontSizeSelectを閉じる
-(void)closeFontSizeSelect:(id)sender
{
	printSelf();
	
	// 選択値を読み出す(pickerを開放してしまうので、その前に)
	fontSize=
	setup.fontSize	= [_fontSizeSelect getFontSize];
	
	// 画面を閉じる
	clickSound(); // クリック音
	[self.navigationController popToViewController:self animated:YES];
	// この後[self viewWillAppear]を並行動作で通る
}

// フォントサイズ設定
-(void)openFontSizeSelect:(id)sender
{
	printSelf();
	//
	self.fontSizeSelect = [[FontSizeSelect alloc]init];
	[_fontSizeSelect initFontSizeSelect:self selector:@selector(closeFontSizeSelect:)
								  name:fontName
								  size:fontSize
								 title:NSLocalStr(@"FONTSIZE")
							   maxSize:[self checkMaxFontSize:maxFontSize()]];
	[_fontSizeSelect setSample:_sampleText];
	_fontSizeSelect.preferredContentSize=_fontSizeSelect.view.frame.size; // poppverのサイズ合わせ(これが重要)
	// 子画面呼び出し
	clickSound(); // クリック音
	[self.navigationController pushViewController:_fontSizeSelect animated:YES];
}

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

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

@end
