/*===========================================
          DolphMorph（ドルフモーフ）

      モーフィング＆変形アニメ作成ソフト

  モーフィングアルゴリズム: EAST 1994
  インターフェース作成:     松内 良介 1994
===========================================*/
#define	MODULE_MAIN
#if 0
	main.c
		メインモジュール
		

#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <file_dlg.h>
#include <egb.h>
#include <ryosuke.h>
#include <usrlib.h>

#include "morph.h"
#include "points.h"
#include "desktop.h"
#include "imstore.h"
#include "guisub.h"
#include "morphgo.h"
#include "icon.h"

#include <fmcfrb.h>

char	*guiEgbPtr ;			/*	EGB のワークアドレス	*/
char	guiSndPtr[16*1024] ;	/*	SND のワークアドレス	*/

static void (*pfIdle)(void) = 0;
static	TIM_CALEN	pre_time = {-1,0,0,0,0,0,0,0,0};

static void idleFunc(void)
{
	TIM_CALEN time;
	TIM_rdcalendar(&time);
	time.msec = (time.msec / 50) & 1;
	if (memcmp(&pre_time,&time,sizeof(TIM_CALEN)) != 0)
	{
		static char dateStr[30];
		static char *weekName[] = {"日","月","火","水","木","金","土"};
		sprintf(dateStr, "%4d.%02d.%02d(%s) %02d%1c%02d",
				time.year, time.month, time.day, weekName[time.what_day],
				time.hour, ": "[time.msec], time.minute);
		WINCLIP *pwc;
		WIN_beginUpDateObj(idDesktopClockMsg, &pwc);
		MMI_SendMessage(idDesktopClockMsg, MM_SETMSG, 1, dateStr);
		MMI_SendMessage(idDesktopClockMsg, MM_SHOW, 0);
		WIN_endUpDateObj(pwc);
		pre_time = time;
	}
	if (pfIdle != 0)
		(*pfIdle)();
}

static int init_module(void)
{
	EGB_work = guiEgbPtr;
	if (TIFFinitworkGUI() != 0)
		return -1;
	if (init_imstore() != 0)
		return -1;
	if (init_points() != 0)
		return -1;
	if (init_morphgo() != 0)
		return -1;
	if (icon_setup() != 0)
		return -1;
	if (init_movfile() != 0)
		return -1;
	if (RM_init() != 0)
		return -1;
	pfIdle = MMI_GetIdleTaskFunc();
	MMI_SetIdleTaskFunc(idleFunc);
	desktop_checkActivity();
	return 0;
}

static void close_module(void)
{
	end_imstore();
	end_points();
	end_morphgo();
	end_movfile();
	RM_end();
	MMI_SetIdleTaskFunc(pfIdle);
}

void main()
{
	MMICTRL ctrl;
	extern int APL_init() ;

	/*	致命的エラーハンドラの登録	*/
	FM_SetVector() ;

	/*	サウンドの初期化	*/
	SND_init(guiSndPtr) ;

	/*	初期化処理	*/
		ctrl.page0 = 3 ;			/* page0側解像度 */
		ctrl.page1 = 10 ;			/* page1側解像度 */
		ctrl.writePage = 0 ;		/* 書き込みページ */
		ctrl.displayPage = 3 ;		/* 表示ページフラグ */
		ctrl.priority = 0 ;			/* 表示プライオリティ */

		ctrl.mode = 0 ;				/* 色数(0:16色 1:256色 2:３万色) */
		ctrl.width = 512 ;			/* VRAMの横の長さ(バイト単位) */
		ctrl.size = 0 ;				/* メモリ領域の大きさ */
		ctrl.ptr = NULL ;			/* メモリ領域のアドレス */
		ctrl.asize = 0 ;			/* ユーザ領域の大きさ */
		ctrl.aptr = NULL ;			/* ユーザ領域のアドレス */
		ctrl.fr.lupx = 0 ;			/* 表示画面枠 */
		ctrl.fr.lupy = 0 ;
		ctrl.fr.rdwx = 639 ;
		ctrl.fr.rdwy = 479 ;
		ctrl.move.lupx = 0 ;		/* 部品移動枠 */
		ctrl.move.lupy = 20 ;		/* (ダイアログ移動範囲制限(y座標)) */
		ctrl.move.rdwx = 639 ;
		ctrl.move.rdwy = 479 ;
		ctrl.white = 15 ;			/* 白の色番号 */
		ctrl.black = 8 ;			/* 黒の色番号 */
		ctrl.gray  = 4 ;			/* 灰色の色番号 */
		ctrl.xor   = 14 ;			/* 反転色の色番号 */
	if (MMI_Open( &ctrl ) == NOERR)
	{
		/*	初期化に成功すればメインループに入る.	*/
		if (APL_init() == NOERR)
		{
			FDG_SaveCurDir() ;
			FDG_InitFileDlg() ;
			// extern void FDGdump(void);
			// FDGdump();
			RM_setFileDlgStyle(1);
			MMI_ExecSystem() ;
			FDG_FreeFileDlg();
			FDG_RecovCurDir() ;
		}
	}

	/*	終了処理	*/
	close_module();
	MMI_Close() ;
	SND_end() ;

	/*	致命的エラーハンドラの復帰	*/
	FM_ResetVector() ;
}

