/*====================================================
                      ARTemis
                   (version 1.3)
             FM-TOWNS 用ペイントツール

                 by 松内 良介 1994
====================================================*/
/*
	main.c
		main(), APL_init()
		・GUIライブラリ、各モジュールの初期化
		・MMI_ExecSystem() による GUIシステムの起動
		・終了時の後片付け処理
*/
#define MODULE_MAIN

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winb.h>
#include <te.h>
#include <fntb.h>
#include <gui.h>
#include <fmcfrb.h>
#include <file_dlg.h>
#include <egb.h>
#include <ctype.h>
#include <direct.h>
#include <dos.h>

#include "art.h"
#include "imagewin.h"
#include "imgbtn.h"
#include "pensel.h"
#include "colsel.h"
#include "guisub.h"
#include "desktop.h"

void getExecDir(char *argv0, char *buf)
// buf: _MAX_PATH バイトのバッファ
{
	uint nouse;
	char curdir[_MAX_PATH],curdir2[_MAX_PATH];
	_getcwd(curdir, _MAX_PATH);
	char drive[_MAX_DRIVE],dir[_MAX_DIR],basename[_MAX_FNAME],ext[_MAX_EXT];
	_splitpath(argv0,drive,dir,basename,ext);
	if (drive[0] != 0)
		_dos_setdrive(toupper(drive[0])-'A'+1, &nouse);
	_getcwd(curdir2,_MAX_PATH);
	strcat(dir,".");
	_chdir(dir);
	_getcwd(buf, _MAX_PATH);
	_chdir(curdir2);
	_dos_setdrive(toupper(curdir[0])-'A'+1, &nouse);
	_chdir(curdir);
	if (strlen(buf) > 3)
		strcat(buf, "\\");
}

char	*guiEgbPtr ;			/*	EGB のワークアドレス	*/
unsigned int *guiColTbl;		/*  色変換テーブルのアドレス  */

int IMGBOXproto = -1;		/* IMGBOX部品のひな型のID */
int IMGBTNproto = -1;

int		imgwin_cnt;

int scrPixelSize;
int paramNizimi = 50;
int paramKosuri = 128;
char dirExec[_MAX_PATH];

void main(int argc, char *argv[])
{
	getExecDir(argv[0],dirExec);
	MMICTRL ctrl,ctrl2;
	extern int APL_init() ;
	int i;
	BOOL fScr32K = FALSE;
	for (i=1; i<argc; i++)
	{
		if (argv[i][0] == '-')
		{
			if (strcmp(argv[i]+1,"32k")==0 || strcmp(argv[1]+1,"32K") == 0)
				fScr32K = TRUE;
		}
	}

	/*	致命的エラーハンドラの登録	*/
	FM_SetVector() ;

	if (!fScr32K)
	{
		char para[12];
		RESOLUTION buf[2];
		DWORD(para+0)=1;
		DWORD(para+4)=24;
		DWORD(para+8)=0;
		if (EGB_getResolutionMax(0,para,buf) != -1)
			ctrl.page0 = SCREEN16M , scrPixelSize = 24;
		else
			ctrl.page0 = SCREEN32K , scrPixelSize = 16;
	}
	else
		ctrl.page0 = SCREEN32K, scrPixelSize = 16;
	ctrl.page1 = SCREENUNUSED ;
	ctrl.writePage = 0 ;		/* 書き込みページ */
	ctrl.displayPage = 1 ;		/* 表示ページフラグ */
	ctrl.priority = 0 ;			/* 表示プライオリティ */

	ctrl.mode = SCREENAVAILABLE ;
	ctrl.width = SCREENEXPAND ;
	ctrl.size = 0 ;				/* メモリ領域の大きさ */
	ctrl.ptr = NULL ;			/* メモリ領域のアドレス */
	ctrl.asize = 0 ;			/* ユーザ領域の大きさ */
	ctrl.aptr = NULL ;			/* ユーザ領域のアドレス */
	ctrl.move.lupx = -10000;	/* 部品移動枠 */
	ctrl.move.lupy = 20   ;		/* (ダイアログ移動範囲制限(y座標)) */
	ctrl.move.rdwx = 10000;
	ctrl.move.rdwy = 10000;
	ctrl.white = 15 ;			/* 白の色番号 */
	ctrl.black = 8 ;			/* 黒の色番号 */
	ctrl.gray  = 7 ;			/* 灰色の色番号 */
	ctrl.xor   = 6 ;			/* 反転色の色番号 */

	if (MMI_Open(&ctrl) == NOERR)
	{
		/*	初期化に成功すればメインループに入る.	*/
		if (APL_init() == NOERR)
		{
			FDG_SaveCurDir() ;
			FDG_InitFileDlg() ;
			RM_setFileDlgStyle(1);
			MMI_ExecSystem() ;
			FDG_FreeFileDlg();
			FDG_RecovCurDir() ;
		}
		/* ARTemis 内の各モジュールの終了処理 */
		pensel_end();
		pic_close();
	}

	/*	終了処理	*/
	MMI_Close() ;

	/*	致命的エラーハンドラの復帰	*/
	FM_ResetVector() ;

	/* キークリック音のＯＦＦ */
	KYB_clic(1);
}

