/*<Header>==============================================================
*
*	ＣＤプレーヤ / "GUI.C"
*
*		[ EIN(tm) project : サンプルプログラム ]
*
*	COPYRIGHT  Nam  1994, All rights reserved.
*
*	配付・組込・改変・商利用すべて自由。ただし無保証っす
*
*-----------------------------------------------------------------------
*	V1.0L01α	94.04.07/Nam	プロトタイプ
*</Header>==============================================================*/
#include	<stdio.h>
#include	<stdlib.h>
#include	<string.h>
#include	<snd.h>
#include	<winb.h>
#include	<te.h>
#include	<fntb.h>
#include	<gui.h>
#include	<egb.h>
//#include	<file_dlg.h>
//#include	<tifflib.h>
#include	<msdos.cf>
#include	<loader.h>
#include	<math.h>
#include	<io.h>
#include	<guidbg.h>
#include	<wgb.h>
// ※ ここまでが平均的に使用されるヘッダ
#include	<time.h>
#include	<cdrfrb.h>
#include	<mos.h>

#include	"..\ein\eintm.h"	// EIN(TM)関連ライブラリのヘッダ


#define	ERROR	(-1)


#define	DISPMODE_ICON	(0)
#define	DISPMODE_PANEL	(1)


#define	ID_BASE	(0)

#define	ID_MUSNO1	(2)		// 現在曲番上位桁
#define	ID_MUSNO2	(3)		// 現在曲番下位桁
#define	ID_ANIM		(4)		// CDアニメーション

#define	ID_PMUSMODE	(9)		// 曲時間表示モード
#define	ID_PMUSNO1	(7)		// 現在曲番上位桁
#define	ID_PMUSNO2	(8)		// 現在曲番下位桁
#define	ID_PMUSMAX1	(16)	// 全曲数上位桁
#define	ID_PMUSMAX2	(17)	// 全曲数下位桁
#define	ID_PMUSTM1	(10)	// 曲時間(分上位桁)
#define	ID_PMUSTM2	(11)	// 曲時間(分下位桁)
#define	ID_PMUSTM3	(13)	// 曲時間(秒上位桁)
#define	ID_PMUSTM4	(14)	// 曲時間(秒下位桁)

#define	PT_NUM		(524)
#define	PT_NON		(522)
#define	PT_HFN		(523)
#define	PT_E		(534)
#define	PT_r		(535)
#define	PT_BIG		(14)
#define	PT_SMALL	(28)

#define	PT_ANIM_NON	(518)
#define	PT_ANIM_MIN	(519)
#define	PT_ANIM_MAX	(521)


extern	int		ID_ICON[];
extern	int		ID_PANEL[];
extern	int		dispMode;	// 0:ICON / 1:PANEL
extern	int		showTime;	// 0:トラック内演奏時間, 1:ディスク内演奏時間, 2:

extern struct TIMEADRS	tracktime[], disctime, endtime;
extern int				endtrack;
extern struct TIMEADRS	trtime, dctime;		// mphaseで取得

extern	int		getPlayStatus();

/* 2桁の数値をICONに設定し表示 */
/* no:表示したい数値(-3:"Er",-2:"--",-1:"  ", 0〜99:数値) */
/* high:上位桁の部品ID, low:下位桁の部品id, fntNo:" "のicon番号, mode:1なら上位桁が0のときに表示しない */
void	__setNumFnt( int no, int high, int low, int fntNo, int mode )
{
	register int	foo,bar;
	
	switch( no ){
		// "Er"
		case -3:
			/* 演奏番号表示を"Er"に */
			MMI_SendMessage( high, MM_SETSHAPE, 1, fntNo + 12);
			MMI_SendMessage( low , MM_SETSHAPE, 1, fntNo + 13);
			break;
		// "--"
		case -2:
			/* 演奏番号表示を"--"に */
			MMI_SendMessage( high, MM_SETSHAPE, 1, fntNo + 1);
			MMI_SendMessage( low , MM_SETSHAPE, 1, fntNo + 1);
			break;
		// "  "
		case -1:
			/* 演奏番号表示を"  "に */
			MMI_SendMessage( high, MM_SETSHAPE, 1, fntNo );
			MMI_SendMessage( low , MM_SETSHAPE, 1, fntNo );
			break;
		// 演奏番号表示を更新 //
		default:
			if ( (no>99)|| (no<0) ){
				no=0;
			}
			foo = no / 10;
			if ( (foo<1)&&(mode!=0) ){
				foo =fntNo;	// 上位桁が0なら何も表示しないように
			} else {
				foo+=fntNo+2;
			}
			bar = (no % 10) + fntNo + 2;
			MMI_SendMessage( high, MM_SETSHAPE, 1, foo );
			MMI_SendMessage( low , MM_SETSHAPE, 1, bar );
			break;
		}
	MMI_SendMessage( high, MM_SHOW, 0 );
	MMI_SendMessage( low,  MM_SHOW, 0 );
}

