#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 "sftlib.h"

int	AMI_PLT = -1 ;
int	AMI_PLT_b[2] = -1 ;
int	AMI_PLT_m[9] = -1 ;
int	AMI_PLT_sc[3] = -1 ;
int	AMI_PLT_scm[3] = -1 ;
int	AMI_PLT_clh = -1 ;
int	AMI_PLT_cl[15] = -1 ;
int	AMI_PLT_flb[3] = -1 ;
int	AMI_PLT_fname = -1 ;
int	AMI_PLT_fbtn = -1 ;

/*ami*/

#define AMI_PLT_FHEAD "AMI_PALETTE(1.0)"
extern char	*guiEgbPtr;             /*  EGB のワークアドレス   */
char AMI_PLT_pltpath[_MAX_PATH+1]="palet.pal";  /* パレットファイル */
unsigned char AMI_PLT_bkplt[16][4]; /*  最初のパレット情報     */
unsigned char AMI_PLT_wkplt[16][4]; /*  編集後のパレット情報   */
char AMI_PLT_grbstr[3][4];          /*  MM_SETMSG の作業領域   */
int  AMI_PLT_num=0;     /*  設定しているボタンの番号(0-14の間) */
int  AMI_PLT_ret=1;
int  AMI_PLT_end=1;
int AMI_PLT_scmprt( int num, int i)
{
	int lev;
	char pltone[4+8];
	lev=(AMI_PLT_wkplt[num+1][i]>>4);
	MMI_SendMessage( AMI_PLT_sc[i], MM_SETSCROLL, 5, lev, 0, 15, 1, 4 );
	sprintf( &(AMI_PLT_grbstr[i][0]), "%2d", lev );
	MMI_SendMessage( AMI_PLT_scm[i], MM_SETMSG, 1, &(AMI_PLT_grbstr[i][0]) );
	MMI_SendMessage( AMI_PLT_sc[i], MM_SHOW, 0 );
	MMI_SendMessage( AMI_PLT_scm[i], MM_SHOW, 0 );
	DWORD(pltone)=1;
	DWORD(pltone+4)=num+1;
	pltone[8]=AMI_PLT_wkplt[num+1][0];
	pltone[9]=AMI_PLT_wkplt[num+1][1];
	pltone[10]=AMI_PLT_wkplt[num+1][2];
	pltone[11]=0;
	EGB_palette( guiEgbPtr, 1, pltone );
	return 0;
}

int AMI_PLT_cslct_onoff( int s, int n )
{
	HYPER hyp;
	MMI_SendMessage( AMI_PLT_cl[n], MM_GETHYPER, 1, &hyp );
	if ( s ) { /* OFF */
			hyp.atrm = MS_PANELL40 | MS_UFRAMEL40;
			MTL_resetAtrObj( AMI_PLT_cl[n], ~MS_DSPONLYL40 );
	}
	else { /* ON */
			hyp.atrm=MS_UFRAMEL40;
			MTL_setAtrObj( AMI_PLT_cl[n], MS_DSPONLYL40 );
			AMI_PLT_scmprt(n,0);
			AMI_PLT_scmprt(n,1);
			AMI_PLT_scmprt(n,2);
	}
	MMI_SendMessage( AMI_PLT_cl[n], MM_SETHYPER, 1, &hyp );
	MMI_SendMessage( AMI_PLT_cl[n], MM_ERASE, 0);
	MMI_SendMessage( AMI_PLT_cl[n], MM_SHOW, 0);
	return 0;
}

PROTO int AMI_PLT_setplt( unsigned char plt[16][4] ) PROTOEND
{
	char work_plt[4+8*16];
	int i;
	
	DWORD( work_plt )=16;
	for( i=0; i<16; i++ ){
		DWORD( work_plt+4+i*8 )=i;
		work_plt[i*8+4+4]=plt[i][0];
		work_plt[i*8+4+5]=plt[i][1];
		work_plt[i*8+4+6]=plt[i][2];
		work_plt[i*8+4+7]=0;
	}
	EGB_palette( guiEgbPtr, 1, work_plt );
	return 0;
}