static int setMosPtr(int num)
{
	SetMouse16(num, WHITE, BLACK);
	return NOERR;
}





int APL_init()
{
	extern MMIINIT	initDataZABOUT ;
	extern MMIINIT	initDataZALERT ;
	extern MMIINIT	initDataZDESKTOP ;
	extern MMIINIT	initDataZIMSTORE ;
	extern MMIINIT	initDataZPOINTS ;
	extern MMIINIT	initDataZMORPHGO ;
	extern MMIINIT	initDataZMOVFILE ;
	extern MMIINIT	initDataZMOVIE ;
	extern MMIINIT	initDataZPOINTS ;

	register int	ret ;

	/*	EGB ワークアドレスの取得.	*/
	guiEgbPtr = MMI_GetEgbPtr() ;

	/*  裏画面の設定  */
	EGB_resolution(guiEgbPtr, 1, 10);
	EGB_writePage(guiEgbPtr, 1);
	EGB_displayStart(guiEgbPtr, 2, 2,2);		/* 画面拡大 */
	EGB_displayStart(guiEgbPtr, 3, 320,240);	/* 表示画面の大きさ */
	EGB_displayPage(guiEgbPtr, 0, 3);
	EGB_writePage(guiEgbPtr, 0);

	/*	ハイパ型部品の初期化			*/
	if ((ret = MMI_initHyper()) < 0)
		return ret ;
	/*	ダイアログ型部品の初期化		*/
	if ((ret = MMI_initDialogL40()) < 0)
		return ret ;
	/*	アラート型部品の初期化			*/
	if ((ret = MMI_initAlertL40()) < 0)
		return ret ;
	/*	ウインドウ型部品の初期化		*/
	if ((ret = MMI_initWindowL40()) < 0)
		return ret ;
	/*	メッセージ型部品の初期化		*/
	if ((ret = MMI_initMessageL40()) < 0)
		return ret ;
	/*	メニュー型部品の初期化			*/
	if ((ret = MMI_initMenuL40()) < 0)
		return ret ;
	/*	ボタン型部品の初期化			*/
	if ((ret = MMI_initButtonL40()) < 0)
		return ret ;
	/*	ドロウボタン型部品の初期化		*/
	if ((ret = MMI_initDrawButtonL40()) < 0)
		return ret ;
	/*	アイコンボタン型部品の初期化	*/
	if ((ret = MMI_initIconL40()) < 0)
		return ret ;
	/*	トグルアイコン型部品の初期化	*/
	if ((ret = MMI_initToggleIconL40()) < 0)
		return ret ;
	/*	メニューアイテム型部品の初期化	*/
	if ((ret = MMI_initMenuItemL40()) < 0)
		return ret ;
	/*	スクロール型部品の初期化		*/
	if ((ret = MMI_initScrollBarL40()) < 0)
		return ret ;
	/*	テキスト型部品の初期化			*/
	if ((ret = MMI_initTextL40()) < 0)
		return ret ;
	/*	リストメニュー型部品の初期化	*/
	if ((ret = MMI_initListMenuL40()) < 0)
		return ret ;
	/*	数値入力型部品の初期化			*/
	if ((ret = MMI_initNumBoxL40()) < 0)
		return ret ;

	/*	デフォルトビジュアルエフェクトの登録	*/
	MMI_SetUpVisualEffect() ;

	/*	背景データの初期化						*/
	EGB_tmenuPalette2(guiEgbPtr) ;

	/*	データの登録		*/
	if ((ret = MMI_Init(&initDataZABOUT)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataZALERT)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataZMORPHGO)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataZMOVIE)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataZDESKTOP)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataZMOVFILE)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataZIMSTORE)) < 0)
		return ret ;

	if ((ret = MMI_Init(&initDataZPOINTS)) < 0)
		return ret ;

	/*	SIDEWORKメニューを登録する				*/
	MMI_SetUpSDKMenu( idDesktopMItem_System , 2 ) ;

	if ((ret = init_module()) < 0)
		return ret ;
		
	MMI_SendMessage(idPointsWin, MM_ATTACH, 1, idDesktopWinAttachHyper);
	MMI_SendMessage(idImageStoreWin[0], MM_ATTACH, 1, idDesktopWinAttachHyper);
	MMI_SendMessage(idImageStoreWin[1], MM_ATTACH, 1, idDesktopWinAttachHyper);

	/*  マウスカーソル形状の設定 */
	MMI_SetPtrFunc( setMosPtr );
	MG_mosDisp(2);
	MG_PopPtr(MOSICON_ARROW);
	MG_mosDisp(3);

	/*	背景を表示する							*/
	MMI_SendMessage(MMI_GetBaseObj(), MM_SHOW, 0) ;

	return NOERR ;
}