/*===================================================================*/
/*  パネル上の表示更新                                               */
/*===================================================================*/
int		update_PANEL( int force )
{
	static int	oldMin=-2, oldSec=-2;
	static int	oldNo = -9;
	int			musNo = getPlayStatus();
	register int	i, foo,bar;

	// 強制書換え
	if ( force != 0 ){
		oldNo =-9;
		oldMin=oldNo;
		oldSec=oldNo;
	}

	// 演奏時間を書換え
	switch( showTime ){
		// トラック内演奏時間
		case 0:
			foo = trtime.min;
			bar = trtime.sec;
			break;
		// ディスク内演奏時間
		case 1:
			foo = dctime.min;
			bar = dctime.sec;
			break;
		// 
		default:
			i = (musNo < 100) ?musNo-1: 98;
			foo = tracktime[i].min;
			bar = tracktime[i].sec;
			break;
	}
	if ( oldMin != foo ){
		__setNumFnt( foo, ID_PANEL[ID_PMUSTM1], ID_PANEL[ID_PMUSTM2], PT_NON+PT_SMALL, 1 );
		oldMin = foo;
	}
	if ( oldSec != bar ){
		__setNumFnt( bar, ID_PANEL[ID_PMUSTM3], ID_PANEL[ID_PMUSTM4], PT_NON+PT_SMALL, 0 );
		oldSec = bar;
	}

	// 曲番号の方は不要な書換えをしない
	if ( oldNo == musNo ){
		return NOERR;
	}
	oldNo = musNo;

	switch( musNo ){
		// もしエラーなら
		case -1:
			// 演奏番号を"Er"に
			__setNumFnt( -3, ID_PANEL[ID_PMUSNO1], ID_PANEL[ID_PMUSNO2], PT_NON+PT_BIG, 1 );
			// 全曲番号を"  "に
			__setNumFnt( -1, ID_PANEL[ID_PMUSMAX1], ID_PANEL[ID_PMUSMAX2], PT_NON, 1 );
			break;
		// もし停止中なら
		case 0:
			// 演奏番号を"--"に
			__setNumFnt( -2, ID_PANEL[ID_PMUSNO1], ID_PANEL[ID_PMUSNO2], PT_NON+PT_BIG, 1 );
			// 全曲番号を更新
			__setNumFnt( endtrack, ID_PANEL[ID_PMUSMAX1], ID_PANEL[ID_PMUSMAX2], PT_NON, 1 );
			break;
		// 演奏番号表示を更新 //
		default:
			// 演奏番号
			__setNumFnt( musNo, ID_PANEL[ID_PMUSNO1], ID_PANEL[ID_PMUSNO2], PT_NON+PT_BIG, 1 );
			// 全曲番号
			__setNumFnt( endtrack, ID_PANEL[ID_PMUSMAX1], ID_PANEL[ID_PMUSMAX2], PT_NON, 1 );
			break;
	}
	return NOERR;
}

/*===================================================================*/
/*  アイコン上の表示更新                                             */
/*===================================================================*/
int		update_ICON( int force )
{
	static int	animNo = PT_ANIM_MIN;
	static int	oldNo = -9;
	int			musNo;
	register int	foo,bar;

	// もし強制書換えでなければアニメーション
	if ( force==0 && oldNo>0 ){
		MMI_SendMessage( ID_ICON[ID_ANIM], MM_SETSHAPE, 1, animNo);
		MMI_SendMessage( ID_ICON[ID_ANIM], MM_SHOW, 0 );
		animNo++;
		if ( animNo>PT_ANIM_MAX){
			animNo = PT_ANIM_MIN;
		}
	}
	/* 停止中 で、forth==0 なら終了 */
	if ( (oldNo<1) && (force==0) ){
		return NOERR;
	}
	// 
	musNo = getPlayStatus();
	
	// 曲番号の方は不要な書換えをしない
	if ( (oldNo == musNo) && (force==0) ){
		return NOERR;
	}
	oldNo = musNo;
	
	switch( musNo ){
		// もしエラーなら
		case -1:
			/* 演奏番号表示を"Er"に */
			MMI_SendMessage( ID_ICON[ID_MUSNO1], MM_SETSHAPE, 1, PT_E);
			MMI_SendMessage( ID_ICON[ID_MUSNO2], MM_SETSHAPE, 1, PT_r);
			// CDアニメーション停止
			MMI_SendMessage( ID_ICON[ID_ANIM], MM_SETSHAPE, 1, PT_ANIM_NON);
			MMI_SendMessage( ID_ICON[ID_ANIM], MM_SHOW, 0 );
			break;
		// もし停止中なら
		case 0:
			/* 演奏番号表示を"--"に */
			MMI_SendMessage( ID_ICON[ID_MUSNO1], MM_SETSHAPE, 1, PT_HFN);
			MMI_SendMessage( ID_ICON[ID_MUSNO2], MM_SETSHAPE, 1, PT_HFN);
			break;
		// 演奏番号表示を更新 //
		default:
			if ( (musNo>99)|| (musNo<1) ){
				musNo=99;
			}
			foo = musNo / 10;
			if (foo > 0){
				foo+=PT_NUM;
			} else {
				foo =PT_NON;	// 上位桁が0なら何も表示しないように
			}
			bar = (musNo % 10) + PT_NUM;
			MMI_SendMessage( ID_ICON[ID_MUSNO1], MM_SETSHAPE, 1, foo);
			MMI_SendMessage( ID_ICON[ID_MUSNO2], MM_SETSHAPE, 1, bar);
			break;
	}
	MMI_SendMessage( ID_ICON[ID_MUSNO1], MM_SHOW, 0 );
	MMI_SendMessage( ID_ICON[ID_MUSNO2], MM_SHOW, 0 );

	return NOERR;
}