PROTO unsigned char *AMI_PLT_now( int page ) PROTOEND
{
	char work_plt[4+8*16];
	int i,j;

	for( i=0; i< 16; i++ ) 
		for( j=0; j< 4; j++ ) 
			AMI_PLT_bkplt[i][j]=i*17;
	if ( EGB_getPalette( page, work_plt ) ) return &AMI_PLT_bkplt[0][0];
	for( i=0; ( i< DWORD(work_plt) ) && (i<16) ; i++ ){
		j=DWORD( work_plt+4+i*8 );
		if ( (0<=j) && (j<16) ) {
			AMI_PLT_bkplt[j][0]=work_plt[i*8+4+4]; /* blue  */
			AMI_PLT_bkplt[j][1]=work_plt[i*8+4+5]; /* red   */
			AMI_PLT_bkplt[j][2]=work_plt[i*8+4+6]; /* green */
			AMI_PLT_bkplt[j][3]=j; /* palette number */
		}
	}
	return &AMI_PLT_bkplt[0][0];
}

PROTO int AMI_PLT_call( int page, unsigned char *plt ) PROTOEND
{
	if( plt==NULL ) {
		AMI_PLT_now( page ); /* set AMI_PLT_bkplt from now palette */
	}
	else memcpy( AMI_PLT_bkplt, plt, sizeof(AMI_PLT_bkplt) );
	memcpy( AMI_PLT_wkplt, AMI_PLT_bkplt, sizeof(AMI_PLT_wkplt) );

	AMI_PLT_setplt( AMI_PLT_wkplt );

	MMI_SendMessage(AMI_PLT, MM_ATTACH, 1, MMI_GetBaseObj() );
	MMI_SendMessage( AMI_PLT_fname, MM_SETTEXT, 3, AMI_PLT_pltpath, 
			strlen(AMI_PLT_pltpath), FALSE);
	MMI_SendMessage(AMI_PLT, MM_SHOW, 0) ;
	AMI_PLT_cslct_onoff( 0, AMI_PLT_num );
	AMI_ExecSystemA( &AMI_PLT_end, AMI_PLT_b);
	return AMI_PLT_ret;
}

PROTO int AMI_PLT_fout( const char *fname ) PROTOEND
{
	FILE *fp;
	int i,ret=0;
	char *errmsg="ごめんなさい\n\n\nファイルの書き込みに失敗しました";

	fp=fopen( fname, "wt" );
	if( fp == NULL ){
		AMI_INFO_call_1( errmsg );
		return -1;
	}
	if ( (ret=fprintf(fp, AMI_PLT_FHEAD "\n16\n")) < 0 ) {
		AMI_INFO_call_1( errmsg );
		goto RETURN;
	}
	for( i=0; i< 16; i++ )
	{
		if( (ret=fprintf(fp, "%#x %#04x %#04x %#04x\n",
			AMI_PLT_wkplt[i][3],AMI_PLT_wkplt[i][2],
			AMI_PLT_wkplt[i][1],AMI_PLT_wkplt[i][0]))<0  ){
				AMI_INFO_call_1( errmsg );
				goto RETURN;
			}
	}
RETURN:
	fclose( fp );
	return ret;
}

PROTO int AMI_PLT_fin( const char *fname ) PROTOEND
{
	FILE *fp;
	int i,c,g,r,b,ret=0;
	int palno;
	char buf[81];
	char *errmsg1="ごめんなさい\n\n\nファイルのオープンができません";
	char *errmsg2="ごめんなさい\n\n\nファイルの読み込みができません";
	char *errmsg3="ごめんなさい\n\n\nファイル形式が違います";
	char *errmsg4="ごめんなさい\n\n\nファイルが壊れています";

	fp=fopen( fname, "rt" );
	if( fp == NULL ){
		AMI_INFO_call_1( errmsg1 );
		return -1;
	}
	if ( fscanf(fp,"%[^\n]80s", buf) < 0 ) { 
		AMI_INFO_call_1( errmsg2 );
		ret=-2;
		goto RETURN;
	}
	if ( fscanf(fp,"%d", &palno) < 0 ) { 
		AMI_INFO_call_1( errmsg2 );
		ret=-2;
		goto RETURN;
	}
	if( strcmp( buf,AMI_PLT_FHEAD) != 0 ) {
		AMI_INFO_call_1( errmsg3 );
		ret=-3; goto RETURN;
	}
	for( i=0; i< palno; i++ )
	{
		if( (fscanf(fp,"%i%i%i%i",&c, &g, &r, &b))<0 ){
			AMI_INFO_call_1( errmsg4 );
			ret=-4;goto RETURN;
		}
		if( c>=0 && c<16 ){
			AMI_PLT_wkplt[c][3]=c; AMI_PLT_wkplt[c][2]=g;
			AMI_PLT_wkplt[c][1]=r; AMI_PLT_wkplt[c][0]=b;
		}
	}
RETURN:
	fclose( fp );
	return ret;
}

