/*****************************************************************************/
/* メニューによるファイル選択：項目はMFileSet()で作成すること */
/*****************************************************************************/

#include "defines.h"
#include "menu.h"
#include "skey.h"

/*****************************************************************************/

/* 色情報構造体 */
struct COLORS
col1 = { /* メインメニュー */
	 TYELLOW,TYELLOW,TYELLOW|HLIGHT	,TBLACK
	,TCYAN	,TCYAN	,TCYAN
	,TCYAN|REVERSE,TCYAN|REVERSE,TCYAN|REVERSE
	,0	,0	,0
	,0	,0	,0
	,TCYAN|REVERSE,TCYAN|REVERSE,TCYAN|REVERSE
	,TYELLOW|REVERSE,TYELLOW|REVERSE,TYELLOW|REVERSE
	,0	,0	,0
	,0	,0	,0
	,0	,0	,0
	,TYELLOW	,0
},
col2 = { /* DRIVEメニュー */
	 TCYAN	,TCYAN	,TCYAN|HLIGHT	,TBLACK
	,TYELLOW	,TYELLOW	,TYELLOW
	,TYELLOW|REVERSE,TYELLOW|REVERSE,TYELLOW|REVERSE
	,0	,0	,0
	,0	,0	,0
	,TYELLOW|REVERSE,TYELLOW|REVERSE,TYELLOW|REVERSE
	,0	,0	,0
	,0	,0	,0
	,0	,0	,0
	,0	,0	,0
	,TCYAN	,0
},
gcol = { /* １行入力 */
	 TCYAN	,TCYAN	,0	,TWHITE
	,0	,TYELLOW,TWHITE
	,0	,0	,0
	,0	,TYELLOW,0
	,0	,0	,0
	,0	,0	,0
	,0	,0	,0
	,0	,0	,0
	,0	,0	,0
	,0	,0	,0
	,TCYAN	,0
};

/*****************************************************************************/

int MSelecter(xx,yy,ms,msatr,tale,no,page,wild)
/* return : >0=file No. , 0=end , -1=dir change , -2=BACK , -3=NEXT */
/* 	    -4=wildcard ,-5=drive */
int xx[],yy[],msatr[],no,page;
unchar *ms[],*tale,wild[];
{
int ret,f,sp,llt,wsp,clm,rcode[MRCODE],kexit[20];
unchar *wget,dir[MAXDIR+1],wild0[MAXFILEEXT];
_MENU_DATA mdata;
#define WMY	10	/* メニュー縦幅 */
	/* select point reset */
	sp=1;
	llt=wsp=0;
	clm=3;
	
	set_dmenu_data(&mdata);
	ms[0]=mdata.title="[ファイル選択]";
	mdata.tale=tale;
	mdata.md_spcol=1;
	mdata.direct=2;		/* ダイレクトセレクト&リターン */
	mdata.wx=(8+3+1)*clm;	/* 最低限のメニュー幅 */
	mdata.wy=WMY-1;
	f=0;
	kexit[f++]=SKspc;	/* [SPACE]=[RET] */
	kexit[f++]=SKd|'D';	/* D=ドライブ選択 */
	kexit[f++]=SKl|'L';	/* L=ドライブ選択 */
	kexit[f++]=SKf1;	/* = F1 */
	kexit[f++]=SKw|'W';	/* W=ワイルドカード選択 */
	kexit[f++]=SKy|'Y';	/* Y=ワイルドカード選択 */
	kexit[f++]=SKf2;	/* = F2 */
	kexit[f++]=SKf10;	/* ESC = F10 */
	kexit[f++]=SKbs;	/* [BS]=UpDir */
	mdata.exits=f;
	mdata.exit=kexit;
	
	f=0;
	do {
		ret=wmenu(&xx[0],&yy[0],sp,&wsp,&llt,WMY-1,no,&clm
				,ms,msatr,&mdata,&col1,&wget,rcode);
		
		if (ret==0) { /* ESC=終了 */
			f=0;
			break;
		}
		
		sp=MSp;
		mdata.remake=1;
		mdata.mouse=2;
		
		if (ret<0) {
			switch (MRKy&0xff00) {
			    case SKbs: /* BS = UpDir */
				if (chdir("..")<0) continue;
				f=-1;
				goto END;
			
			    case SKf10: /* F10 = ESC */
				f=0;
				goto END;
			
			    case SKw:
			    case SKf2: /* ワイルドカード変更 */
				strcpy(wild0,wild);
				if (WildChange(&xx[2],&yy[2],&gcol,wild)==0) {
					/* 変化がない時はそのまま */
					if (strcmpi(wild0,wild)==0) continue;
					f=-4;
					goto END;
				}
				continue;
			
			    case SKd:
			    case SKl:
			    case SKf1: /* ドライブ変更 */
				ret=DriveChange(&xx[1],&yy[1],&col2);
				if (ret>0) {
					f=-5;
					goto END;
				}
				continue;
			}
			ret=-ret; /* [SPACE]=[RET] */
		}
		
		switch (msatr[ret]&0xff) { /* 選択したものの種類別 */
			case 0:	/* file */
				f=ret;
				break;
			case 'I': /* ﾃﾞｨﾚｸﾄﾘ移動 */
				/* directory名の前後の'['']'を消す */
				strcpy(dir,&ms[ret][1]);
				dir[strlen(dir)-1]=0;
				cut_c(dir,' '); /* 右寄せのスペースを消す */
				chdir(dir);
				f=-1;
				break;
			case 'B': /* BACK */
				f=-2;
				break;
			case 'N': /* NEXT */
				f=-3;
				break;
			case 'X': /* No File */
				beep();
				break;
		}
	} while (!f);
    END:;
	puttext(xx[0],yy[0],wget);
	free(wget);
	return(f);
}

/*****************************************************************************/
