#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>
#include <eintm.h>	// EIN(TM)関連ライブラリのヘッダ
#include "music.h"

extern int musicLot ;

int	mainPanelId = -1 ;
int	fileNameMesId = -1 ;
int	fileNameBtnId = -1 ;
int	fmbNameMesId = -1 ;
int	fmbNameBtnId = -1 ;
int	pmbNameMesId = -1 ;
int	pmbNameBtnId = -1 ;
int	titleMesId = -1 ;
int	exitBtnId = -1 ;
int	helpBtnId = -1 ;
int	iconicBtnId = -1 ;
int	playBtnId = -1 ;
int	fastBtnId = -1 ;
int	loopModeBtnId = -1 ;
int	panelStatusMesId = -1 ;
int	panelMeasMesId = -1 ;
int	tempoMesId = -1 ;
int	autoIconicBtnId = -1 ;

extern char fdgSavePath[2][MP_PATHLEN] ;

int selectOpen(int type , char *title, char **ExtStr){

	unsigned int	InfSw ;		//	表示属性
	unsigned int	MSlctCnt ;	//	選択されたファイル数
	int				Atr ;		//	ファイル属性 (未使用)
	int				ret ;		//	戻り値保存用変数
	char path[MP_PATHLEN] ;

	//	サブディレクトリは選択できない(FDG_FILEONLY)
	//	ファイルが選択されない時実行ボタンを押せない(FDG_SLCTCHK)
	//	ファイルダイアログ表示時に画面退避を行わない(FDG_REDRAW)
	InfSw = FDG_FILEONLY | FDG_SLCTCHK | FDG_REDRAW | FDG_ALERT ;

	FDG_SaveCurDir() ;

	//	ファイルセレクタのタイトルを設定する
	//	タイトルを「音楽読込」にする
	FDG_SetTitle(title, "読 込", "取 消") ;

	//	ファイルセレクタの表示
	ret = FDG_DspFileDlg(MMI_GetBaseObj(), InfSw, fdgSavePath[type], ExtStr, &MSlctCnt) ;
	if (ret < 0)
		ret = FDG_DspFileDlg(MMI_GetBaseObj(), InfSw, NULL, ExtStr, &MSlctCnt) ;

	//	FDG_DspFileDlg関数の戻り値retは、0 = 取消 / 0以外 = 実行の意味
	//	でしかないため、選択されたファイルの個数MSlctCntも参照する
	//	１個も選択されずに実行ボタンを押される可能性があるためである
	if (ret && MSlctCnt > 0){
		//	"読込"が押され、なおかつファイルが選択されていた
		//	ならば、ファイル名を取得する
		FDG_GetPathName(path, &Atr, 0) ;
		EIN_fnameDirectory(path, fdgSavePath[type]) ;
		if (fdgSavePath[type][strlen(fdgSavePath[type])-1] == '\\' &&
				fdgSavePath[type][strlen(fdgSavePath[type])-2] != ':')
			fdgSavePath[type][strlen(fdgSavePath[type])-1] = '\0' ;

		musLoad(path) ;

	}else{
		//	"取消"が押されたか１つもファイルが選択されなかった場合は	//
		//	ファイル名を取得しないで終了する							//
		ret = 0 ;
	}

	FDG_RecovCurDir() ;

	//	return ret ;
	return NOERR ;
}
// ここからＧＵＩツール生成関数

/*	initDataMP_PANEL:fileNameBtnId:MJ_BUTTONL40の呼び出し関数	*/
int	loadFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	extern int tmmMode ;
	static	char	*ExtStr[] = { "*.EUP",NULL, NULL } ;
	if (tmmMode == TMM_UNAVAILABLE)
		ExtStr[1] = NULL ;
	else
		ExtStr[1] = "*.MID" ;
								//	ワイルドカードの指定
								//	FDG_DspFileDlg関数に渡すﾜｲﾙﾄﾞｶｰﾄﾞ
								//	の指定は必ずstatic変数で行うこと
	return selectOpen(0, "音楽読込", ExtStr) ;
}

/*	initDataMP_PANEL:fmbNameBtnId:MJ_BUTTONL40の呼び出し関数	*/
int	fmbLoadFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	static	char	*ExtStr[] = { "*.FMB", NULL } ;
	//	タイトルを「ＦＭ音色読込」にする
	return selectOpen(1, "ＦＭ音色読込", ExtStr) ;
}

/*	initDataMP_PANEL:pmbNameBtnId:MJ_BUTTONL40の呼び出し関数	*/
int	pmbLoadFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	static	char	*ExtStr[] = { "*.PMB", NULL } ;
	return selectOpen(1, "ＰＣＭ音色読込", ExtStr) ;
}

