/* メニューによってドライブ変更をする */
/* 仮想ドライブ対応 */

#include <iocslib.h>
#include <doslibm.h>
#include "defines.h"
#include "menu.h"
#include "skey.h"

int DriveChange(int *x,int *y,MCOLORS *col)
/* ドライブ変更 */
{
int i,j,d,drv1,drv2=0;
int sp,wsp,llt,clm,kexit[2],msatr[DRIVES+1],rcode[MRCODE];
unchar *ms[DRIVES+1],dname[MAXPATH],*wget; /* +1=title */
unchar mss[DRIVES+1][MAXDRIVE+2]; /* +2='>'+'*' */
static unchar drv[MAXDRIVE]={'@',':',0};
_MENU_DATA mdata;
#define KS	'*'	/* 仮想ドライブシンボル */
	/* set address & drive name */
	ms[0]="ドライブ";
	drv1=CURDRV()+1; /* カレントドライブ番号：A:=1,B:=2... */
	for (i=0;i<DRIVES;i++) {
		drv[0]='A'+i; /* ドライブ名作成 */
		d=GETASSIGN(drv,dname);
		if (d!=0) {
			/* つながっているドライブのみ */
			/* 仮想ドライブも入れる */
			msatr[++drv2]=drv[0];
			j=0;
			if (i+1==drv1) mss[drv2][j++]='>'; /* カレント */
			if (d==0x50||d==0x60) mss[drv2][j++]=KS; /* 仮想 */
			mss[drv2][j++]=drv[0];
			mss[drv2][j++]=':';
			mss[drv2][j]=0;
			ms[drv2]=&mss[drv2][0];
		}
	}
	
	set_dmenu_data(&mdata);
	mdata.direct=2; /* direct key jump & [RET] */
	mdata.aline=mdata.bline=0;
	mdata.cwaku=1;
	mdata.exits=1;
	kexit[0]=SKspc; /* [SPACE]=[RET] */
	mdata.exit=kexit;
	
	clm=3;
	wsp=0;
	llt=-1; /* spからllt,wsp自動設定 mode */
	sp=drv1;
	do {
		i=wmenu(x,y,sp,&wsp,&llt,4,drv2,&clm
				,ms,msatr,&mdata,col,&wget,rcode);
		if (i<0) i=-i; /* [SPACE]=[RET] */
		if (i==drv1) { /* current : Can't select */
			sp=MSp;
			mdata.remake=1;
			mdata.mouse=2;
			beep();
		}
	} while (i==drv1); /* カレントは選択できない */
	puttext(*x,*y,wget);
	free(wget);
	if (i>0) { /* 実ドライブ変更 */
		d=mss[i][0];
		if (d==KS) d=mss[i][1];
		CHGDRV(d-'A');
	}
	return(i);
}
