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

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

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

static void prsep(int ex,_MENU_DATA *md,MCOLORS *col)
{
int x;
	EX_COLOR(col->sep);
	x=EX_PRINT2(8,md->sep)>>XYSFT; /* x=表示後のＸ座標 */
	
	/* 空き領域："<"の真後ろからに描く */
	EX_COLOR(col->non_sep);
	while (x<ex) x=EX_PUTC2(8,' ')>>XYSFT;
}

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

int cgetline(gdt,x,y,line,pline,enter,md,col,wget,rcode)
_GETLNDT *gdt;
int *x,*y,rcode[MRCODE];
unchar *line,*pline,*enter,*(*wget);
_MENU_DATA *md;
MCOLORS *col;
{
int sx,sy,ex,ey,ret,rkey;
int lx,ly,cur,c;
int i,len,wy,asx,asy,mode;
	cur=curon();
	cursor(&lx,&ly);
	c=EX_COLOR(-1);
	
	sx=*x;
	sy=*y;
	
	/* モード指定 */
	mode=md->auto_ret; /* パスワード入力モード他 */
	
	i=md->lcol+klen2(md->sep)+md->rcol; /* 左右空き桁＋"<" */
	if (md->wx==0) { /* 幅指定なし＝１行 */
		mode|=BIT3; /* ↑↓＝ヒストリー */
		wy=1;
		i+=gdt->lmax;
	} else { /* 幅指定有り＝複数行の可能性有り */
		if (md->wx==1) md->wx=2;
		/* 自動改行分を考慮した行数 */
		wy=((gdt->lmax+(gdt->lmax/md->wx))+md->wx-1)/md->wx;
		i+=md->wx;
	}
	
	/* 枠座標算出 */
	/* 入力したものの表示長さは1/2,1/4角文字を使うと入力長さに満たない場合がある */
	/* 逆にコントロール文字を使うと入力長さ以上になる場合がある */
	/* ここではコントロール文字の入力をさせないので後者は無い */
	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;
	}
	
	asx=sx+1+md->lcol;
	asy=sy+1+md->aline;
	ex=sx+i-1; /* 座標は-1の位置 */
	ey=asy+wy+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;
		}
		
		/* ポップアップ */
		if (md->popup) popup3s(sx,sy,ex,ey,col->waku,md->pwait,md->udmode);
		
		/* 枠描画 */
		make_waku(sx,sy,ex,ey,md,col);
		
		if (md->wx==0) { /* １行幅指定なし＝１行のみ */
			B_LOCATE(asx+gdt->lmax,asy);
			prsep(ex,md,col);
		} else { /* １行幅指定有り */
			for (i=0;i<wy-1;i++) {
				B_LOCATE(asx+md->wx,asy+i);
				prsep(ex,md,col);
			}
			B_LOCATE(asx+(gdt->lmax+gdt->lmax/md->wx)-md->wx*(wy-1),asy+wy-1);
			prsep(ex,md,col);
		}
		
		kflush();
	}
	
	/* モード受け渡し */
	mode&=~BIT2; /* コントロールコード入力不可 */
	if (md->key0) { /* 先行入力後カーソル位置 */
		mode|=BIT1;
		/* 先行入力するかどうかはplineの有無で決まる */
	}
	
	while (1) {
		B_LOCATE(asx,asy);
		EX_COLOR(col->menues); /* 入力文字色 */
		ret=getline(gdt,line,md->wx,mode,pline,enter,CheckMESXY()? SKtou:0,&rkey);
		if (ret<0) goto GEND; /* error */
		if (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); /* 先行入力後行末へ */
	}
	
	if (md->popdown) { /* menu close */
		if (!(md->popdown==1 && ret!=0)) {
			/* ESC onlyのときにESCでなかった場合を除く */
			popdown3s(sx,sy,ex,ey,col->waku,md->pwait,md->udmode);
			/* under window put */
			puttext(sx,sy,*wget);
		}
	}
    GEND:
	*x=sx;
	*y=sy;
	MRKy=rkey; /* ret key code */
	MEx=ex;
	MEy=ey;
    GEND2:
	B_LOCATE(lx,ly);
	EX_COLOR(c);
	curmode(cur);
	return(ret);
}

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