/*	initDataMP_PANEL:exitBtnId:MJ_ICONL40の呼び出し関数	*/
int	exitFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	extern int saveResumeFile(void) ;
	extern int exitFuncRet ;
	extern int helpPanelId ;
	extern int helpPage ;
	extern int mainIconId ;
	/* 終了する(暫定版) */
	// 演奏を停止する
	musPlayStop() ;
	//	メモリーを開放する
	if ((mplayStatus & MPLAY_LOAD) != 0){
		mplayStatus &= (~MPLAY_LOAD) ;
		TL_freeLot(musicLot) ;
	}
	//	HELPウィンドゥをDETACHする
	helpPage = -1 ;
	MMI_SendMessage(helpPanelId, MM_SLEEP, 0) ;
	MMI_SendMessage(helpPanelId, MM_ERASE, 0) ;
	MMI_SendMessage(helpPanelId, MM_DETACH, 0) ;
	//	PANELウィンドゥをDETACHする
	MMI_SendMessage(mainPanelId, MM_SLEEP, 0) ;
	MMI_SendMessage(mainPanelId, MM_ERASE, 0) ;
	MMI_SendMessage(mainPanelId, MM_DETACH, 0) ;
	//	ICONウィンドゥをDETACHする
	MMI_SendMessage(mainIconId, MM_SLEEP, 0) ;
	MMI_SendMessage(mainIconId, MM_ERASE, 0) ;
	MMI_SendMessage(mainIconId, MM_DETACH, 0) ;
	saveResumeFile() ;// EIN(TM)リジュームファイル書き込み
	MMI_SetHaltFlag(TRUE) ;
	exitFuncRet = NOERR ;
	return NOERR ;
}

/*	initDataMP_PANEL:helpBtnId:MJ_ICONL40の呼び出し関数	*/
int	helpFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	extern int setHelpPage(int) ; 
	extern int helpPanelId ;
	extern int helpPage ;

	if (helpPage != -1) {
		MMI_SendMessage(helpPanelId, MM_WAKE, 0) ;
		return NOERR ;
	}
	return setHelpPage(0);
}

int iconic(void){
	char cl[EINCLIPSIZE] ;
	extern int mainIconId ;

	// パネルが表示されていないなら何もしない
	if (dispMode != DISPMODE_PANEL){
		return ILLEGAL_FUNCTION ;
	}
	dispMode = DISPMODE_ICON ;

	//	パネルをDETACHする
	MMI_SendMessage(mainPanelId, MM_SLEEP, 0) ;
	MMI_SendMessage(mainPanelId, MM_ERASE, 0) ;
	MMI_SendMessage(mainPanelId, MM_DETACH, 0) ;

	//	アイコンをATTACHする
	MMI_SendMessage(mainIconId, MM_ATTACH, 1, MMI_GetBaseObj()) ;

	EIN_clipOpen(cl) ;
	MMI_SendMessage(mainIconId, MM_SHOW, 0) ;
	MMI_SendMessage(mainIconId, MM_WAKE, 0) ;

	extern int helpPage ;
	extern int helpPanelId ;
	if (helpPage != -1) updateObj(helpPanelId) ;

	EIN_clipClose(cl) ;
	return NOERR;
}

/*	initDataMP_PANEL:iconicBtnId:MJ_ICONL40の呼び出し関数	*/
int	iconicFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	return iconic() ;
}

/*	initDataMP_PANEL:playBtnId:MJ_ICONL40の呼び出し関数	*/
int	playFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	if (musPlayPause() == NOERR) return NOERR ;
	if ((mplayStatus & MPLAY_LOAD) == 0)
		MMI_SendMessage(fileNameBtnId, MM_EXEC, 0) ;
	return musPlayStart() ;
}

/*	initDataMP_PANEL:NULL:MJ_ICONL40の呼び出し関数	*/
int	stopFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	return musPlayStop() ;
}

/*	initDataMP_PANEL:fastBtnId:MJ_ICONL40の呼び出し関数	*/
int	fastFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	if (pev->what == EVMOSDN) return musPlayFastSpeed() ;
	if (pev->what == EVMOSUP) return musPlayNormalSpeed() ;
	if (pev->what != EVMOSDRAG) return NOERR;
	if (MMI_CheckInside(kobj, (POINT *)&(pev->info)) < NOERR)
		return musPlayNormalSpeed() ;
	return musPlayFastSpeed() ;
}

/*	initDataMP_PANEL:loopModeBtnId:MJ_TICONL40の呼び出し関数	*/
int	loopModeFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	extern int loopMode ;
	loopMode ^= 1 ;
	return musLoopMode(loopMode) ;
}

/*	initDataMP_PANEL:autoIconicBtnId:MJ_TICONL40の呼び出し関数	*/
int	autoIconicBtnFunc(kobj, messId, argc, pev, trigger)
int		kobj ;
int		messId ;
int		argc ;
EVENT	*pev ;
int		trigger ;
{
	autoIconicMode ^= 1 ;

	if (autoIconicMode == 0)
		MMI_SendMessage(autoIconicBtnId, MM_SETSHAPE, 1, 528);
	else
		MMI_SendMessage(autoIconicBtnId, MM_SETSHAPE, 1, 529);

	updateObj(autoIconicBtnId) ;

	return NOERR ;
}
