/*	良いプログラムとは言えないので､参考にとどめてください	*/
/*	特にCHKMAIN.C , USERFUNC.Cは最悪です(T_T)				*/
/*	TAB=4:Colume=127で見てください							*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <egb.h>
#include <guidbg.h>
#include <file_dlg.h>

/*	GUI用EGBのワークアドレス						*/
char	*guiEgbPtr ;

/*	起動関数内で使用するGUI部品､変数				*/
extern int		Window_Base;
extern int		Dialog_MesBack[2];
extern int		Message_NowExec;
extern int		Message_Mode;
extern int		Message_Par100;
extern int		execFlag;
extern int		chkdrive ;
extern int		chkdrv_icn;
extern int		chkdrv_no;
extern int		outputMode;
extern int		Text_OUTFile;
extern char		*statusStr[];
extern char		*modeStr[];
extern char		*parStr[];
extern SYSDAT	cmosdata;

/*	他Shellからの呼び出し							*/
int ShellFunc(apliId, messId, info, data)
int	apliId;
int	messId;
int	info;
int	data;
{
	register int	ret;

	ret = ILLEGAL_FUNCTION;

	if(execFlag==TRUE)	return ret;

	switch(messId)
	{
		case	GM_SLEEP :
			MMI_SendMessage(Message_NowExec,MM_SETMSG,1,statusStr[0]);
			MMI_SendMessage(Dialog_MesBack[0],MM_ERASE,0);
			MMI_SendMessage(Dialog_MesBack[0],MM_SHOW,0);
			MMI_SetWakeObj(UNUSED);
			break;
		case	GM_WAKE :
			MMI_SendMessage(Message_NowExec,MM_SETMSG,1,statusStr[1]);
			MMI_SendMessage(Dialog_MesBack[0],MM_ERASE,0);
			MMI_SendMessage(Dialog_MesBack[0],MM_SHOW,0);
			MMI_SetWakeObj(Text_OUTFile);
			break;
		case	GM_QUIT :
			printf("FD/CD 表面検査 GM_QUIT受信しました\n");
			MMI_SetHaltFlag(TRUE);
			ret = NOERR ;
			break;
		//		その他のメッセージはシェル任せ (ILLEGAL_FUNCTION)
	}

	return ret;
}

/*	メモリー節約のお呪い(笑)						*/
_mwswt_up_args() { return 0;}
void _mwcall_onexit_fcns() {}

/*	起動メイン										*/
void main()
{
	static MMICTRL mmi;
	mmi.page0		 = SCREEN16 | SCREENIGNORE;	/* ページ0(16色)		*/
	mmi.page1		 = SCREENUNUSED;	/* ページ1(未使用)		*/
	mmi.writePage	 = 0;				/* 書き込みページ		*/
	mmi.displayPage	 = 1;				/* 表示ページ			*/
	mmi.priority	 = 0;				/* 表示プライオリティ	*/
	mmi.mode		 = SCREENAVAILABLE;	/* 画面(解像度無依存)	*/
	mmi.width		 = SCREENEXPAND;	/* VRAMの横の長さ(同上)	*/
	mmi.size		 = 0;				/* メモリ領域の大きさ	*/
	mmi.ptr			 = NULL;			/* メモリ領域のアドレス	*/
	mmi.asize		 = 0;				/* ユーザ領域の大きさ	*/
	mmi.aptr		 = NULL;			/* ユーザ領域のアドレス	*/
	mmi.move.lupx	 = -16384;			/* 移動枠				*/
	mmi.move.lupy	 = 20;
	mmi.move.rdwx	 = 16383;
	mmi.move.rdwy	 = 16383;
	mmi.white		 = 15;				/* 白色					*/
	mmi.black		 =  8;				/* 黒色					*/
	mmi.gray		 =  7;				/* 灰色					*/
	mmi.xor			 =  7;				/* 反転色				*/

	extern int APL_init() ;

	/*	二重起動チェック	*/
	int kobj;
	if( (kobj=MMI_CallMessage(MMI_GetApliId(),GM_QUERYID,QM_KIND,1))>NOERR )
	{
		MMI_CallMessage(MMI_GetApliId(),GM_SWITCH,FALSE,kobj);
		return;
	}

	/*	初期化処理	*/
	if (MMI_Open( &mmi ) == NOERR)
	{
		/*	初期化に成功すればメインループに入る.	*/
		if (APL_init() == NOERR)
			FDG_SaveCurDir();
			if(FDG_InitFileDlg() == NOERR)
			{
				MMI_ExecSystem() ;
				FDG_FreeFileDlg();
			}
			FDG_RecovCurDir();
	}

	/*	終了処理	*/
	MMI_Close() ;

}

/*	GUI部品初期化									*/
int APL_init()
{
	extern MMIINIT	initDataWINDOW ;

	register int	ret ;
	char			wide[16];

	/*	EGB ワークアドレスの取得.	*/
	guiEgbPtr = MMI_GetEgbPtr() ;

	/*	ハイパ型部品の初期化			*/
	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_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_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 ;

	/*	ユーザーグローバル変数初期化			*/
	chkdrive   = 0;
	chkdrv_icn = 198;
	chkdrv_no  = 300;
	outputMode = 1;
	execFlag = FALSE;

	/*	CMOSデータ取得							*/
	FM_getPart(1,256,0xfe,0,&cmosdata);

	/*	背景データの初期化						*/

	/*	GUIデータの登録							*/
	if ((ret = MMI_Init(&initDataWINDOW)) < 0)
		return ret ;

	/*	パレットメニュー色で初期化				*/
	EGB_tmenuPalette2( guiEgbPtr );

	/*	画面サイズ取得&中心へ					*/
	EGB_getDisplayInfo( 0,wide);
	MMI_SendMessage(Window_Base,MM_MOVE,2,DWORD(wide+ 8)/2-153,DWORD(wide+12)/2-71);

	/*	ユーザー初期文字列登録					*/
	MMI_SendMessage(Message_NowExec,MM_SETMSG,1,statusStr[1]);
	MMI_SendMessage(Message_Mode   ,MM_SETMSG,1,modeStr[outputMode]);
	MMI_SendMessage(Message_Par100 ,MM_SETMSG,1,parStr[0]);

	/*	ベース部品選択状態へ					*/
	MMI_SendMessage(Window_Base, MM_WAKE, 0 ) ;

	/*	ファイル名取得用テキスト実行状態へ		*/
	MMI_SetWakeObj(Text_OUTFile);

	/*	背景を表示する							*/
	MMI_SendMessage(MMI_GetBaseObj(), MM_SHOW, 0) ;

	/*	TownsShell登録処理						*/
	MMI_SendMessage(MMI_GetBaseObj(), MM_SETEXEC, 1, ShellFunc);
	MMI_CallMessage(MMI_GetApliId(), GM_TITLE, (int)"ＦＤ／ＣＤ表面検査  Ｖ１．００ｃ", 0);

	return NOERR ;
}

