/*****************************************************************************/
/* 枠付きミニ１行入力ルーチン						     */
/*****************************************************************************/

#include <stdio.h>
#include "defines.h"
#include "menu.h"
#include "getline.h"
#include "ascreen.h"
#include "amacro.h"
#include "skey.h"

int cmgetline(x,y,line,pline,enter,md,col,wget,rcode,getchs)
int *x,*y,rcode[MRCODE],(*getchs)();
unchar *line,*pline,*enter,*(*wget);
_MENU_DATA *md;
MCOLORS *col;
{
int sx,sy,ex,ey,ret,rkey;
int lx,ly,cur,c;
int i,asx,asy,mode;
	cur=curon();
	cursor(&lx,&ly);
	c=B_COLOR(-1);
	
	sx=*x; sy=*y;
	
	/* 枠座標算出 */
	i=md->lcol+md->wx+klen2(md->sep)+md->rcol; /* 入力桁+左右空き桁+"<" */
	ret=klen2(md->title); if (ret>i) i=ret;
	ret=klen2(md->tale);  if (ret>i) i=ret;
	i+=2; /* +枠幅 */
	if (i>=TWIDTH(&ey)) { /* length over */
		ret=-10011;
		goto GEND2;
	}
	
	ex=sx+i-1; /* 座標は-1の位置 */
	asx=sx+md->lcol+1;
	asy=sy+md->aline+1;
	ey=asy+1+md->bline+1-1; /* 座標は-1の位置 */
	
	if (md->remake==0) {
		/* ウインドウ用ワークエリア確保 */
		*wget=gettext2(sx,sy,ex,ey);
		if (*wget==NULL) { /* memory can't get */
			ret=-10003;
			goto GEND2;
		}
		
		/* 枠描画 */
		make_waku(sx,sy,ex,ey,md,col);
		
		/* End of Line 表示 */
		B_COLOR(col->sep);
		B_LOCATE(asx+md->wx,asy);
		i=B_PRINT(md->sep)>>16; /* i=表示後のＸ座標 */
		
		/* 空き領域："<"の真後ろからに描く */
		B_COLOR(col->non_sep);
		while (i<ex) i=B_PUTC(' ')>>16;
	}
	
	/* モード受け渡し */
	mode=md->auto_ret; /* パスワード入力モード他 */
	mode&=~BIT2; /* コントロールコード入力不可 */
	/* 先行入力後カーソル位置：先行入力するかどうかはplineの有無で決まる */
	if (md->key0) mode|=BIT1;
	
	while (1) {
		B_LOCATE(asx,asy);
		B_COLOR(col->menues); /* 入力文字色 */
		
		ret=mini_getline(line,md->wx,mode,pline,enter
					,CheckMESXY()? SKtou:0,&rkey,getchs);
		if (ret<0||rkey!=SKtou) break;
		
		/* 移動 */
		asx-=sx; asy-=sy; /* for cursor move */
		move_area(&sx,&sy,&ex,&ey,wget,md->mouse
			,md->startx,md->starty,md->endx,md->endy);
		asx+=sx; asy+=sy; /* for cursor move */
		
		/* 先行入力で前の入力を入れる */
		pline=line; /* 先行入力で前の入力を入れる */
		mode&=(~BIT1); /* 先行入力後行末へ */
	}
	*x=sx; *y=sy;
	MRKy=rkey; /* ret key code */
	MEx=ex;
	MEy=ey;
    GEND2:
	B_LOCATE(lx,ly);
	B_COLOR(c);
	curmode(cur);
	return(ret);
}

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