PROTO char *AMI_PLT_getpath( void ) PROTOEND
{
	return AMI_PLT_pltpath;
}

PROTO AMI_PLT_setpath ( char *str ) PROTOEND
{
	int ret;
	if( strlen(str) >_MAX_PATH ) ret=-1;
		else strcpy( AMI_PLT_pltpath, str );
	return ret;
}

/*amiend*/

/*	initDataPLT:AMI_PLT_b[0]:MJ_DBUTTONL40の呼び出し関数	*/
/*	initDataPLT:AMI_PLT_b[1]:MJ_DBUTTONL40の呼び出し関数	*/
int	AMI_PLT_func(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	char path[136];
	if( kobj==AMI_PLT_b[0] ) {
		MMI_SendMessage( AMI_PLT_fname, MM_GETTEXT,3, path, _MAX_PATH, FALSE );
		strcpy( AMI_PLT_pltpath, path );
		memcpy( AMI_PLT_bkplt, AMI_PLT_wkplt, sizeof(AMI_PLT_bkplt) );
		AMI_PLT_ret=0;
	}
	else {
		AMI_PLT_reset(kobj, messId, argc, pev, trigger);
		AMI_PLT_ret=1;
	}
	MMI_SendMessage( AMI_PLT_fname, MM_SLEEP, 0 );
	MMI_SendMessage( AMI_PLT, MM_ERASE, 0 );
	MMI_SendMessage( AMI_PLT, MM_DETACH,0);
	AMI_PLT_end=0;
	return NOERR ;
}

/*	initDataPLT:AMI_PLT_sc[0]:MJ_SCRLL40の呼び出し関数	*/
/*	initDataPLT:AMI_PLT_sc[1]:MJ_SCRLL40の呼び出し関数	*/
/*	initDataPLT:AMI_PLT_sc[2]:MJ_SCRLL40の呼び出し関数	*/
int	AMI_PLT_csc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int i, prt, min, max, len, pag;
	MG_mosDisp(2);
	for( i=0; i<3; i++ )
		if( kobj==AMI_PLT_sc[i] ) break;
	MMI_SendMessage( kobj, MM_GETSCROLL, 5, &prt, &min, &max, &len, &pag);
	AMI_PLT_wkplt[AMI_PLT_num+1][i]=prt*17;
	AMI_PLT_scmprt(AMI_PLT_num, i);
	MG_mosDisp(3);
	return NOERR ;
}