int APL_init()
{
	extern MMIINIT	initDataABOUT ;
	extern MMIINIT	initDataZALERT ;
	extern MMIINIT	initDataZCOLSEL ;
	extern MMIINIT	initDataZCREATE ;
	extern MMIINIT	initDataZDESKTOP ;
	extern MMIINIT	initDataZIMGWIN ;
	extern MMIINIT	initDataZPENSEL ;
	extern MMIINIT	initDataZSETUP ;
	extern MMIINIT	initDataZALLSCR ;
	extern int		set_icontable(void);

	register int	ret ;

	/*	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_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 ;

	/* イメージボックス型部品の初期化 */
	if ((ret = MMI_initImageBox()) < 0)
		return ret;
	/* イメージボタン型部品の初期化 */
	if ((ret = MMI_initImageBtn()) < 0)
		return ret ;

	/*	デフォルトビジュアルエフェクトの登録	*/
	MMI_SetUpVisualEffect() ;

	/*	背景データの初期化						*/
	EGB_tmenuPalette2(guiEgbPtr) ;

	/*	データの登録		*/
	if ((ret = MMI_Init(&initDataABOUT)) < 0)
		return ret ;
	if ((ret = MMI_Init(&initDataZALERT)) < 0)
		return ret ;
	if ((ret = MMI_Init(&initDataZCOLSEL)) < 0)
		return ret ;
	if ((ret = MMI_Init(&initDataZCREATE)) < 0)
		return ret ;
	if ((ret = MMI_Init(&initDataZDESKTOP)) < 0)
		return ret ;
	if ((ret = MMI_Init(&initDataZIMGWIN)) < 0)
		return ret ;
	if ((ret = MMI_Init(&initDataZPENSEL)) < 0)
		return ret ;
	if ((ret = MMI_Init(&initDataZSETUP)) < 0)
		return ret ;
	if ((ret = MMI_Init(&initDataZALLSCR)) < 0)
		return ret ;

	/*	SIDEWORKメニューを登録する				*/
	MMI_SetUpSDKMenu( idDesktopMItem_System , 2 ) ;

	/* ARTemisの各モジュールの初期化 */
	if ((ret = IMGBOX_makePrototype(&IMGBOXproto)) < 0)
		return ret;
	if ((ret = IMGBTN_makePrototype(&IMGBTNproto)) < 0)
		return ret;

	if ((ret = desktop_init()) < 0)
		return ret ;
	if ((ret = imagewin_init()) < 0)
		return ret ;
	if ((ret = pic_init()) < 0)
		return ret ;
	if ((ret = pensel_init()) < 0)
		return ret ;
	if ((ret = colsel_init()) < 0)
		return ret ;

	/* カラーテーブルの設定 */
	scrplt_init();

	/* アイコンテーブルの設定 */
	if ((ret = set_icontable()) < 0)
		return ret ;

	// 解像度に合わせて部品のサイズを調整
	WINCTRL *pctrl;
	MMI_GetControl(&pctrl);
	FRAME fr;
	RM_getFrame(idBackDialog, &fr);
	fr.X2 = pctrl->bound.X2;
	fr.Y2 = pctrl->bound.Y2;
	RM_setFrame(idBackDialog, &fr);
	RM_getFrame(idDesktopDialog, &fr);
	fr.X2 = pctrl->bound.X2;
	RM_setFrame(idDesktopDialog, &fr);
	RM_offsetFrame(idDesktopExitIcon, pctrl->bound.X2+1 - 512, 0);
	RM_offsetFrame(idDesktopHelpIcon, pctrl->bound.X2+1 - 512, 0);
	RM_offsetFrame(idDesktopSkbIcon, pctrl->bound.X2+1 - 512, 0);

	/* ツールボックス、ペン選択パレットの接続 */
	MMI_SendMessage( idBrushT2Hyper, MM_DETACH, 0);
	{
		FRAME fr,fr2;
		fr = OBJHYP(idBrushTinyDlg).fr;
		fr2 = OBJHYP(idBrushT2Hyper).fr;
		RM_moveFrameTo(&fr2, fr.X+2, fr.Y+2);
		MMI_SendMessage( idBrushT2Hyper, MM_MOVE, 1, &fr2);
	}
	MMI_SendMessage( idBrushT2Hyper, MM_ATTACH, 2, idBrushTinyDlg, 1);
	/* ペン先選択ウィンドウの接続 */
	MMI_SendMessage( idBrushTinyDlg, MM_ATTACH, 1, idDesktopToolAttachHyper );
	/* 色選択ウィンドウの接続 */
	MMI_SendMessage( idColSelDlg, MM_ATTACH, 1, idDesktopToolAttachHyper );

	/*	背景を表示する							*/
	MMI_SendMessage(MMI_GetBaseObj(), MM_SHOW, 0) ;

	double freemem = (double)(TL_checkMemory(0)*4) / 1024.0;
	if (freemem < 2.0)
	{
		char msg[500];
		sprintf(msg, 
			"このマシンで現在 ARTemis が作業のために使えるメモリは"
			" %3.1fメガバイトで、あまり余裕がありません。"
			"できればあと %3.1fメガバイト程度のメモリを追加することを"
			"おすすめします。", freemem, 3.0-freemem);
		dispBigAlertMessage("メモリ不足にご注意を…", msg);
	}
	return NOERR ;
}