/*===================================================================*/
/*  ＣＤ表示更新(上位関数)                                           */
/*===================================================================*/
int		updateCDdisp( force )
{
	static int	btime = 0;
	register int	ntime;

	ntime = MOS_getTime();
	/* 前回から600ms未満で、かつ強制表示でなければ終了 */
	if ( (abs(ntime - btime) < 30) && (force == 0) ){
		return NOERR;
	}
	btime = ntime;
	/* 演奏状態を取得し番号表示を更新 */
	if ( dispMode == DISPMODE_ICON ){
		update_ICON( force );
	} else {
		update_PANEL( force );
	}
	return NOERR;
}

/*===================================================================*/
/*  終了(パネル上のボタン関数)                                       */
/*===================================================================*/
int		func_Quit()
{
	extern void SaveResumeFile();

	/* リジューム */
	SaveResumeFile();

	MMI_SetHaltFlag( TRUE ) ;	/*	イベントループを終了させるフラグ	*/

	return NOERR ;
}

/*===================================================================*/
/*  パネルを開く                                                     */
/*===================================================================*/
int	func_Panel()
{
	char		cl[EINCLIPSIZE];

	// 既にパネルが表示されているなら何もしない
	if ( dispMode==DISPMODE_PANEL){
		return NOERR;
	}
	dispMode=DISPMODE_PANEL;
	//	ICONウィンドゥをDETACHする
	MMI_SendMessage( ID_ICON[0], MM_SLEEP, 0 );
	MMI_SendMessage( ID_ICON[0], MM_ERASE, 0 );
	MMI_SendMessage( ID_ICON[0], MM_DETACH, 0 );

	//	パネルをATTACHする
	MMI_SendMessage( ID_PANEL[0], MM_ATTACH, 1, MMI_GetBaseObj() ) ;
	EIN_clipOpen( cl );
	MMI_SendMessage( ID_PANEL[0], MM_SHOW, 0 ) ;
	MMI_SendMessage( ID_PANEL[0], MM_WAKE, 0 ) ;
	EIN_clipClose( cl );

	//	CD表示を更新
	updateCDdisp( 1 );

	return NOERR;
}

/*===================================================================*/
/*  パネルを閉じる                                                   */
/*===================================================================*/
int	func_Close()
{
	char		cl[EINCLIPSIZE];

	// パネルが表示されていないなら何もしない
	if ( dispMode!=DISPMODE_PANEL){
		return ERROR;
	}
	dispMode=DISPMODE_ICON;
	//	PANELウィンドゥをDETACHする
	MMI_SendMessage( ID_PANEL[0], MM_SLEEP, 0 );
	MMI_SendMessage( ID_PANEL[0], MM_ERASE, 0 );
	MMI_SendMessage( ID_PANEL[0], MM_DETACH, 0 );

	//	ICONをATTACHする
	MMI_SendMessage( ID_ICON[0], MM_ATTACH, 1, MMI_GetBaseObj() ) ;
	EIN_clipOpen( cl );
	MMI_SendMessage( ID_ICON[0], MM_SHOW, 0 ) ;
	MMI_SendMessage( ID_ICON[0], MM_WAKE, 0 ) ;
	EIN_clipClose( cl );

	//	CD表示を更新
	updateCDdisp( 1 );

	return NOERR;
}

/*===================================================================*/
/*  アイコン関数                                                     */
/*===================================================================*/
int		func_ICON( int kobj, int messId, int ac, EVENT *pev, int trigger )
{
	HYPER	hyp;
	FRAME	fr;

	if( pev->what == EVMOSDN ){
		// 枠座標を得る
		MMI_SendMessage( kobj, MM_GETHYPER, 1, &hyp ) ;
		fr = hyp.fr;
		do {
			MMI_iosense();
		} while( (MMI_GetEvnt((EVMOSUP|EVMOSDRAG), &pev)) < NOERR);
		if ( pev->what == EVMOSUP ){
			if ( MMI_DoubleClickCheck(&fr, pev) != FALSE ){
				return func_Panel();
			}
			return NOERR;
		}
	}
	// エラーで抜けるとWINDOW部品本来の動作をするのだ
	return ERROR;
}