/*	initDataPLT:AMI_PLT_cl[0]:MJ_ICONL40の呼び出し関数	*/
/*	initDataPLT:AMI_PLT_cl[1]:MJ_ICONL40の呼び出し関数	*/
/*	initDataPLT:AMI_PLT_cl[2]:MJ_ICONL40の呼び出し関数	*/
/*	initDataPLT:AMI_PLT_cl[3]:MJ_ICONL40の呼び出し関数	*/
/*	initDataPLT:AMI_PLT_cl[4]:MJ_ICONL40の呼び出し関数	*/
/*	initDataPLT:AMI_PLT_cl[5]:MJ_ICONL40の呼び出し関数	*/
/*	initDataPLT:AMI_PLT_cl[6]:MJ_ICONL40の呼び出し関数	*/
/*	initDataPLT:AMI_PLT_cl[7]:MJ_ICONL40の呼び出し関数	*/
/*	initDataPLT:AMI_PLT_cl[8]:MJ_ICONL40の呼び出し関数	*/
/*	initDataPLT:AMI_PLT_cl[9]:MJ_ICONL40の呼び出し関数	*/
/*	initDataPLT:AMI_PLT_cl[10]:MJ_ICONL40の呼び出し関数	*/
/*	initDataPLT:AMI_PLT_cl[11]:MJ_ICONL40の呼び出し関数	*/
/*	initDataPLT:AMI_PLT_cl[12]:MJ_ICONL40の呼び出し関数	*/
/*	initDataPLT:AMI_PLT_cl[13]:MJ_ICONL40の呼び出し関数	*/
/*	initDataPLT:AMI_PLT_cl[14]:MJ_ICONL40の呼び出し関数	*/
int	AMI_PLT_cslct(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	int i, number=0;
	for( i=0; i< 15; i++ )
		if( kobj==AMI_PLT_cl[i] ) break;
	if( i<15 ) number=i;
	if( number != AMI_PLT_num ) {
		AMI_PLT_cslct_onoff( 1, AMI_PLT_num ); /* OFF */
		AMI_PLT_cslct_onoff( 0, number ); /* ON  */
		AMI_PLT_num=number;
	}
	return NOERR ;
}

/*	initDataPLT:AMI_PLT_flb[0]:MJ_DBUTTONL40の呼び出し関数	*/
int	AMI_PLT_fread(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	char path[_MAX_PATH];
	MMI_SendMessage( AMI_PLT_fname, MM_GETTEXT, 3, path, _MAX_PATH, FALSE );
	if( strlen(path) ) {
		AMI_PLT_fin( path);
		AMI_PLT_scmprt(AMI_PLT_num,0);
		AMI_PLT_scmprt(AMI_PLT_num,1);
		AMI_PLT_scmprt(AMI_PLT_num,2);
		AMI_PLT_setplt( AMI_PLT_wkplt );
	}
	return NOERR ;
}

/*	initDataPLT:AMI_PLT_flb[1]:MJ_DBUTTONL40の呼び出し関数	*/
int	AMI_PLT_fsave(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	char path[_MAX_PATH+1];
	MMI_SendMessage( AMI_PLT_fname, MM_GETTEXT, 3, path, _MAX_PATH, FALSE );
	if( strlen(path) ) {
		AMI_PLT_fout( path );
	}
	return NOERR ;
}

/*	initDataPLT:AMI_PLT_flb[2]:MJ_DBUTTONL40の呼び出し関数	*/
int	AMI_PLT_reset(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	memcpy( AMI_PLT_wkplt, AMI_PLT_bkplt, sizeof(AMI_PLT_wkplt) );
	AMI_PLT_scmprt(AMI_PLT_num,0);
	AMI_PLT_scmprt(AMI_PLT_num,1);
	AMI_PLT_scmprt(AMI_PLT_num,2);
	AMI_PLT_setplt( AMI_PLT_wkplt );
	return NOERR ;
}


/*	initDataPLT:AMI_PLT_fbtn:MJ_ICONL40の呼び出し関数	*/
int	AMI_PLT_fget(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	char path[_MAX_PATH+1];
	int ret;
	TEHandle *texth;

	MMI_SendMessage( AMI_PLT_fname, MM_GETTEXT, 3, path, _MAX_PATH, FALSE );
	ret=AMI_FILED_getpath_A( path, "パレット選択", "取 得", "やめる", AMI_PLT);
	if( ret==1 ) /* 実行して終了した */
	{
		MMI_SendMessage( AMI_PLT_fname, MM_GETTEHANDLE, 1, &texth );
		MMI_SendMessage( AMI_PLT_fname, MM_SETTEXT, 3, path, 
			strlen(path), FALSE);
		TE_Activate( texth, 0, 0 );
		TE_offsetJump( strlen(path) );
		TE_UpDate();
		TE_Deactivate();
		strcpy( AMI_PLT_pltpath, path );
	}
	return NOERR ;
}

