//
//  AppDelegate.m
//  traceWrite
//
//	iPad/iPhone両用
//
//  Created by 今井 彰彦 on 2011/12/05
//  Copyright 2011 AIG-Soft. All rights reserved.
//

#import "AppDelegate.h"
#import	"RootViewController.h"
#import "click.h"
#import "Setup.h"
#import "libs.h"
#import "main.h"
#import "TegakiScroll.h"

// iOS6のiPhoneで倒立のPortraitがうまく回転しないのを回避するための処理
@implementation NavigationControllerForiOS6

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

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


/// @brief AppDelegateを得る関数
AppDelegate *getAppDelegate(void)
{
	return (AppDelegate *) [[UIApplication sharedApplication] delegate];
}


@implementation AppDelegate

#pragma mark -
#pragma mark -Application lifecycle

-(void)releaseResouces
// バックグラウンドに入るときに開放して良いリソースの開放
{
	printSelf();
	deallocClick(); // click音の開放
}	

-(void)reloadResouces
// リソースを読み直す
// バッググラウンドからの復帰時にも読みなおす
// ここに来たときにはmainViewとその中に含まれるrootViewは読み込み済みである
{
	printSelf();
	
	// click音の取得
	initClick();
	
	// setupの読み出し；表示への反映は後で(ここで行っても反映されない)
	// 以下の初期化処理の中で参照されるのでここで先に読み込む
	_setup=[[Setup alloc]init];
	ffirst=[_setup loadSetup];	// プログラム内部
	[_setup readSetupOuter];		//「設定」画面SETUP読み込み
	
	// nibの読み込み
	_rootViewController=[[RootViewController alloc]init];
	// nib読み取り終了はviewDidLoadで判定（かなり先になることもある）
	navigationController=[[NavigationControllerForiOS6 alloc]initWithRootViewController:_rootViewController]; // NavigationBarへルートとしての設定
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{    
    // アプリケーション設定
	application.applicationSupportsShakeToEdit=NO; // シェイク編集不可
	//
	self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
	self.window.backgroundColor = [UIColor whiteColor];
	
	// リソースの読み込み
	[self reloadResouces];
	
	// 主画面表示
	nslog(@"主画面表示");
	[self.window setRootViewController:navigationController];
	[self.window makeKeyAndVisible];
	
#if 0	//!!test!! : フォントの属性を見る
	{
		nslog(@"smallSystemFontSize=%f"	,[UIFont smallSystemFontSize]);
		nslog(@"systemFontSize=%f"		,[UIFont systemFontSize]);
		nslog(@"buttonFontSize=%f"		,[UIFont buttonFontSize]);
		nslog(@"labelFontSize =%f"		,[UIFont labelFontSize]);
		// この処理をmain()に置くと、なぜか↓がエラーを発生する
//		UIFont *font = [UIFont systemFontOfSize:96];
		UIFont *font = [UIFont fontWithName:@"Times New Roman" size:96];
		nslog(@"capHeight =%f",font.capHeight);
		nslog(@"ascender  =%f",font.ascender);
		nslog(@"descender =%f",font.descender);
		nslog(@"lineHeight=%f",font.lineHeight);
		nslog(@"pointSize =%f",font.pointSize);
		nslog(@"xHeight   =%f",font.xHeight);
		//
		CGSize size= [@"|" sizeWithFont:font];
		nslog(@"|横幅=%f",size.width);
/*
 smallSystemFontSize=12.000000
 systemFontSize=14.000000
 buttonFontSize=18.000000
 labelFontSize =17.000000
 capHeight =63.552002		大文字の基本高さ
 ascender  =85.546875		baselineからの上y座標（上に突き抜けるフォント）
 descender =-20.765625		baselineからの下y座標（下に突き抜けるフォント）
 xHeight   =42.911999		xの高さ
 lineHeight=112.000000		フォントを描画するときの縦の幅>ascender+abs(descender)
 pointSize =96.000000		フォントサイズそのもの
 */
	}
#endif
	
    return YES; // 画面が表示されるのはこの後
}

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

-(void)applicationEnd
// アプリ終了処理
{
	printSelf();
	// 各種停止処理
	[_rootViewController.tegakiView save]; // 手書きデータを保存
	_setup.scrollPoint=_rootViewController.tegakiScrollView.contentOffset;
	nslog(@"scrollPoint=%f,%f",_setup.scrollPoint.x,_setup.scrollPoint.y);
	[_setup saveSetup]; // setupの保存と言うよりスクロール位置の保存
}

- (void)applicationWillTerminate:(UIApplication *)application
// アプリケーションが本当に終了するとき
// iOS4では通常はHOMEボタンを押してもここには来ない
// UIApplicationExitsOnSuspend=YESの時に来る(サスペンド不可設定時)
{
	nslog(@"プログラム終了");
	[self applicationEnd];
	// 多分この後メモリ解放がある
}

- (void)applicationWillResignActive:(UIApplication *)application
// アプリケーションが非動作になるとき
// iOS4ではHOMEボタンを押すとここに来る
// UIApplicationExitsOnSuspend=NOの時に来る(サスペンド可設定時)
{
	nslog(@"プログラム非動作");
	fnonActive=YES; // nonActiveになる
	[self applicationEnd];
	// リソースを解放する;再アクティブ時に異常動作を起こすので中止
	//	[self releaseResouces];
	//
	nslog(@"プログラム非動作化終了");
}


- (void)applicationDidBecomeActive:(UIApplication *)application
{
	nslog(@"プログラム再アクティブ");
	
	if (!fnonActive) {
		// 起動時に、applicationWillResignActiveが呼ばれてないのに此処に来ることがあるので回避
		nslog(@"→回避");
		return;
	}
	// リソースを再設定する
	// setupも読み込まれる
	//	[self reloadResouces]; // 再アクティブ時に異常動作を起こすので中止
	// マルチタスクで外部で設定が変更されているかもしれないので、読み込んでおく
	EnterRunLoop(0.0); // これがないと、「何故か」直前の「設定」での変更が反映されない
	[_setup readSetupOuter]; // 外部SETUP読み込み
	// この時はrootViewController viewWillApearが呼び出されないため、ここで強制的に設定する
}

//-------------------------------------------------------------------
// iOS6
// 画面回転を許可するために呼び出される・・・ようである
// 個別のUIViewControllerがsupportedInterfaceOrientationsを持ってないときはこれを呼び出すらしい

-(NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window_
{
	printSelf();
	return supportedInterfaceOrientationsByMain();
}

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

- (void)applicationDidEnterBackground:(UIApplication *)application
{
	printSelf();
}


- (void)applicationWillEnterForeground:(UIApplication *)application
{
	printSelf();
}

#pragma mark -
#pragma mark -Memory management

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
	printSelf();
}

- (void)dealloc
{
	printSelf();
	[self releaseResouces];
}


@end
