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

#import "AppDelegate.h"
#import	"RootViewController.h"
#import "Setup.h"
#import "click.h"
#import "libs.h"
#import "main.h"
#import "malloc2.h"
#if 0 //def DEBUG	//!!test!!
#import "FileControl2.h"
#endif
//#import "NavigationControllerWithRotationControl.h"


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



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

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

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


@implementation AppDelegate

#pragma mark -
#pragma mark Application lifecycle


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

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

// ファイル受け渡し起動時は、この後にopenURLが呼び出される
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
	nslog(@"launchOptions=%@",launchOptions);
	
    // アプリケーション設定
	application.applicationSupportsShakeToEdit=NO; // シェイク編集不可
	//
	nslog(@"bundle path=%@",[[NSBundle mainBundle]bundlePath]);
	
	// BASICソースエリアの初期化(確保してない印だけ)
	sourceTop=NULL;

#if 0 //def DEBUG	//!!test!!
	nslog(@"filesテスト");
	NSArray	*pathlist=files(DIR_DOCUMENTS,@"bas",NO,FILES_ALL); // ここはテストで変更するからEXT_BASICにはしない
	NSString *dir=getDocumentsPath();
	int len=[dir length]+1;
	for (NSString *path in pathlist) {
		NSString *sdir=[path substringFromIndex:len];
		nslog(@"sdir=%@",sdir);
	}

#endif
	self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.backgroundColor = [UIColor whiteColor];
	
	// リソースの読み込み
	[self reloadResouces];
	
	// 主画面表示
	nslog(@"主画面表示");

	[self.window setRootViewController:_navigationController];
    [self.window makeKeyAndVisible];

    return YES; // 画面が表示されるのはこの後
}

// UIDocumentInteractionControllerでのファイル共有受信用
// 起動中の時はこれだけ呼び出される
// V2.9でインポート機能は削除されたのでここを通ることはなくなった
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
	nslog(@"application:openURL");
	nslog(@"annotation=%@",annotation); // 不明
	nslog(@"sourceApplication=%@",sourceApplication); // 送り元アプリケーション名
	return [_rootViewController importFromUTI:url];
}

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

-(void)applicationEnd
// アプリ終了処理
{
	printSelf();
	// 各種停止処理
	[_setup saveSetup]; // setupの保存と言うよりスクロール位置の保存
}

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

// アプリケーションが非動作になるとき
// iOS4ではHOMEボタンを押すとここに来る
// UIApplicationExitsOnSuspend=NOの時に来る(サスペンド可設定時)
- (void)applicationWillResignActive:(UIApplication *)application
{
	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を持ってないときはこれを呼び出すらしい
-(UIInterfaceOrientationMask)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
